RAG 很难评估,不是因为缺工具,而是因为错误可以发生在不同层,却表现为同一个「答案不对」。
只看最终准确率,你会把索引问题当成提示词问题,把路由问题当成模型问题,把拒答缺失当成幻觉。RAGMap 要求把失败拆开。
一条路径至少有四级:
索引质量 → 召回质量 → 生成对证据的使用 → 路由是否选对路径
每一级都该有自己的观察。RAGAS 把生成侧拆成上下文相关性、忠实度、答案相关性,是这个方向上被用得最广的分解。它不是唯一标准,但它强迫你停止只用一个分数管理整个系统。
- 金证据所在的对象是否存在(有没有被切丢、抽丢)?
- 更新后,旧对象是否还指向正确版本?
- 金证据是否进入候选?
- 进入了第几名?会不会被重排挤出窗口?
- 答案能否被证据支持(忠实)?
- 证据不足时是否拒答?
- 是否回答了问题本身(而不是复述一段相关百科)?
- 这条查询该走哪条路径?
- 实际走了哪条?
- 费用和延迟是否符合约束?
没有这四级日志,ablation 是假的。
用错基准,会选出漂亮但无用的赢家。
| 你真正关心的问题 | 更接近的评测 | 不该当成主基准的东西 |
|---|---|---|
| 局部事实 / 手册 | 带引用的文档 QA,自建金证据 | 纯多跳榜 |
| 多跳事实 | HotpotQA, 2Wiki, MuSiQue | 主题综括题 |
| 全局主题 | GraphRAG 一类 QFS / LLM-as-judge | EM/F1 短答案 |
| 长叙事状态 | 长上下文叙事基准(ComoRAG 所用一类) | 单跳百科 |
| 混合入口 | 自建路由集 + 费用 | 单一数据集 SOTA |
论文在某一基准上的胜利,只说明它在那个任务分布上成立。把它迁到你的流量之前,先看你的流量更像表里的哪一行。
下面的分类适合写进标注规范。比「幻觉」有用。
- 切块失败:证据存在,但不构成可检索对象。
- 表示失败:对象在,问法与写法错位,近邻找不到。
- 结构失败:需要边或社区,系统只给了段落。
- 动态失败:需要中间变量,系统只检索了一次。
- 状态失败:需要改写旧理解,多轮检索互不相认。
- 忠实失败:证据对,生成仍添加了证据外事实。
- 过度生成:证据不够,系统不拒答。
- 路由失败:能力存在,但走错了路径或付错了费用。
- 抽取失败:图上的边是错的,后续遍历在传播错误。
每一类对应不同的修复。把它们混成「再换一个模型」是最贵的懒。
- 用最终准确率代替路径准确率。 路由器选错路,下游碰巧答对,会掩盖控制错误。
- 在单一复杂度的数据集上训练分类器。 它会学到数据集偏置,而不是问题结构。
- 不计入费用。 永远走 agentic 的系统可以在复杂集上更好看,同时在真实流量上不可用。
- 没有 gold path。 至少要有「不该走 agent」的负例。
短答案 EM/F1 对事实题仍然有用。综括题、解释题、全局主题题往往没有唯一金答案。GraphRAG 用 LLM-as-judge 比较全面性和多样性,是在承认任务形态变了。
使用 LLM-as-judge 时写明:
- 比较的标准是什么(忠实、覆盖、多样、简洁);
- 法官模型与被评模型是否隔离;
- 是否用交换顺序缓解位置偏差。
不要用「GPT 觉得更好」代替标准。
如果你只能做五件事:
- 从真实失败里标 50 个查询,写下错误类型。
- 为每个查询标金证据,不只标金答案。
- 分开报召回、忠实、端到端。
- 若有多条路径,报路径分布和 P95 延迟。
- 每次改索引或改路由,先跑这 50 个,再看大盘。
这 50 个案例会比又一份框架默认评测集更接近你的系统。
评估是为了让地图可证伪。下一篇把论文放回枝条,避免文献变成另一份不可证伪的收藏。