多路召回:向量检索 + 关键词检索的混合方案
单路召回各有盲区。学习混合检索(Hybrid Search):向量 + BM25 各补其短,用 RRF 融合两路结果。
单路召回的盲区
- 纯向量检索:懂语义,但精确词不敏感 —— 搜"GLM-4-Flash 型号"可能召回一堆讲 GLM 的泛泛文章;
- 纯关键词检索(BM25):精确匹配强,但不懂同义改写 —— 搜"钱怎么退"匹配不到"退款流程"。
两者的短板恰好互补 —— 这就是混合检索(Hybrid Search)存在的理由。
双路并行 + RRF 融合
用户问题 ─┬─ 向量检索(语义路)──→ Top-20 ─┐
└─ BM25 关键词检索 ──→ Top-20 ─┴─→ RRF 融合排序 → Top-N
RRF 分数 = Σ 1 / (k + rank_i) # k 常取 60
(每路按排名倒数计分,两路分数相加)
RRF(倒数排名融合)的好处:不需要把两路的分数归一到同一量纲(向量余弦分和 BM25 分完全不可比),只用排名计算,简单稳健。
LangChain 实现
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(chunks, k=10)
vector = vectorstore.as_retriever(search_kwargs={"k": 10})
hybrid = EnsembleRetriever(
retrievers=[bm25, vector],
weights=[0.5, 0.5], # 两路权重
c=60) # RRF 常数
调优要点
- 专有名词、型号、编号密集的领域(法律条款、API 文档)加大 BM25 权重;
- 口语化提问多的场景加大向量权重;
- 每路召回 Top-20 再融合取 Top-10,比每路只取 5 条效果好 —— 先保召回量,精排交给下一课的 Rerank。
📝 课后练习
quiz-1 混合检索中,BM25 关键词检索主要补足了向量检索的哪块短板?