1. 向量检索的本质与挑战
在RAG(检索增强生成)系统中,语义相似度检索是整个流程的核心环节之一。简单来说,这个过程就是将文本转换为向量表示(即embedding),然后通过计算向量之间的距离或相似度,找出与查询最匹配的文档片段。虽然向量运算本身是高中数学的基础知识,但在实际工程应用中,如何高效地组织和检索这些向量却是一个极具挑战性的问题。
想象一下,你有一个包含数百万甚至数十亿文档片段的知识库,每个片段都被转换为一个768维或1024维的向量(常见的大模型embedding维度)。当用户提出一个问题时,系统需要:
- 将问题转换为相同维度的向量
- 从海量向量中找出最相似的几个
- 将这些相似片段作为上下文输入大模型生成最终回答
如果采用最朴素的"暴力搜索"(Brute-force)方法,即计算查询向量与知识库中每一个向量的相似度,虽然能保证100%准确,但计算成本会随着数据量线性增长,在真实场景中完全不现实。这就是为什么我们需要高效的向量索引技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流索引技术深度解析
2.1 IVF:基于聚类的倒排索引
IVF(Inverted File Index)的核心思想借鉴了传统搜索引擎中的倒排索引概念,但应用于向量空间。其工作原理可以分为三个关键步骤:
- 聚类阶段:使用k-means等算法将所有文档向量聚类为nlist个簇,每个簇有一个中心点(centroid)
- 索引构建:建立倒排列表,记录每个簇包含哪些向量
- 查询阶段:
- 计算查询向量与所有簇中心的距离
- 选择距离最近的nprobe个簇
- 只在这些簇内部进行精细搜索
python复制# 伪代码展示IVF查询过程
def ivf_search(query_vec, nprobe=10):
# 第一步:计算与所有簇中心的距离
centroid_distances = [cosine(query_vec, centroid) for centroid in centroids]
# 第二步:选出最近的nprobe个簇
closest_cluster_indices = np.argsort(centroid_distances)[:nprobe]
