SimilaritySearchKit Documentation

repository·main·Indexed 19 days ago

https://github.com/zachnagengast/similarity-search-kit

A Swift package for on-device text embeddings and semantic search on iOS and macOS. It enables the creation of privacy-focused, offline search and question-answering applications using NLP models such as Distilbert and MiniLM. The kit includes a SimilarityIndex for indexing and querying content, multiple distance metrics like CosineSimilarity and EuclideanDistance, and extensible protocols for custom embeddings, tokenization, and vector storage.

Tokens
1.2K
Snippets
2
Records
5
Agent score
18%

What's inside SimilaritySearchKit

  1. Perform semantic search with SimilarityIndex

    main

    To perform semantic search, follow these steps:

    1. Import SimilaritySearchKit.
    2. Initialize a SimilarityIndex with an embedding model (conforming to EmbeddingProtocol) and a distance metric (conforming to DistanceMetricProtocol).
    3. Use addItem(id:text:metadata:) to index your content.
    4. Use search(_:) to query the index. It returns an array of SearchResult objects containing the item id, a similarity score, and the original metadata.
    import SimilaritySearchKit
    
    // 1. Initialize
    let similarityIndex = await SimilarityIndex(
        model: NativeEmbeddings(),
        metric: CosineSimilarity()
    )
    
    // 2. Add items
    await similarityIndex.addItem(
        id: "id1", 
        text: "Metal was released in June 2014.", 
        metadata: ["source": "example.pdf"]
    )
    
    // 3. Search
    let results = await similarityIndex.search("When was metal released?")
    print(results)
    // Output: [SearchResult(id: "id1", score: 0.86216, metadata: ["source": "example.pdf"])]
  2. Install SimilaritySearchKit via Swift Package Manager

    main

    You can install SimilaritySearchKit using the Xcode GUI or by modifying your Package.swift file.

    Xcode Method:

    1. Go to FileAdd Packages...
    2. Enter the URL: https://github.com/ZachNagengast/similarity-search-kit.git
    3. Choose the specific model dependency you wish to include (e.g., SimilaritySearchKitDistilbert).

    Package.swift Method: Add the package to your dependencies and then add the specific model targets to your target dependencies. To reduce binary size, only include the models you actually need.

    // In dependencies array
    .package(url: "https://github.com/ZachNagengast/similarity-search-kit.git", from: "0.0.1")
    
    // In target dependencies
    .target(name: "YourTarget", dependencies: [
        "SimilaritySearchKit", 
        "SimilaritySearchKitDistilbert", 
        "SimilaritySearchKitMiniLMMultiQA", 
        "SimilaritySearchKitMiniLMAll"
    ])
  3. Extend SimilaritySearchKit with custom protocols

    main

    You can override the core components of SimilarityIndex by providing your own implementations of the following protocols:

    • EmbeddingsProtocol: Convert a string into a [Float] embedding.
      • func encode(sentence: String) async -> [Float]?
    • DistanceMetricProtocol: Calculate nearest neighbors.
      • func findNearest(for queryEmbedding: [Float], in neighborEmbeddings: [[Float]], resultsCount: Int) -> [(Float, Int)]
    • TextSplitterProtocol: Chunk long documents.
      • func split(text: String, chunkSize: Int, overlapSize: Int) -> ([String], [[String]]?)
    • TokenizerProtocol: Handle custom tokenization.
      • func tokenize(text: String) -> [String]
      • func detokenize(tokens: [String]) -> String
    • VectorStoreProtocol: Manage persistence (default is JSON).
      • func saveIndex(items: [IndexItem], to url: URL, as name: String) throws -> URL
      • func loadIndex(from url: URL) throws -> [IndexItem]
      • func listIndexes(at url: URL) -> [URL]
  4. Choose a distance metric

    main

    Metrics must conform to DistanceMetricProtocol. They determine how similarity is calculated between vectors:

    MetricDescription
    DotProductMeasures the similarity between two vectors as the product of their magnitudes
    CosineSimilarityCalculates similarity by measuring the cosine of the angle between two vectors
    EuclideanDistanceComputes the straight-line distance between two points in Euclidean space
  5. Choose an embedding model

    main

    Models must conform to EmbeddingProtocol. Choose based on your requirements for accuracy vs. speed:

    ModelUse CaseSizeSource
    NaturalLanguageText similarity, faster inferenceBuilt-inApple
    MiniLMAllText similarity, fastest inference46 MBHuggingFace
    DistilbertQ&A search, highest accuracy86 MB (quantized)HuggingFace
    MiniLMMultiQAQ&A search, fastest inference46 MBHuggingFace