RAG原理-倒排索引和KNN
本节从两条检索路线展开倒排索引用关键词快速定位文档KNN 则在向量空间中寻找与查询最接近的 Top-K 数据。理解二者是继续学习 ANN、聚类索引和向量数据库的基础。一、倒排索引从“文档找词”变成“词找文档”1. 什么是倒排索引普通文档可以看成“文档 → 词语”的关系倒排索引把它反过来建立“词语 → 文档”的映射。词项 term - [(文档 ID, 出现位置), ...]查询某个关键词时不需要逐篇扫描全部文档只要在词典中找到该词再读取对应的文档列表即可。2. 视频中的分词示例原始文本大模型的应用在2025年会有哪些发展经过 Tokenization 后可以拆分为[大模型, 的, 应用, 在, 2025年, 会, 有哪些, 发展]随后为每个词项记录它出现在哪些文档、哪些位置。例如大模型 - [(doc_1, [0]), (doc_3, [5])] 2025年 - [(doc_1, [4])] 发展 - [(doc_1, [7]), (doc_2, [2])]上述 posting list 是结构示意。真实系统还可能保存词频、字段、位置、文档长度等信息用于短语查询和相关性排序。3. 建立与查询流程原始文档 - 文本清洗 - 分词与标准化 - 生成 term - posting list - 查询词分词 - 合并命中文档 - 相关性排序倒排索引擅长精确关键词、专有名词、编号和短语检索但如果查询与文档用词不同即使语义相近也可能无法命中。二、KNN在向量空间中寻找最近邻KNNK-Nearest NeighborsK 近邻搜索的核心过程是先把查询转换成向量再与数据库中的向量计算距离或相似度最终选出最接近的 K 个结果。查询文本 - Embedding 向量 q - 与所有候选向量计算距离/相似度 - 排序 - 返回 Top-K 最近邻1. 常见度量方式度量方式判断规则适用说明余弦相似度值越大越相似关注向量方向文本语义检索中常用欧氏距离L2距离越小越相似关注向量在空间中的直线距离点积Inner Product值越大越相似会受到向量模长影响余弦相似度公式cosine⁡(A,B)A⋅B∥A∥ ∥B∥ \operatorname{cosine}(A,B)\frac{A\cdot B}{\|A\|\,\|B\|}cosine(A,B)∥A∥∥B∥A⋅B​2. 暴力搜索Brute Force Search视频重点介绍了最直接的精确 KNN查询向量与数据集中的每一个向量都计算一次距离再排序并取前 K 个。for each vector x_i: score_i similarity(query, x_i) sort all scores return top_k设数据库共有N个向量每个向量维度为D距离计算量约为O(N × D)若对全部得分完整排序还会产生排序开销优点是结果精确、实现简单不会因为索引近似而漏掉真正的最近邻缺点是数据规模增大后查询延迟与计算成本会明显上升。因此暴力搜索更适合数据量较小、对精度要求高或用于效果基线的场景。三、精确 KNN 的 Python 实现下面使用余弦相似度完成一个不依赖第三方库的精确搜索示例frommathimportsqrtdefcosine_similarity(vector_a,vector_b):计算两个等长非零向量的余弦相似度。iflen(vector_a)!len(vector_b):raiseValueError(向量维度必须一致)dot_productsum(a*bfora,binzip(vector_a,vector_b))norm_asqrt(sum(a*aforainvector_a))norm_bsqrt(sum(b*bforbinvector_b))ifnorm_a0.0ornorm_b0.0:raiseValueError(不能计算零向量的余弦相似度)returndot_product/(norm_a*norm_b)defexact_knn(query_vector,document_vectors,k3):遍历全部向量返回相似度最高的 Top-K。ifk0:raiseValueError(k 必须大于 0)scored_items[(index,cosine_similarity(query_vector,vector))forindex,vectorinenumerate(document_vectors)]scored_items.sort(keylambdaitem:item[1],reverseTrue)returnscored_items[:k]query[1.0,0.0]documents[[0.9,0.1],[0.8,0.2],[0.1,0.9],]print(exact_knn(query,documents,k2))这段代码会对所有文档向量逐一打分因此得到的是精确结果生产环境中的向量数据库则会使用更高效的数据结构和批量计算。四、倒排索引与 KNN 的区别对比项倒排索引KNN 向量检索检索依据词项是否出现、词频与位置向量距离或相似度擅长内容关键词、编号、专有名词、精确短语同义表达、自然语言语义相关内容核心数据结构词典 posting list向量集合或向量索引主要限制难以直接理解语义精确遍历在大规模数据上成本高典型用途全文搜索、过滤与精确召回RAG 语义召回、相似内容检索两者不是互斥关系。实际 RAG 系统经常把关键词检索和向量检索组合成混合检索再通过 Rerank 统一排序。五、为什么还需要 ANN精确 KNN 会扫描全部向量数据量越大越慢。为了在大规模数据上降低延迟工程中通常使用 ANNApproximate Nearest Neighbor近似最近邻搜索不再保证每次都找到理论上的绝对最近邻通过牺牲少量召回率换取更快的查询速度常见思路包括聚类索引、图索引以及向量量化。本集最后由暴力 KNN 引出了 ANN后续章节会继续介绍近似搜索与聚类索引。六、核心总结倒排索引通过term - posting list实现快速关键词定位。KNN 把查询和文档放入同一向量空间返回距离最近的 K 个结果。暴力 KNN 结果精确但需要遍历所有向量更适合小规模数据。大规模检索需要 ANN在召回率、速度和资源消耗之间做权衡。RAG 工程中可结合倒排索引与向量检索同时获得关键词精度和语义召回能力。