RAG 回答错误不一定是模型问题:可能没找到文档、排序错误、证据不足,或模型没有正确引用。评测时要把检索和生成 拆开。
检索层指标
假设金标相关文档是 {d1, d3},Top-3 检索结果是 {d1, d2, d4}:
Recall@3 = 1 / 2 = 0.5:找回了多少应找文档。Precision@3 = 1 / 3 ≈ 0.33:返回结果中有多少相关。
def recall_at_k(retrieved: list[str], relevant: set[str], k: int) -> float:
return len(set(retrieved[:k]) & relevant) / len(relevant)
print(recall_at_k(["d1", "d2", "d4"], {"d1", "d3"}, 3)) # 0.5
没有完整金标时,可以人工标注 Top-k 相关性,或检查“答案所需关键证据是否出现”。
生成层要按 Claim 检查
Claim 是回答中可验证的事实断言。将回答拆成 Claim,再判断每条是否被证据支持:
- Faithfulness:回答是否只说证据支持的内容。
- Completeness:问题要求的关键信息是否覆盖。
- Citation correctness:引用是否指向真正支持该 Claim 的片段。
- Refusal correctness:证据不足时是否拒答。
先固定一层再调另一层
评 Retriever 时使用固定查询和金标文档,不让模型生成波动干扰。评 Generator 时提供固定证据,确认它能否忠实回答。 最后再跑端到端组合。
Agentic RAG 还要评路径
若 Agent 会改写查询、分解问题或多跳检索,还应记录查询序列、调用次数、停止原因和每跳新增证据。最终答案正确也不能 掩盖跨租户检索或无限循环。
成本同样是指标
同时报告延迟、检索次数、重排成本、输入 Token 和每次成功成本。只提高 Recall 而让 P95 延迟翻倍,未必适合生产。
下一步
阅读 Tool 与 Agent 评测,从一次工具选择扩展到完整任务轨迹。