← 返回目录
ap4.5实操⏱ 约 10 分钟

混合检索与重排:给检索加第二道判断

字面 + 语义一起打分,实测把含答案率拉到 10/10

🔎 最后验证 2026-08📚 来源:本节混合检索为 ECS 实测(2026-08,deepseek-chat,10 条评测问题,脚本与原始输出见本节代码)🧰 DeepSeek API、Python
为什么学这个

上一节你发现:同样的切分,检索命中卡在 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 分钟)

  1. 跑本节代码的实验三,对比纯向量 vs 混合检索。
  2. 换成你的数据,重点测那些含数字/编号/专有名词的问题——混合检索的提升应该主要来自它们。
  3. 调权重:把关键词加权从 0.15 改成 0.05 / 0.3 / 0.6,看哪个最好。权重太高会让字面匹配压倒语义(变成纯关键词搜索)。
  4. 做一个穷人版重排:检索 top-10,把这 10 块和问题一起丢给模型,让它选出最相关的 3 块,再回答。对比直接 top-3 的效果。
  5. 记下:三种手段在你的数据上各提升多少、各花多少

做到这里你应该有:一个混合检索实现 + 调好的权重 + 一份"三种手段性价比"对照。

为什么:检索是 RAG 里唯一你能完全控制的环节(生成靠模型、切分靠文档,只有检索是纯算法)。把这一环做扎实,后面生成端的压力会小很多——给模型正确的资料,比教它怎么答更有效

❓ 测验
检索命中率只有 60%,团队想上重排模型。更合理的顺序是?
⚠️ 避坑重排不能修复「检索阶段就没捞到」的东西

重排只能在候选集内部重新排序——如果正确的块根本没进 top-20,重排再强也变不出来。所以先看的指标是"召回率@20"(正确块在前 20 里的比例),它决定了重排的天花板。

诊断顺序:① 召回@20 低 → 切分/检索方式的问题;② 召回@20 高但命中@3 低 → 重排能救;③ 命中@3 高但回答差 → 生成端问题。别用重排去治检索的病。

🤖 让 AI 帮你设计混合检索
我的知识库检索现状:命中率【X%】,问题类型特点【是否含型号/编号/日期等精确标识】。请帮我:1) 设计混合检索的两路打分与合并方式(给出代码);2) 关键词权重怎么调、怎么验证;3) 判断我这个场景要不要上重排,如果要,粗召回取多少、用什么做重排;4) 给出诊断流程(先看哪个指标)。
✅ 小结

两个手段:混合检索(字面+语义,实测含答案率 7/10→10/10)、重排(粗召回+精排);优化顺序是切分 → 混合 → 重排,从便宜的开始;重排治不了"没捞到"的病。

下一节做 RAG 的信任基石:引用溯源——让每个答案都能指回原文的哪一句,用户能核验,你也能排查。

下一节 → 引用溯源:答案必须能指回原文
🔎 来源与核验· 1 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「同一按行切分、top-3 条件下:纯向量检索命中 7/10;混合检索(向量分 + 关键词命中加权 0.15)检索结果含答案 10/10、回答准确 9/10」
📚 ECS 实测 rag_pipeline.py 实验三(2026-08,deepseek-chat)✓ 已核验 2026-08
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · ap4.6
引用溯源:让答案能被自动核验
继续读下一节 →