在自研知识库的评测集上,我们的多路召回方案把答案命中率做到了 96%。这篇文章拆解它的工程细节。
单路召回的天花板
- 纯向量检索:语义泛化好,但对编号、型号、人名等精确关键词经常漏召回;
- 纯 BM25:关键词匹配准,但换个说法("报销"vs"差旅费用")就束手无策;
- 纯图谱:关系类问题强,但覆盖面受限于抽取质量。
企业场景里,三类问题都真实存在:"差旅补贴标准是多少"(语义)、"合同编号 HT-2024-088 是什么"(精确)、"张三负责过哪些项目"(关系)。所以必须三路并行。
三路召回的构建
- 向量路:语义切分后向量化写入 ChromaDB,Top-K 语义召回;
- BM25 路:jieba 分词建倒排索引,负责精确关键词与编号类命中;
- 图谱路:LLM 从文档中抽取实体关系三元组,SQLite + NetworkX 建图,问答时先做实体识别,再子图遍历找到关联内容。
RRF 融合与意图路由
三路结果用 Reciprocal Rank Fusion 融合:每条内容的得分来自它在各路排名的倒数加权和,不需要调参就能稳定优于任何单路。更进一步,我们加了意图路由:规则优先 + LLM 兜底,把问题分为 kb(知识问答)/ id(精确匹配)/ relation(关系查询)/ hybrid(混合)四类,按意图调度召回路径——id 无命中自动回退 kb,避免死路。
Reranker 与查询改写
融合后可选 CrossEncoder 精排(默认关闭,按需开启,精度换时延);查询改写则用 LLM 把用户问题改写成多个版本并行召回,长尾问法的命中率显著提升。
整套方案本地优先,8GB 内存、无独显的机器即可运行。RAG 的准确率从来不是某个神奇模型决定的,而是解析、切分、召回、融合、评测每一个环节数的积累。