RAG 与知识库
RAG 检索不是接上向量库就结束:一次可复现的中文策略库排序实验
用 12 份固定策略文档、10 个可回答查询和 2 个无答案查询,对比 BM25、显式领域扩展、字符三元组与 RRF 融合,解释为什么更多检索器不必然带来更好结果。
时间与证据
这是一篇在 2026 年 7 月 13 日真实执行的本地实验,不是对过去某次模型发布的复盘。仓库保存了语料、查询、检索实现、测试与逐查询排序结果:
labs/rag-retrieval-eval/data/corpus.json:12 份合成企业策略文档。labs/rag-retrieval-eval/data/queries.json:10 个可回答查询与 2 个无答案查询。labs/rag-retrieval-eval/src/evaluate.mjs:BM25、字符三元组余弦、显式领域扩展与 RRF。labs/rag-retrieval-eval/test/evaluate.test.mjs:9 个自动测试,覆盖候选过滤、MRR 截断、固定指标和结果工件完整性。labs/rag-retrieval-eval/results/2026-07-13-results.json:包含每种方法的指标和每条查询前三名,SHA-256 为a48b4a9bd64f87d9e70dc9ff562d5aa35b5181249a9ea221262a0e16303dbe5b。
证据等级是 reproduced:代码和固定输入在本站环境运行,测试也检查确定性结果;但语料是专门编写的合成策略,不是客户数据,检索器没有调用 embedding 模型,也没有真实读者流量。因此本文只能证明这套实现和这组任务发生了什么,不能把结论扩大成“混合检索普遍无效”或“词法检索已经足够”。
BM25 的概率相关性框架和 RRF 的排名融合方法分别由文末结构化来源说明。引用论文是为了交代算法来源;本站指标来自自己的代码与原始结果,不把论文报告当成本实验结果。
实验设计
任务不是“搜到看起来相关的文本”
假设内部支持团队要上线一个策略问答助手。用户可能问“手机丢了无法生成二次验证码怎么找回账号”,文档却写“MFA 设备丢失后使用恢复码”;也可能问“欧洲客户购买专业版需要什么数据条件”,文档使用的是“欧盟、数据处理协议和欧盟数据区”。检索层的验收对象应该是 标注查询能否把正确文档排到前面,而不是开发者肉眼觉得搜索结果“差不多”。
固定任务集覆盖报销、年假、数据保留、API 限流、MFA 恢复、事故升级、销售区域、MCP 审批和入职权限。每个可回答查询只标注仓库中真正包含答案的文档;“宠物医疗保险”和“GPU 租赁价格”没有答案,用来检查系统是否会对任何问题都硬找一段文本。
四条候选链路
- 原始 BM25:英文和数字保留词项,连续中文使用双字切分。它能解释每个匹配分数,也适合错误定位。
- 显式领域扩展 BM25:查询命中预先写明的表达时追加领域词,例如“二次验证码”扩为
MFA TOTP 恢复码,“留到明年”扩为年假 结转。 - 字符三元组余弦:将规范化文本切为字符三元组,以词频向量计算余弦相似度。它不是神经 embedding,不能声称具备通用语义理解。
- RRF 混合:把领域扩展 BM25 与字符检索的排名通过 reciprocal rank fusion 合并。RRF 使用排名位置,不直接比较两套异构分数。
两种检索器都只返回 score > 0 的候选,RRF 也再次过滤非正分输入。零相似度表示检索器没有发现匹配,不应该仅凭文档 ID 的稳定排序获得一个“名次”。审计前的实现曾把全部零分文档送进指标和融合,制造出字符检索的伪命中与 RRF 的伪退化;本文数字来自修复后的结果。
显式扩展表是系统资产,也是人工成本。它的价值在于可以审查“哪些用户表达被映射到哪些业务词”;代价是领域变化后要维护,并可能因错误同义词引入召回污染。实验没有把这项规则藏进 Prompt,也没有把它称为模型推理。
指标与复现
对 10 个可回答查询计算:
Recall@3:正确文档是否出现在前三名。MRR@10:第一个正确文档排名的倒数均值,更重视第一名是否正确。- 失败样本:正确文档未进入前三名时保存查询、预期文档和实际前三名。
无答案决策只在扩展 BM25 上使用固定阈值 5:第一名分数低于阈值就拒答。阈值与评测集没有拆分成训练集和测试集,因此它只能展示机制,不能作为生产阈值。
复现命令:
node --test labs/rag-retrieval-eval/test/evaluate.test.mjs
node labs/rag-retrieval-eval/src/evaluate.mjs \
--out /tmp/younis-ai-lab-rag-results.json
shasum -a 256 labs/rag-retrieval-eval/results/2026-07-13-results.json
结果
2026 年 7 月 13 日保存的结果如下:
| 方法 | Recall@3 | MRR@10 | 能证明什么 |
|---|---|---|---|
| 原始 BM25 | 1.00 | 0.95 | 小语料中所有答案进入前三,但有一次没有排第一 |
| 显式领域扩展 BM25 | 1.00 | 1.00 | 10 个可回答查询的正确文档都排第一 |
| 字符三元组余弦 | 0.80 | 0.75 | 10 个可回答查询中有 2 个没有任何正分候选 |
| 扩展 BM25 + 字符 RRF | 1.00 | 1.00 | 与扩展 BM25 持平,没有观察到融合增益 |
两个无答案查询在阈值 5 下都被拒绝,12 个查询的拒答决策表面准确率是 1.00。这个数字的分母只有 12,其中无答案只有 2 条;它不是可用于采购或上线的百分比,只说明结果工件和拒答分支按设计运行。
最重要的结果不是“BM25 获胜”,而是 候选语义必须先于指标。字符检索单独只有 0.80 的 Recall@3 和 0.75 的 MRR@10;RRF 避免比较原始分数后,与扩展 BM25 同为 1.00,却没有解决任何额外查询。若团队只展示“我们用了 hybrid search”,却不公开空候选、逐查询排序和消融结果,就会把复杂度误当成质量。
这组结果也暴露了小型基准的上限效应:原始 BM25、扩展 BM25 和 RRF 的 Recall@3 都是 1.00,后两者的 MRR@10 也同时封顶。下一版必须扩大相似文档数量、加入冲突版本、长文档和跨段答案,并把 k=1、nDCG、引用覆盖率与最终回答正确率分开测量。
失败与边界
第一,语料只有 12 份,而且文档主题相对分离。真实企业知识库经常有多个版本的退款政策、相似产品说明和互相冲突的会议纪要,排序会困难得多。
第二,领域扩展使用同一批查询设计并验收,存在明显测试泄漏。生产做法应该从历史搜索日志构造开发集,再用时间切分后的保留集验收;阈值也要在开发集选择,在测试集只运行一次。
第三,字符三元组不是 embedding。它能捕获字面片段,却无法可靠处理“离职”和“离开公司”这类真正的语义等价。本文不能据此评价任何向量模型、向量数据库或 reranker。
第四,本实验只验证检索排序,没有生成回答。RAG 的最终失败还可能发生在切分、上下文组装、引用映射、模型拒答和工具权限。即使正确文档排第一,模型也可能忽略关键限制或引用错版本。
第五,无答案阈值只测试两条负例。一个稳定拒答器至少要覆盖近邻但无答案、越权问题、过期文档、恶意查询和答案冲突,并记录精确率、召回率与人工升级成本。
商业价值
会为这项能力付费的不是“想拥有向量数据库”的团队,而是客服、合规、售前和内部支持部门。他们购买的是更高的一次解决率、更少的错误升级和可追踪引用。
单位经济模型应写成:
每次有效检索的净收益
= 节省的人工查找时间 + 减少的错误处理损失
- 索引与模型成本 - 评测维护 - 内容治理 - 人工复核
在术语稳定、语料规模有限且需要强可解释性的业务里,显式扩展加 BM25 可能比直接增加模型组件更便宜。相反,跨语言、长尾表达和非字面语义很多时,维护同义词表会迅速失控,此时应该引入固定 embedding、reranker 和更大盲测集。是否升级由失败样本决定,而不是由行业流行架构决定。
可证伪门槛是:在至少 500 个时间隔离查询上,候选链路必须同时改善 MRR@10、最终答案引用正确率和无答案召回,并且每次正确解决的总成本不高于人工基线。如果只提高召回却增加错误自信回答,就不具备商用价值。
复盘
这次实验把一个常见架构讨论改写成了可检查问题:哪条检索链在固定任务上把正确文档排得更前?结果不支持“融合必然更好”,也不支持“BM25 足够替代向量检索”。更重要的是,审计推翻了第一版由零分 tie-break 造成的退化结论,说明评测代码本身也必须有负例和可复核排名。稳健顺序应是:先定义候选,再验证指标,最后才增加链路复杂度。
下一阶段会增加真实 embedding 基线、cross-encoder reranker、版本冲突文档和回答引用评测。只有这些代码、模型 revision、输入与原始输出全部固定后,才会比较“词法、向量、混合、重排”的收益。
方法披露
本文使用 AI 工具协助代码审查、文字整理和 SVG 草拟;语料、查询标签、检索实现、测试、原始结果、指标解释和最终结论由作者逐项检查。封面图是对实验数据流的原创重绘,不代表额外测量。
修订记录
2026-07-13:初版发布并完成指标审计;加入 12 份合成策略、12 个查询、四条检索链路、9 个自动测试、严格的 MRR@10 截断、零分候选过滤与工件完整性检查,并撤回由 tie-break 工件造成的旧退化结论。
Reusable projects
关联可复用项目
本文已经进入以下工程项目;项目页提供固定版本、运行命令和结果工件。
- 已独立复现
本文使用 12 条策略文档和 12 条查询比较四种词法策略,固定排序指标、拒答决策和失败样本。
Source ledger
来源账本
以下来源用于核对事实、日期与当时可用范围。厂商自报性能不视为本站独立复现。
讨论