技术背景介绍
Annoy (Approximate Nearest Neighbors Oh Yeah) 是由 Spotify 开发的一个高效近似最近邻(ANN)搜索工具。它用于在高维向量空间中快速搜索与查询点最接近的点,具有快速构建索引、低内存占用和高查询性能的特点。
Annoy 建立的索引是只读的,这意味着一旦索引构建完成,就不能动态插入新的向量数据。这种限制反映了 Annoy 偏向于内存效率和查询性能的权衡。如果需要动态更新的向量检索,可能需要选用其他数据库如 Faiss、Weaviate 等。
在 AI 应用中,Annoy 常被用于以下场景:
- 文本搜索:基于嵌入(embeddings)的文本语义相似度搜索。
- 推荐系统:计算用户与物品之间的相似度。
- 图像/音频检索:在嵌入空间进行多媒体搜索。
本文将结合 LangChain 框架,展示如何利用 Annoy 构建和查询向量存储。
核心原理解析
Annoy 的核心思想是使用多棵随机投影树(Random Projection Trees),将高维向量分成多个子空间,每个子空间由一棵树表示。通过多次随机投影,Annoy 能够快速找到目标点的近似邻居。
主要特性:
- 多棵树组成的索引:通过随机投影构建索引,树的数量越多,搜索精度越高,但查询速度也会变慢。
- 只读特性:构建索引后,无法动态添加新向量。
- 多进程支持:Annoy 的索引是只读内存映射文件,多个进程可以共享。
在 LangChain 框架中,Annoy 可与嵌入生成器(如 HuggingFaceEmbeddings)搭配,用于文本或其他数据的向量化处理,并执行高效的相似性搜索。
代码实现演示
环境搭建
确保安装了必要的依赖库:
pip install --upgrade --quiet annoy langchain-community langchain-huggingface
1. 从文本创建向量存储
以下展示了如何加载文本数据,将其嵌入生成向量,并用 Annoy 创建索引:
from langchain_community.vectorstores import Annoy
from langchain_huggingface import HuggingFaceEmbeddings
# 初始化嵌入生成器
embeddings_func = HuggingFaceEmbeddings()