本节摘要:检索优化是 RAG 提效的第一现场。本节讲四项核心技术——语义检索的深化(嵌入模型与向量库的选型逻辑)、混合检索(关键词与语义结果的加权融合)、查询重写(扩展、纠错、意图明确、模型重写四种手法)、上下文感知检索(历史查询、对话历史、用户画像三类信息源)。每项技术都给出适用条件与代价,帮你按需引入而不是全量堆砌。读完你应当能把检索命中率作为可管理、可优化的指标来经营。
阅读完本节,你应当能够:
"检索不准"是个笼统的抱怨,拆开是三种病:查不到(该命中的没命中,召回率低)、排不对(命中了但排在后面,被 Top-K 截掉)、理解偏(用户说的和库里写的根本不是一个表述方式)。四项技术各治各的病:语义检索治理解偏,混合检索治查不到,查询重写治理解偏加查不到,上下文感知治理解偏。诊断先行,再往下读。
第 2 章讲过语义检索的骨架,这里补三块深化内容。
嵌入模型选型:通用场景用主流句子嵌入模型(如各类 Sentence-BERT 系模型)即可;领域术语密集(医疗、法律)时,用领域语料微调嵌入模型,收益常常显著——检索器和生成器甚至可以联合训练,端到端优化整个框架。
向量数据库:FAISS、Milvus、Chroma、Weaviate 各有生态位,选型原则第 2 章已述——规模未及瓶颈前,别在产品对比上空耗。
分块的再强调:语义检索的上限有一半在分块。语义分块(按句子段落边界而非字符数切)加重叠分割(相邻块保留一至两成重叠),是两项回报最稳的改造。
关键词检索和语义检索的互补性,第 2 章已经摆过擂台。混合检索就是把两路结果融合:BM25 一路、向量相似度一路,各自的得分归一化后加权求和,按融合分排序。

融合的工程细节有两处容易踩坑。其一,分数归一化:BM25 分数和余弦相似度量纲不同,直接加权没有意义,先各自归一到同一区间。其二,权重设定:精确查询多的场景(型号、编号、法条)偏关键词权重,开放表述多的场景偏语义权重;更精细的做法是用排序学习模型学出权重。线性加权是性价比最高的起点。
混合检索之上还可以加一层重排序:用交叉编码器模型对融合后的前几十个候选逐个精细打分。它的精度高于双向量的相似度(因为查询和文档一起送进模型做深度交互),但计算贵,所以只精排头部候选——先粗筛后精排,两级漏斗。
用户的真实查询是什么样?"那个报错咋回事"、"上次说的那个方案靠谱吗"。直接拿去检索,命中率惨淡。查询重写有四种手法:
| 手法 | 做法 | 治什么 |
|---|---|---|
| 同义词扩展 | 用词典或模型把关键词扩展为近义表述 | 换说法查不到 |
| 拼写纠错 | 编辑距离等算法修正错别字 | 输入错误 |
| 意图理解 | 用实体识别、关系抽取补全上下文与约束 | 意图模糊 |
| 模型重写 | 让大模型直接改写为更具体明确的查询 | 综合治理 |
模型重写是当前的主流做法——一句话指令("把以下用户查询改写为适合知识库检索的完整、具体的问题")就能让大模型把残缺口语补成规范问句。代价是多一次模型调用、多一点延迟,对查询量大的系统要算这笔账。
一个相关的进阶技巧是查询分解:把复杂问题拆成多个子问题分别检索再合并。比如"对比 A 和 B 两个产品的退款政策"拆成 A 的政策、B 的政策两个子查询。多跳检索也属于这一族:先检索一轮,用第一轮结果改写查询再检索一轮,逐步逼近需要串联多份文档才能回答的问题。
对话场景里,当前这句话往往不是完整的意思。"那退货呢?"——检索器必须知道上文在聊订单。上下文感知检索引入三类信息:
实现上最直接的做法是把上下文与当前查询融合后再编码检索——比如让模型先把"那退货呢"结合对话历史改写成"订单签收后七天内退货的流程是什么",再走向量检索。查询重写与上下文感知在工程上常常合为同一个步骤。
重排序值得再给一节篇幅,因为它是"投入产出比最高"却最常被跳过的技术。展开讲三点。
为什么交叉编码器更准? 向量检索是"背对背"打分——查询和文档各自编码成向量,再算距离,两者从未见过面。交叉编码器是"面对面"打分——查询和文档拼在一起送进模型,逐词交互地判断相关性,能捕捉"词相同但所指不同"这类细粒度差异。代价是每个候选对都要跑一次模型,所以只对头部候选(几十个)精排,不能全库扫。
重排序器的选型:开源的交叉编码器模型即插即用,效果立竿见影;追求更高精度可以上通用大模型做重排序(给模型看查询和候选,让它输出相关性判断),成本更高但判断力更强。工程上常见"轻量交叉编码器日常跑、大模型重排给高价值查询"的分层配置。
一个完整案例串起本节全部技术。 某企业知识库助手,初期朴素向量检索,用户投诉"查不到"。诊断发现三类坏案例:查询口语化("报销被驳回了咋整")占四成,型号类精确查询失手占三成,多轮指代失灵占三成。处方:上查询重写治口语化(大模型改写),上混合检索治精确查询失手(关键词路召回型号),上对话改写治指代(历史融入重写),最后加重排序兜底排序质量。四项全部落地后,坏案例集命中率从六成出头提到九成以上,总延迟增加不到一倍(重写与重排各一次轻量调用)。这个案例的启示:四种技术各治各的病,组合使用才有完整覆盖——单押任何一项都救不了全局。
案例背后还有一个值得提炼的方法论:优化是"按坏案例分类开药"的过程,不是"按技术清单施工"的过程。如果当初团队拿到一份"高级检索技术清单"逐项实施,先上了最时髦的多跳检索,口语化查询的四成坏案例一个都治不了,还平添了延迟。先分类、再开方、最后逐项验证——这个顺序比任何单项技术都值钱。
再补充实施时的优先级判断依据:改动半径与验证难度。改动半径指技术侵入管线多深(重排序只在检索出口加一层,半径最小;查询重写要在检索入口加一次模型调用,半径中等;多跳检索要重构整个检索循环,半径最大)。验证难度指效果多容易被度量(重排序的排序改善立竿见影;上下文感知的个性化收益则难以归因)。半径小且易验证的先上,半径大且难验证的慎上——这不是保守,是让每一步优化都处在可控反馈之内。团队里推动这类决策时,把两个维度画成四象限图摆出来,优先级争议通常能当场平息:右上角(半径小、易验证)立即做,左下角(半径大、难验证)留到确有必要时再碰。这张四象限图也适合贴在团队的看板上,每引入一项新技术就标注一次位置——一年下来,你会发现团队的技术决策从"追新"悄悄变成了"按证据推进",这个转变本身就是工程成熟的标志,它让每一次技术债务的引入都变得有意识、可追踪,而不是随波逐流地累积。
⚠️ 常见坑:把整段对话历史无差别拼进查询。历史里的旧话题会污染当前检索的语义焦点,命中率反而下降。正确做法是先做指代消解与话题聚焦,只保留与当前问题相关的上下文。
💡 引入顺序建议:重排序(改动最小、收益直接)→ 混合检索(治精确查询失手)→ 查询重写(治口语化查询)→ 上下文感知(多轮对话系统才需要)。每加一项,都在坏案例集上验证增量的收益。
动手引入这些技术时还有个团队协作层面的提醒:每引入一项,就把它的开关、参数与预期收益写进一份简短的技术决策记录,注明日期与验证用的坏案例编号。半年后有人问为什么权重这么配、为什么不上知识图谱,这份记录就是答案,省掉一轮重新试错。技术债往往不是选错技术,而是忘了当初为什么这么选。
检索端武装完毕,下一节转向生成端:拿到一堆或冗长或残缺的资料,模型怎么用好它们。详见第 2 节。