Swift Package Index 的徽标。Swift Package Index

追踪 Swift 6 严格并发检查在数据竞争安全方面的采用情况。有多少软件包准备好支持 Swift 6

当使用 Xcode 项目时

当使用 Swift Package Manager 清单时

选择软件包版本

0.0.15

main


🔎 SimilaritySearchKit 是一个 Swift 软件包,为 iOS 和 macOS 应用程序提供设备上的文本嵌入和语义搜索功能。

Zach Nagengast 欢迎通过 GitHub Sponsors 支持 SimilaritySearchKit。如果您发现此软件包有用,请考虑支持它。




SimilaritySearchKit

License

ssk-logo

SimilaritySearchKit 是一个 Swift 包,只需几行代码即可为 iOS 和 macOS 应用程序启用设备端文本嵌入和语义搜索功能。它强调速度、可扩展性和隐私性,除了无缝集成自带选项外,还支持各种内置的先进 NLP 模型和相似度指标。

Chat With Files Example

使用场景

SimilaritySearchKit 的一些潜在使用场景包括

  • 注重隐私的文档搜索引擎: 创建一个在本地处理敏感文档的搜索引擎,而不会将用户数据暴露给外部服务。(请参阅 示例 目录中的示例项目“ChatWithFilesExample”。)

  • 离线问答系统: 实现一个问答系统,该系统在本地数据集中查找与用户查询最相关的答案。

  • 文档聚类和推荐引擎: 在边缘设备上自动根据文本内容对文档进行分组和组织。

通过利用 SimilaritySearchKit,开发人员可以轻松创建强大的应用程序,将数据保留在本地,而不会在功能或性能上做出重大妥协。

安装

要安装 SimilaritySearchKit,只需使用 Swift Package Manager 将其作为依赖项添加到您的 Swift 项目即可。我个人推荐使用 Xcode 方法,通过

FileAdd Packages...Search or Enter Package Urlhttps://github.com/ZachNagengast/similarity-search-kit.git

Xcode 应该会为您提供以下选项来选择您想要添加的模型(请参阅下面的 可用模型 以获得帮助)

Xcode Swift Package Manager Import

如果您想通过 Package.swift 添加它,请将以下行添加到您的 dependencies 数组

.package(url: "https://github.com/ZachNagengast/similarity-search-kit.git", from: "0.0.1")

然后,将适当的目标依赖项添加到所需的目标

.target(name: "YourTarget", dependencies: [
    "SimilaritySearchKit", 
    "SimilaritySearchKitDistilbert", 
    "SimilaritySearchKitMiniLMMultiQA", 
    "SimilaritySearchKitMiniLMAll"
])

如果您只想使用可用模型的一个子集,您可以省略相应的依赖项。这将减少最终二进制文件的大小。

用法

要在您的项目中使用 SimilaritySearchKit,首先导入框架

import SimilaritySearchKit

接下来,使用您想要的距离度量和 嵌入模型 创建 SimilarityIndex 的一个实例(请参阅下面的选项)

let similarityIndex = await SimilarityIndex(
    model: NativeEmbeddings(),
    metric: CosineSimilarity()
)

然后,将您想要使其可搜索的文本添加到索引

await similarityIndex.addItem(
    id: "id1", 
    text: "Metal was released in June 2014.", 
    metadata: ["source": "example.pdf"]
)

最后,查询索引以查找与给定查询最相似的项目

let results = await similarityIndex.search("When was metal released?")
print(results)

输出一个 SearchResult 数组:[SearchResult(id: "id1", score: 0.86216, metadata: ["source": "example.pdf"])]

示例

Examples 目录包含多个示例 iOS 和 macOS 应用程序,演示了如何充分利用 SimilaritySearchKit

示例 描述 要求
BasicExample 一个基本的多平台应用程序,用于索引和比较一小组硬编码字符串的相似性。 iOS 16.0+, macOS 13.0+
PDFExample 一个 mac-catalyst 应用程序,可以在单个 PDF 文件的内容上启用语义搜索。 iOS 16.0+
ChatWithFilesExample 一个高级 macOS 应用程序,用于索引您计算机上的任何/所有文本文件。 macOS 13.0+

可用模型

模型 使用场景 大小 来源
NaturalLanguage 文本相似性,更快的推理 内置 Apple
MiniLMAll 文本相似性,最快的推理 46 MB HuggingFace
Distilbert 问答搜索,最高准确度 86 MB (量化) HuggingFace
MiniLMMultiQA 问答搜索,最快的推理 46 MB HuggingFace

模型符合 EmbeddingProtocol,并且可以与 SimilarityIndex 类互换使用。

可以在此存储库的 HuggingFace 上找到一个小的但不断增长的预转换模型列表。如果您希望将某个模型添加到列表中,请打开一个 issue 或提交一个 pull request。

可用指标

指标 描述
DotProduct 衡量两个向量之间的相似性,作为其大小的乘积
CosineSimilarity 通过测量两个向量之间的夹角的余弦来计算相似性
EuclideanDistance 计算欧几里德空间中两点之间的直线距离

指标符合 DistanceMetricProtocol,并且可以与 SimilarityIndex 类互换使用。

自带选项

SimilarityIndex 的所有主要部分都可以使用符合以下协议的自定义实现来覆盖

EmbeddingsProtocol

接受一个字符串并返回一个浮点数数组,表示输入文本的嵌入。

func encode(sentence: String) async -> [Float]?

DistanceMetricProtocol

接受查询嵌入向量和嵌入向量列表,并返回距离度量分数和最近邻居索引的元组。

func findNearest(for queryEmbedding: [Float], in neighborEmbeddings: [[Float]], resultsCount: Int) -> [(Float, Int)]

TextSplitterProtocol

将字符串分割成给定大小的块,并具有给定的重叠。这对于将长文档分割成较小的块以便嵌入非常有用。它返回块的列表和每个块的可选 tokensIds 列表。

func split(text: String, chunkSize: Int, overlapSize: Int) -> ([String], [[String]]?)

TokenizerProtocol

分词和反分词文本。将此用于使用与当前列表中提供的分词器不同的自定义模型。

func tokenize(text: String) -> [String]
func detokenize(tokens: [String]) -> String

VectorStoreProtocol

保存和加载索引项。默认实现使用 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]

致谢

该项目的许多部分都源于现有的代码,要么已经是 swift,要么借助 ChatGPT 翻译成 swift。以下是一些被引用的主要项目

动机

该项目的灵感来自于随着 ChatGPT 的出现,自然语言服务和应用程序的惊人进步。虽然这些服务开启了一个全新的基于文本的强大应用程序世界,但它们通常依赖于云服务。具体来说,许多“与数据聊天”服务需要用户将他们的数据上传到远程服务器进行处理和存储。虽然这适用于某些人,但对于那些处于低连接环境或处理机密或敏感信息的人来说,它可能不是最佳选择。虽然 Apple 确实有捆绑库 NaturalLanguage 用于类似的任务,但 CoreML 模型转换过程开辟了更广泛的模型和用例范围。考虑到这一点,SimilaritySearchKit 旨在提供一个强大的、设备端解决方案,使开发人员能够在 Apple 生态系统中创建最先进的 NLP 应用程序。

未来工作

以下是计划在未来版本中推出的一些功能的简短列表

  • 内存中索引
  • 磁盘支持的索引
    • 对于不适合内存的大型数据集
  • 全面提升性能
  • Swift-DocC 网站
  • HSNW / Annoy 索引选项
  • 查询过滤器
    • 仅返回具有特定元数据的结果
  • 稀疏/密集混合搜索
    • 使用稀疏搜索查找候选结果,然后使用密集搜索重新排序
    • 更多信息 此处
  • 更多嵌入模型
  • 摘要模型
    • 可用于将多个查询结果合并为一个,并清理无关文本
  • Metal 加速距离计算

我很想看看人们如何使用这个库以及哪些其他功能会很有用,所以请随时通过 twitter @ZachNagengast 或电子邮件 znagengast (at) gmail (dot) com 与我联系。