本节摘要:检索模块负责从知识库中找到与用户查询最相关的信息,内部由四个部件构成——数据索引、查询编码、相似度搜索、结果排序与过滤。本节拆解每个部件的技术选型(嵌入模型、索引结构、相似度度量、检索策略),并给出针对检索质量的五条优化路径,为第 3 章的高级检索技术铺路。读完你应当能解释一次检索调用内部发生的全部事情。
阅读完本节,你应当能够:
RAG 系统里有一个残酷的事实:生成模型只对"拿到什么"负责,不对"该拿什么"负责。检索器返回的五个文本块,就是模型能看到的世界全部。找对了,模型大概率答好;找错了,再强的模型也只能基于错误材料作答——甚至答得越流畅越有迷惑性。
所以值得把检索这个动作放到显微镜下看。用户敲下一句"退款多久到账",到系统返回五个文本块之间,发生了什么?
把知识库的文本块组织成可快速检索的结构。关键词路线用倒排索引(词到文档的映射),语义路线用向量索引。向量索引普遍采用近似最近邻搜索——不追求绝对精确的最近邻,用可控的精度损失换取数量级的速度提升,主流实现有分层可导航小世界图(HNSW)等算法。数据规模小的时候,精确检索的开销完全可接受,不必急着上近似索引。
把用户的查询转成与索引数据同一语义空间的向量。注意"同一空间"四个字:查询向量和文档向量必须出自同一个嵌入模型,混用两个模型的向量,相似度计算毫无意义——这是新手最常见的翻车点之一。
在索引中寻找与查询向量最近的若干向量。三种度量方式:余弦相似度衡量向量方向的接近程度,对文本语义比较最常用;点积同时考虑方向与大小,在向量已归一化时与余弦等价;欧氏距离衡量直线距离,值越小越相似。选哪个主要看嵌入模型的训练约定——模型按哪种度量训练,检索就用哪种,别自己发挥。
搜索返回的初步结果要再过一道筛:按相关性分数排序,结合元数据(来源、时间、部门)过滤,去掉低于质量阈值的块,最终交给生成模块。
关键词检索基于词汇的精确匹配,BM25、TF-IDF 是代表算法:查询里出现"退款",就找包含"退款"的文档。简单、快、可解释,对专业术语和编号(产品型号、法条编号)的精确匹配无可替代。但它不懂"退货的钱多久回来"和"退款周期"是一回事。
语义检索用向量相似度捕捉语义关系:查询和文档都变成向量,意思相近则向量相近,用词不同也能匹配上。它对拼写错误有一定容错,能理解换个说法的同一意图。代价是依赖嵌入模型的质量,而且对"字面必须精确"的场景(型号、编号)反而可能失手——向量把 ZL-2001 和 ZL-2002 看得很近,但它们是两个产品。
| 维度 | 关键词检索 | 语义检索 |
|---|---|---|
| 原理 | 词汇精确匹配 | 向量相似度 |
| 换说法的查询 | 匹配失败 | 正常命中 |
| 型号编号类查询 | 精确可靠 | 可能混淆 |
| 可解释性 | 强(命中词可见) | 弱(分数难解读) |
| 计算开销 | 低 | 中 |
我们实际的立场:这两者不是竞争关系。生产系统里语义检索打底、关键词检索补精确匹配,是第 3 章混合检索的伏笔,这里先按下不表。
Top-K 检索:返回与查询最相关的 K 个文本块,K 常取三到十。简单直接,问题是 K 之外的皆不可见,K 之内鱼龙混杂。
基于阈值的检索:返回相似度高于某个阈值的块。数量弹性——相关问题多就多返回,无相关就不返回。阈值标定是个持续调整的活,且不同嵌入模型的分数分布不同,阈值不能照搬。
多路检索:同时跑多种检索方法(如关键词加语义),融合各自结果。召回率提升明显,代价是延迟与融合逻辑的复杂度。
K 的取值是个典型的工程权衡:K 大,信息全但噪声多、提示词变长、成本上升;K 小,上下文干净但可能漏掉关键证据。起步取三到五,靠第 3 章的评估指标驱动调整,比拍脑袋可靠。
朴素检索模块跑通后,性能提升有五条公认路径,这里列出地图,细节留给第 3 章:
五条优化路径之外,再补两个进阶话题和一个诊断方法,它们决定你能不能把检索质量"经营"起来。
诊断方法:检索日志。 给每次检索记三样东西——原始查询、返回的文本块编号、各块的相似度分数。有了这份数据,"检索不准"就从感觉变成案例:分数整体偏低说明语义匹配失败(该查嵌入模型),分数很高但不相关说明库里缺对的内容(该查知识库覆盖),分数正常但正确块排第六(该上重排序)。三种病灶三种药,日志是分诊台。
进阶话题一:嵌入模型的选型与领域适配。 通用嵌入模型在公开语料上表现出色,换到术语密集的领域可能水土不服——"主板"在电子语境和股市语境的向量应该不同,通用模型未必分得开。选型时用自己领域的评估问题集跑分,而不是看公开榜单排名。领域适配的阶梯:先用通用模型,不足时换领域预训练的模型,仍不足才考虑用自己的语料微调——微调需要构造"查询与正确文档"的配对数据,成本不低,放在最后。
进阶话题二:多路召回的融合细节。 第 3 章会展开混合检索,这里先埋一个工程伏笔:多路召回的结果合并不是简单去重。同一路召回内的排序信息、不同路的分数差异、每个块的来源,都值得在合并时保留——它们是后续重排序和引用展示的原料。设计数据结构时预留这些字段,后面能省掉返工。
进阶话题三:索引的维护成本。 数据规模增长后,向量索引需要重建或增量更新,重建期间检索质量与延迟都会波动。两个应对:其一,蓝绿索引——新索引建好后原子切换,旧索引保留一段时间兜底;其二,增量插入为主、定期全量重建为辅,把重建安排在流量低谷。索引维护是检索模块的"隐性账单",容量规划时必须算进去,否则系统会在某次数据翻倍后突然劣化,而团队还以为是模型退化了。
结束前给两个经验基准,供你校准预期。
基准一:语义检索不是万能钥匙。 换说法的查询它强,精确指代的查询它弱。一个值得记住的实测规律:知识库里存在"只差一个字符的专有名词"(型号、编号、药名)时,纯语义检索的混淆率会明显上升——向量眼里它们几乎一样。所以任何语料含大量专有标识的系统,混合检索不是可选项,是必选项。
基准二:检索结果的"温度"要看分数分布。 健康的检索系统,命中块的相似度分数与未命中块之间有一段清晰间隔;间隔消失(所有块分数挤在一起)意味着嵌入模型对你的语料区分度不足,该换模型或做领域微调了。把分数分布画成监控图,是成本几乎为零的健康检查,很多检索劣化问题在用户投诉之前就能从这张图上看出苗头。
把检索模块的"经营"要点串成一句话:日志分诊、基准校准、坏案例集驱动改进——检索质量不是一个配置参数,而是一个需要持续经营的运行指标。抱着"调一次参数管一年"心态的团队,检索模块会在半年内静悄悄地失守,等用户流失数据出来时,早就错过了低成本修复的窗口期。
⚠️ 常见坑:查询和文档使用不同的嵌入模型,或者更新了文档侧模型却忘了更新查询侧。相似度全部失真,症状是"检索结果看起来随机",排查半天发现是向量空间对不上。
💡 调试利器:建立一个"坏案例集",收集检索不命中的真实查询,人工标注应该命中的文本块。任何优化(换模型、调参数、加策略)都在这个集合上跑分。没有它,检索优化就是玄学。
文本块到手,接力棒交给最后一棒:生成模块如何把这些资料变成一段值得信赖的回答。详见第 3 节。