Appearance
9.4.1 RAG 评测集应该怎么构建?
先给结论:RAG 评测集不是“问题列表”,而是一套有结构的样本资产。它至少要把问题、标准答案或参考判断、证据范围、任务类型、难度标签和错误归因线索组织在一起。没有结构的题库,很难稳定支持调优和归因。
很多团队刚开始做评测集时,会先收集一批“常见问题”,然后直接跑系统看效果。这个动作不能说完全没用,但它往往只能回答一个很粗的问题:
- 这套系统大致能不能答
但它回答不了更关键的问题:
- 是检索没找回来,还是生成没忠实使用证据
- 是所有问题都不稳,还是只在某几类任务上掉线
- 是数据覆盖有问题,还是 query 理解、过滤、rerank、上下文构造出了问题
如果评测集不能支持这些判断,它就不够好。
一套能用的 RAG 评测集,通常至少要包含什么
最少应该把样本组织成下面几层信息:
query:用户问题本身task_type:问题属于哪一类任务difficulty:这道题的难度层级expected_evidence_scope:正确答案应该依赖哪些文档、段落、表格或字段reference_answer或judging_rule:标准答案,或者清晰的评判标准metadata:业务域、时间范围、租户、语言、产品线等上下文failure_tag:如果这是一道线上失败回流样本,记录它原来的错误类型
其中最容易被忽略的是两项:
expected_evidence_scopejudging_rule
如果没有证据范围,你很难判断检索是否真的找到关键材料;如果没有评判规则,你就只能靠“看着像对”来打分。
不要把评测集当成题库,要把它当成诊断资产
真正有用的评测集,不只是为了算一个分数,而是为了支持下面这些工作:
- 比较两版 chunk 策略谁更好
- 判断新增 rerank 之后提升的是哪类问题
- 定位某次数据更新后为什么一类问题突然退化
- 区分“回答错了”到底是检索问题还是生成问题
所以评测集设计时,最好一开始就想清楚它服务哪些评测维度。通常可以分成三类:
- 检索层样本:重点看证据能不能找回来
- 生成层样本:重点看答案是否忠实、完整、符合任务要求
- 端到端样本:重点看最终体验和任务完成度
这三类样本可以重叠,但不要完全混成一类。否则最后只会得到一个模糊的总分。
更实用的构建顺序
如果你是从 0 开始做一套评测集,更稳的顺序通常是下面这样:
第一步,先定评测目标,而不是先凑题
先问清楚:
- 这套评测集主要用来验收什么
- 主要服务离线调优,还是版本回归检测
- 主要测 FAQ 问答、复杂知识问答、跨文档归纳,还是工具路由前的知识判断
如果目标不清楚,样本很容易越收越杂,最后谁都不满意。
第二步,先定义任务类型,再补样本
不要一开始就只靠业务同学随手给问题。更稳的做法是先定义任务桶,例如:
- 单文档事实问答
- 多文档综合问答
- 带过滤条件的问题
- 带时间边界的问题
- 需要表格或结构化字段支持的问题
- 资料不足时应拒答的问题
先把桶定义出来,再往桶里填样本,评测集才不容易偏斜。
第三步,给每类问题做难度分层
同样是“问答”,难度差别可能很大。至少可以先分成三层:
- 简单题:答案集中、证据单一、表达直接
- 中等题:需要在多个 chunk 之间拼接信息,或者问题本身略有歧义
- 困难题:涉及跨文档、多条件、时间版本、例外规则或资料不足判断
如果评测集几乎全是简单题,那它再大也很难说明系统上线后是否稳。
第四步,明确标准答案和证据依据
这一步很费时间,但价值极高。你至少要回答:
- 正确答案应该是什么
- 正确答案依赖哪些证据
- 允许哪些表述差异
- 哪些说法算错
- 哪些属于“看似合理但超出证据”
对于开放式问题,不一定非要有唯一标准答案,但必须有清晰的判定规则。
第五步,把线上失败问题持续回流
一套评测集如果从建立那天起就不再更新,它很快会失真。真实系统里最有价值的样本,往往来自这些来源:
- 用户投诉或人工复核失败样本
- 新版本上线后的回归问题
- 线上日志里高频但低满意度的问题
- 检索命中率看似正常,但回答质量异常的问题
这些样本能不断把评测集拉回真实世界。
一个更像真实工程的样本结构示意
下面是一个极简示意,重点不在格式本身,而在字段意识:
python
sample = {
"query": "2026 年企业版退款规则里,哪些情况不支持退款?",
"task_type": "single_doc_fact_qa",
"difficulty": "medium",
"metadata": {
"domain": "refund_policy",
"lang": "zh",
"tenant": "enterprise"
},
"expected_evidence_scope": {
"doc_ids": ["refund-policy-2026"],
"sections": ["2.3", "2.4"]
},
"reference_answer": [
"超出试用期后按约定条款执行",
"定制化服务已开始交付时不支持无条件退款"
],
"judging_rule": {
"must_include": ["试用期", "定制化服务"],
"must_not_claim": ["所有已付款订单都不可退款"]
}
}这个结构的价值在于,它能支持更细的评测和归因,而不是只看“最终答得像不像”。
小团队一开始不需要追求完美,但要先避免三个坑
坑一,只收“最容易答对的问题”
很多人会先从产品文档里挑几道很标准的问题,这样系统分数会很好看,但没有多少诊断价值。
坑二,只有标准答案,没有证据边界
没有证据边界时,你很难判断回答是忠于资料,还是模型自己补全出来的。
坑三,样本只来自离线整理,不来自线上失败
这样会让评测集越来越像“内部理解的问题”,而不是“用户真的会问的问题”。
更现实的起步建议
如果你的系统还在早期,不需要一开始就做成很大的评测平台。更现实的起步方式通常是:
- 先做一个小而结构化的基线集
- 覆盖 5 到 8 类关键任务
- 每类先放少量高价值样本
- 给样本补上证据范围和评判规则
- 每次版本变化后看哪类题退化
- 持续把线上失败样本回流进来
先把结构搭对,比一上来堆很多题更重要。
一句话总结
好的 RAG 评测集,不是题越多越好,而是要让每道题都能帮助你判断系统到底哪里强、哪里弱、哪里正在退化。