混合检索与重排:给检索加第二道判断
字面 + 语义一起打分,实测把含答案率拉到 10/10
上一节你发现:同样的切分,检索命中卡在 7/10 上不去了。加大 k 没用(拐点已到),换切分成本高。
这一节讲两个不动切分就能提升检索的手段:混合检索(字面和语义各打一分,合起来排)和重排(先粗捞一批,再精挑)。
实测:同样的按行切、同样 top-3,混合检索把"检索结果里含正确答案"从 7/10 拉到 10/10。
招聘筛简历:只看关键词(会漏掉写法不同的高手),只看语义(可能漏掉"必须持有 X 证书"这种硬条件)。老练的 HR 两样都看——关键词做硬性门槛,语义做能力判断。
混合检索就是这个思路。
手段一:混合检索(字面 + 语义)
问题:嵌入模型擅长理解意思,但对精确的数字、编号、专有名词反而不敏感——"型号 A1289"和"型号 A1298"在语义空间里几乎一样近。
解法:两路打分,加权合并:
def retrieve_hybrid(q, chunks, vecs, idf, k=3):
qv = embed_query(q, idf)
scored = []
for i, v in enumerate(vecs):
s = cosine(qv, v) # ① 语义/向量分
for t in re.findall(r'[a-z]+|\d+\.?\d*', q.lower()):
if t in chunks[i].lower():
s += 0.15 # ② 关键词精确命中加权
scored.append((s, i))
scored.sort(reverse=True)
return [(chunks[i], s) for s, i in scored[:k]]
实测效果:
【混合检索 top-3】检索结果含答案 10/10,回答准确 9/10 (90%)
(对比:同切分纯向量检索,检索命中 7/10)
生产实践里,这两路通常是 BM25(字面)+ 嵌入向量(语义),用 RRF(倒数排名融合)等方法合并——原理和上面这十行完全一致:两个排序,融合成一个。
手段二:重排(Rerank)
思路:检索时先粗捞 20 条(要召回率),再用一个更强但更慢的模型逐条打分,精选前 3(要精确率)。
用户问题
↓
向量检索 top-20 ← 快、便宜、召回优先
↓
重排模型逐条打分 ← 慢、贵、精确优先(只处理 20 条,可接受)
↓
取 top-3 进上下文
为什么有效:检索阶段是"问题向量 vs 块向量"的粗略比对(块向量在入库时就固定了,没见过你的问题);重排是把问题和块放在一起判断相关性,精度高得多。
代价:多一次调用(延迟 +100~300ms 量级)、多一份费用。什么时候值得:检索命中率明显低于回答需要(比如 70%),而你又不想重做切分时。
穷人版重排:没有专门的重排模型?用你正在用的大模型做——把 20 个候选和问题一起丢给它,让它输出"最相关的 3 个编号"。效果不如专用重排模型,但成本可控、立刻可用。
三种手段怎么选
| 你的情况 | 优先做 |
|---|---|
| 检索命中率 < 70% | 先回 4.2 调切分(最便宜、收益最大) |
| 问题含精确标识(型号/编号/日期) | 混合检索(字面这一路是刚需) |
| 切分已优化,命中率还差一截 | 重排(粗召回 + 精排) |
| 命中率够但回答不准 | 问题在生成端:调提示词、控上下文顺序 |
顺序很重要:切分 → 混合 → 重排,从便宜的开始。见过太多团队一上来就上重排模型,结果发现是切分把句子切碎了。
🔧 动手做:给你的检索加第二道判断(15 分钟)
- 跑本节代码的实验三,对比纯向量 vs 混合检索。
- 换成你的数据,重点测那些含数字/编号/专有名词的问题——混合检索的提升应该主要来自它们。
- 调权重:把关键词加权从
0.15改成0.05/0.3/0.6,看哪个最好。权重太高会让字面匹配压倒语义(变成纯关键词搜索)。 - 做一个穷人版重排:检索 top-10,把这 10 块和问题一起丢给模型,让它选出最相关的 3 块,再回答。对比直接 top-3 的效果。
- 记下:三种手段在你的数据上各提升多少、各花多少。
✅ 做到这里你应该有:一个混合检索实现 + 调好的权重 + 一份"三种手段性价比"对照。
为什么:检索是 RAG 里唯一你能完全控制的环节(生成靠模型、切分靠文档,只有检索是纯算法)。把这一环做扎实,后面生成端的压力会小很多——给模型正确的资料,比教它怎么答更有效。
重排只能在候选集内部重新排序——如果正确的块根本没进 top-20,重排再强也变不出来。所以先看的指标是"召回率@20"(正确块在前 20 里的比例),它决定了重排的天花板。
诊断顺序:① 召回@20 低 → 切分/检索方式的问题;② 召回@20 高但命中@3 低 → 重排能救;③ 命中@3 高但回答差 → 生成端问题。别用重排去治检索的病。
我的知识库检索现状:命中率【X%】,问题类型特点【是否含型号/编号/日期等精确标识】。请帮我:1) 设计混合检索的两路打分与合并方式(给出代码);2) 关键词权重怎么调、怎么验证;3) 判断我这个场景要不要上重排,如果要,粗召回取多少、用什么做重排;4) 给出诊断流程(先看哪个指标)。
两个手段:混合检索(字面+语义,实测含答案率 7/10→10/10)、重排(粗召回+精排);优化顺序是切分 → 混合 → 重排,从便宜的开始;重排治不了"没捞到"的病。
下一节做 RAG 的信任基石:引用溯源——让每个答案都能指回原文的哪一句,用户能核验,你也能排查。
🔎 来源与核验· 1 条,点开核对
