Zach Nagengast 欢迎通过 GitHub Sponsors 支持 SimilaritySearchKit。如果您发现此软件包有用,请考虑支持它。
当使用 Xcode 项目时
当使用 Swift Package Manager 清单时
选择软件包版本
0.0.15
main
🔎 SimilaritySearchKit 是一个 Swift 软件包,为 iOS 和 macOS 应用程序提供设备上的文本嵌入和语义搜索功能。
SimilaritySearchKit 是一个 Swift 包,只需几行代码即可为 iOS 和 macOS 应用程序启用设备端文本嵌入和语义搜索功能。它强调速度、可扩展性和隐私性,除了无缝集成自带选项外,还支持各种内置的先进 NLP 模型和相似度指标。
SimilaritySearchKit 的一些潜在使用场景包括
-
注重隐私的文档搜索引擎: 创建一个在本地处理敏感文档的搜索引擎,而不会将用户数据暴露给外部服务。(请参阅 示例 目录中的示例项目“ChatWithFilesExample”。)
-
离线问答系统: 实现一个问答系统,该系统在本地数据集中查找与用户查询最相关的答案。
-
文档聚类和推荐引擎: 在边缘设备上自动根据文本内容对文档进行分组和组织。
通过利用 SimilaritySearchKit,开发人员可以轻松创建强大的应用程序,将数据保留在本地,而不会在功能或性能上做出重大妥协。
要安装 SimilaritySearchKit,只需使用 Swift Package Manager 将其作为依赖项添加到您的 Swift 项目即可。我个人推荐使用 Xcode 方法,通过
File
→ Add Packages...
→ Search or Enter Package Url
→ https://github.com/ZachNagengast/similarity-search-kit.git
Xcode 应该会为您提供以下选项来选择您想要添加的模型(请参阅下面的 可用模型 以获得帮助)
如果您想通过 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
的所有主要部分都可以使用符合以下协议的自定义实现来覆盖
接受一个字符串并返回一个浮点数数组,表示输入文本的嵌入。
func encode(sentence: String) async -> [Float]?
接受查询嵌入向量和嵌入向量列表,并返回距离度量分数和最近邻居索引的元组。
func findNearest(for queryEmbedding: [Float], in neighborEmbeddings: [[Float]], resultsCount: Int) -> [(Float, Int)]
将字符串分割成给定大小的块,并具有给定的重叠。这对于将长文档分割成较小的块以便嵌入非常有用。它返回块的列表和每个块的可选 tokensIds 列表。
func split(text: String, chunkSize: Int, overlapSize: Int) -> ([String], [[String]]?)
分词和反分词文本。将此用于使用与当前列表中提供的分词器不同的自定义模型。
func tokenize(text: String) -> [String]
func detokenize(tokens: [String]) -> String
保存和加载索引项。默认实现使用 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。以下是一些被引用的主要项目
- HuggingFace Transformers
- Sentence Transformers https://github.com/UKPLab/sentence-transformers
- LangChain https://github.com/hwchase17/langchain
- Chroma https://github.com/chroma-core/chroma
- Pinecone https://github.com/pinecone-io/examples
- OpenAI Plugins https://github.com/openai/chatgpt-retrieval-plugin
该项目的灵感来自于随着 ChatGPT 的出现,自然语言服务和应用程序的惊人进步。虽然这些服务开启了一个全新的基于文本的强大应用程序世界,但它们通常依赖于云服务。具体来说,许多“与数据聊天”服务需要用户将他们的数据上传到远程服务器进行处理和存储。虽然这适用于某些人,但对于那些处于低连接环境或处理机密或敏感信息的人来说,它可能不是最佳选择。虽然 Apple 确实有捆绑库 NaturalLanguage
用于类似的任务,但 CoreML 模型转换过程开辟了更广泛的模型和用例范围。考虑到这一点,SimilaritySearchKit 旨在提供一个强大的、设备端解决方案,使开发人员能够在 Apple 生态系统中创建最先进的 NLP 应用程序。
以下是计划在未来版本中推出的一些功能的简短列表
- 内存中索引
- 磁盘支持的索引
- 对于不适合内存的大型数据集
- 全面提升性能
- Swift-DocC 网站
- HSNW / Annoy 索引选项
- 查询过滤器
- 仅返回具有特定元数据的结果
- 稀疏/密集混合搜索
- 使用稀疏搜索查找候选结果,然后使用密集搜索重新排序
- 更多信息 此处
- 更多嵌入模型
- 摘要模型
- 可用于将多个查询结果合并为一个,并清理无关文本
- Metal 加速距离计算
我很想看看人们如何使用这个库以及哪些其他功能会很有用,所以请随时通过 twitter @ZachNagengast 或电子邮件 znagengast (at) gmail (dot) com 与我联系。