简介
Semantic Search 是一个专为小型至中型项目设计的语义搜索库,它提供嵌入式向量搜索和语义嵌入功能。这个库特别适合那些需要强大语义搜索能力,但不想被传统搜索系统复杂性所困扰的项目。它的核心优势在于简单性,以及对GGUF BERT模型的支持,让你能够利用复杂的嵌入技术,而不需要深入了解传统搜索系统的复杂性。
关键特性
-
llama.cpp 无 cgo 集成:该库与llama.cpp一起工作,无需使用cgo。它依赖于purego,这允许直接从Go代码中调用共享C库,无需cgo。这种设计显著简化了集成、部署和交叉编译,使得构建与原生库接口的Go应用程序更加容易。
-
支持BERT模型:通过llama.cpp,该库支持BERT模型。只要使用的是GGUF格式,就可以使用各种BERT模型。
-
预编译二进制文件与Vulkan GPU支持:在dist目录下为Windows和Linux提供了预编译的二进制文件,这些文件编译时使用了Vulkan以支持GPU加速。当然,你也可以选择自己编译库,无论是否包含GPU支持。
-
嵌入的搜索索引:该库支持从计算出的嵌入创建搜索索引,这些索引可以保存到磁盘并在以后加载。这个功能适合在小规模应用中进行基本的基于向量的搜索,但对于大数据集可能会因为使用暴力搜索技术而面临效率挑战。
限制
-
大数据集:当前实现针对的是小规模应用,超过100,000条目的数据集可能会因为暴力搜索方法而遇到性能瓶颈。对于更大的数据集,应该考虑使用近似最近邻(ANN)算法和专门的数据结构以提高效率。
-
复杂查询需求:该库专注于简单的向量相似性搜索,不支持高级查询能力,如多字段过滤、模糊匹配或类似SQL的操作,这些在更复杂的搜索引擎中很常见。
-
高维复杂嵌入:大型语言模型(LLMs)生成的嵌入不仅高维,而且计算密集。除非有足够的GPU资源并针对低延迟推理进行了优化,否则实时处理这些嵌入可能会对系统造成负担。
如何使用该库
以下示例展示了如何使用该库为文本生成嵌入并执行简单的向量搜索。代码片段展示了如何加载模型、为文本生成嵌入、创建搜索索引以及执行搜索。
-
安装库:在dist目录下为Windows和Linux提供了预编译的二进制文件。如果你的目标架构或平台没有被这些二进制文件覆盖,你需要从源代码编译库。将这些二进制文件放入/usr/lib或等效目录。
-
加载模型:search.NewVectorizer函数使用GGUF文件初始化模型。此示例加载了MiniLM-L6-v2.Q8_0.gguf模型。第二个参数表示要启用的GPU层数(0仅CPU)。
go
m, err := search.NewVectorizer("../dist/MiniLM-L6-v2.Q8_0.gguf", 0) if err != nil { // 处理错误 } defer m.Close()
-
生成文本嵌入:EmbedText方法用于为给定的文本输入生成向量嵌入。这将你的文本转换为模型加载步骤中的密集数值向量表示。
go
embedding, err := m.EmbedText("你的文本在这里")
-
创建索引并添加向量:使用search.NewIndex创建一个新的索引。此示例中的类型参数[string]指定每个向量与一个字符串值关联。你可以添加多个向量及其对应的标签。
go
index := search.NewIndex[string]() index.Add(embedding, "你的文本在这里")
-
搜索索引:使用Search方法执行搜索,它接受一个嵌入向量和一个要检索的结果数量。此示例搜索10个最相关的结果,并打印它们及其相关性分数。
go
results := index.Search(embedding, 10) for _, r := range results { fmt.Printf("结果:%s (相关性:%.2f)\n", r.Value, r.Relevance) }
编译库
-
在Linux上编译:确保你安装了C/C++编译器和CMake。对于Ubuntu,你可以使用以下命令安装它们:
bash
sudo apt-get update sudo apt-get install build-essential cmake
然后你可以使用以下命令编译库:
bash
mkdir build && cd build cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc .. cmake --build . --config Release
这将生成libllama_go.so,它静态链接了所有必要的内容。你也可以通过将其复制到/usr/lib来安装库。
-
在Windows上编译:确保你安装了C/C++编译器和CMake。对于Windows,一个简单的选项是使用Visual Studio的Build Tools(确保包括CLI工具)和CMake。
bash
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . --config Release
如果你使用Visual Studio,将生成解决方案文件。你可以用Visual Studio打开解决方案文件并从中构建项目。然后bin目录将包含llamago.dll。
-
GPU和其他选项:要启用GPU支持(例如Vulkan),你需要向CMake命令添加适当的标志,请参考llama.cpp构建文档了解更多详细信息。例如,在Windows上编译时启用Vulkan支持,请确保安装了Vulkan SDK,然后运行以下命令:
bash
mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release -DGGML_VULKAN=ON .. cmake --build . --config Release
Semantic Search 库为需要语义搜索能力的Go应用程序提供了一个简单而高效的解决方案,尤其适合数据集规模较小的项目。通过上述步骤,你可以轻松地将语义搜索集成到你的应用中。