[!WARNING] 《进阶设计:RAG进阶》
- 跳转至这里阅读:[08. Milvus、BM25L、RRF 与 rerank 混合检索](/oncall/AI Native 工程化实战(智能OnCall Agent)/05|OncallAgent 功能与源码解析/08. Milvus、BM25L、RRF 与 rerank 混合检索/)
这次 RAG 升级的核心是:从“单路向量召回 ”,升级成一套可用于生产环境的“混合召回 + RRF 融合 + 真实 rerank + 权限与证据链”系统。
升级后的完整检索链路是:
Agent 判断是否需要知识库
→ 校验 query、topK、过滤器和知识库权限
→ 并行召回
├─ query embedding → Milvus 语义召回 Top 20
└─ scoped chunks → BM25L 词项召回 Top 20
→ owner / tenant / 文档 / metadata 二次过滤
→ RRF 融合并去重,保留 Top 20
→ qwen3-vl-rerank 真实精排
→ 返回最多 5 条结果及对应引用
几个特别重要的设计变化:
混合检索解决两类问题 向量检索负责“意思相近”,BM25L 负责“字符必须精确”。即使某个片段只在一路命中,也能进入候选;两路都命中的片段会受到 RRF 奖励。
不直接相加不同分数 COSINE 和 BM25L 的分数量纲不同,因此不相加原始分数,而是按照名次计算:
RRF score = Σ 1 / (60 + rank)
rerank 从理论概念变成真实工程实现 基础文档已经介绍过 Cross Encoder,但升级版真正接入了
qwen3-vl-rerank,加入有限重试、响应索引校验、分数范围校验,并以rerankScore作为最终相关性分数。权限参与检索和排名 未授权文档不仅不能出现在结果中,也不能参与 BM25 的 IDF 统计,避免其他租户的语料间接改变当前用户的排名。
结果具备可解释证据链 每条结果都保留:
vectorRank/vectorScorebm25Rank/bm25ScorerrfScorererankRank/rerankScore
前端可以解释“为什么进入候选”和“为什么最终排在这里”,但高分仍不能直接当作故障根因证据。
采用失败关闭策略 Embedding、Milvus、BM25L 或 rerank 任一环节失败,都会返回安全的系统错误,不会偷偷回退到单路结果。只有正常执行后确实无候选,才返回空
results。
一句话概括:这次主要升级的不是 RAG 的“生成”,而是检索中间层——召回更全面、排序更准确、权限更严格、结果更可解释。