
RAG 精度评估:把业务专家写的标准答案拆成要素来测
RAG 精度评估:把业务专家写的标准答案拆成要素来测
业务部门写的标准答案里,往往混着检索文档里根本没有的内容。这篇教程讲一套要素级的评估方法:把标准答案拆成固定要素,逐条判断「检索到了吗」「文档里有吗」「回答里写了吗」,从而把精度不足的原因分到检索、生成、文档三处,而不是一味去调检索参数。
用检索增强生成(RAG)做内部问答服务时,评估环节最容易踩的坑不是指标选错,而是标准答案本身的性质和评估假设不一致。如果标准答案由业务人员按实际工作经验撰写,那么一条答案里常常同时包含「文档里写了的」和「文档里根本没写的」两类内容。前者可以靠检索拿到,后者无论怎么调检索参数都拿不到。本文介绍一套要素级的评估方法:把每条标准答案拆成固定要素,逐条判断「检索到了吗」「文档里有吗」「回答里写了吗」,从而把精度不足的原因分别归到检索、生成、文档三个位置,而不是把时间全花在检索参数上。
适合阅读本文的读者:正在为 RAG 系统搭建评估集、已经有一批人工撰写的标准答案、并且发现自动评分结果与一线体感对不上的人。文中涉及具体指标定义时,以所用评估库的当前文档为准。
准备工作
开始之前需要确认几件事,缺一件后面的流程都跑不通。
- 一套可运行的 RAG 服务,检索与生成两段可以分别调用,并且能拿到检索返回的文档列表与打分。
- 一批真实问题。最好来自实际使用场景中用户真正问过的问题,而不是从文档语料反向生成的问题。从语料生成的问题,答案必然在文档里,本文要处理的那类问题不会暴露出来。
- 业务人员撰写的标准答案。请业务人员按「实际工作中应该怎么答」来写,不要限制他们只能引用检索范围内的文档。
- 一个可调用的 LLM 作为评分员,用于拆分要素和逐条判定。建议准备两个不同的模型做交叉判定。
- 一份人工标注的校准集,用来验证自动判定的可靠性。
- 结果落盘机制。要素拆分结果、每次判定结果、重测记录都要能存下来,否则前后对比没有基准。
指标定义本身不需要自己发明。常用的开源评估库已经提供了对应概念:检索侧的「上下文召回率」衡量标准答案的要素有多少出现在检索回来的文档里;生成侧的「事实正确性」中的召回部分衡量要素有多少出现在最终回答里。本文沿用这两个定义,只改动两处:把要素的切分方式固定下来,以及给取不到的要素补一个判定维度。
操作步骤
第一步:先确认问题真的存在
不要一上来就改评估框架。先用现有指标跑一遍,看低分问题是否集中在某类问题上。如果检索日志里没有明显混入无关文档的痕迹,但分数依然偏低,就值得把低分问题的标准答案与文档原文逐句对照。
对照时会看到一种典型结构:一条标准答案的前半段能在文档里找到原文,后半段找不到。例如某个问题问「傍晚导出明细表时报错,营业网点是否需要处理」,标准答案前半段是「在明细表中确认识别编号和消息内容」,这在文档里有;后半段是「大多数情况下不需要营业网点处理」,这来自业务经验,检索范围内没有任何文档写过。
如果抽查的多条标准答案全部呈现这种混合结构,既没有纯文档来源的,也没有纯文档外的,那就可以确认:这不是标准答案写错了,而是文档本身没有把实务的全部内容写下来。
第二步:把标准答案拆成要素并固定下来
用 LLM 把每条标准答案拆成要素,粒度定为「一个事实或一个条件算一个要素」。拆分完成后把结果保存下来并冻结,后续每次评分都复用同一份拆分结果。
这一点很关键。如果每次评分都重新拆一遍,LLM 拆分方式的波动会混进前后对比里,导致分不清分数变化是系统改动带来的还是拆分抖动带来的。
拆分规模可以参考:298 道题拆出约 1093 个要素,平均每题 3.7 个要素,范围在 1 到 8 个之间。
拆分结果大致长这样:
{
"id": "q-0xx",
"elements": [
"在明细表中确认识别编号和消息内容",
"大多数情况下不需要营业网点处理"
]
}注意这里暴露出的问题:如果按「整道题能不能答」来打标签,上面这条答案既算能答也算不能答,标签根本贴不上去。只有拆到要素级别,才能表达「前半段取得到、后半段取不到」。
第三步:每次评估时判定要素是否可检索
要素在正常检索条件下没被取到时,需要区分两种可能:是检索方式不对,还是文档里压根没写。这个判断不要做成静态标签,而要在每次评估时重新验证。
做法是:对正常条件下要素覆盖率低于六成的题目,放宽检索条件重跑一遍,用同一个评分员做比对。放宽的地方有两处:
- 去掉检索端按分数做的截断过滤;
- 把交给 LLM 的文档数量从正常流程的前 10 条扩大到前 20 条。
查询语句保持与正常流程一致,不要改写。评分员用两个不同的 LLM 各判一次并取平均,两者结论不一致的案例单独记录下来,供后续人工复核。
判定结果按题目维度落盘,格式类似:
{
"id": "q-0xx",
"result_label": "文档侧存疑",
"covered_elements": ["在明细表中确认识别编号和消息内容"],
"newly_covered_in_loose": [],
"uncovered_in_loose": ["大多数情况下不需要营业网点处理"]
}这样每个要素会落到三种状态之一:正常条件下取到了、放宽条件后取到了、放宽条件后仍然取不到。
需要明确一点:放宽条件后仍然取不到,不能证明文档里没有。文档可能用了另一种表述方式而没被匹配上。所以这类结果只能标记为「文档侧存疑」,不能直接当成结论。
第四步:把缺口按修复位置分类
把第二步的要素拆分和第三步的判定结果叠在一起,就能把「回答里缺失的要素」按应该去哪里修来分类:
| 缺口类型 | 典型例子 | 修复位置 |
|---|---|---|
| 检索配置能找回的 | 放宽条件后能取到的要素 | 调整检索参数或索引 |
| 生成侧漏写的 | 证据已在上下文中,但回答没写条件和例外 | 调整提示词或生成流程 |
| 检索范围内缺失的规程 | 法定金额标准、通知规定的表单、只存在于附件中的流程 | 把文档加入检索范围 |
| 只存在于主管人员经验中的知识 | 「大多数情况下不需要营业网点处理」这类运营判断 | 把知识写进文档 |
在一组 298 题的评估集上做这个分类,结果往往和直觉相反:靠检索配置能找回的部分不到一成,大约一半是生成侧漏写,剩下近一半在文档侧。如果没有这个分类,很容易把时间全花在检索参数调优上。
第五步:修正与产品形态冲突的要素
文档外的要素要保留,但有一类要素必须删掉:与产品回答方式相冲突的要素。
典型情况是标准答案里包含「详细内容请参见某某规则集 > 审批权限 > 某某」这类规定所在位置的指引。而该 RAG 的回答形态是用正文编号加引用列表来标出来源,正文里不需要写所在位置;一旦让模型在正文里写位置,当检索没有命中正确章节时,反而会指引到错误的地方。
也就是说,这类要素即使回答完全正确也无法满足,属于度量工具本身的缺陷,而不是文档外知识。处理方式是:
- 删除:只包含所在位置指引的要素,以及把章节名称改写成「某某属于某某」的要素;
- 保留:像界面操作路径这样「位置本身就是答案」的要素。
在一组包含大量位置指引的 25 题上,仅删除这类要素、系统完全不动,覆盖率就上升了约 0.13。这说明度量缺陷本身会制造出「这群题精度低」的假象。
第六步:修正度量后只重测被改动的行
改完标准答案后如果全量重测,那些没有改动的题目群也会因为测量波动而小幅变化。波动主要来自生成回答的 LLM:同一套配置测两次,题目级覆盖率的波动标准差约为 0.14。放到 298 题的全量平均上,随机波动幅度约 ±0.015;但放到 25 题的题目群上,会扩大到约 ±0.05。
如果直接把全量重测结果拿去汇报,没有改动的群可能涨了 0.02,读起来就像「改进了」,其实什么都没改。
正确做法是:只重测标准答案被修改的那些题目,用新结果替换基准中的对应行,汇报数字从这个替换后的基准汇总。哪些行在什么时候重测过,要记录在结果文件里。
关键是把这件事作为流程事先定下来,而不是看到结果之后再挑对自己有利的那一版。
一个完整示例
下面走一遍从问题到结论的最小流程。
场景:某内部问答服务,检索范围是一批事务流程文档。评估集 298 题,标准答案由业务部门撰写。
第 1 步,发现问题。自动评分显示,文档里明明有答案的题目,覆盖率只有一半左右,且这类低分题占比不低。检索日志中没有明显混入无关文档的痕迹。
第 2 步,逐句对照。抽查 6 条低分题的标准答案,全部包含文档中查不到的内容,且没有一条是纯文档来源或纯文档外来源。
第 3 步,拆分要素。用 LLM 把 298 条标准答案拆成 1093 个要素,平均每题 3.7 个,保存并冻结。
第 4 步,逐要素判定。对正常条件下覆盖率低于六成的题目,去掉分数截断、把文档数从 10 扩到 20 重跑,用两个 LLM 评分员取平均,分歧案例单独记录。判定结果按题目落盘,包含 covered_elements、newly_covered_in_loose、uncovered_in_loose 三个字段。
第 5 步,分类缺口。把结果汇总后发现:检索配置能找回的不到一成,约一半是生成侧漏写条件或例外,近一半在文档侧。
第 6 步,修正度量。删除标准答案中纯位置指引类的要素,保留操作路径类要素。25 题的位置指引密集群覆盖率上升约 0.13,系统未做任何改动。
第 7 步,只重测改动行。仅重测标准答案被修改的题目,替换基准中的对应行,汇报数字从替换后的基准汇总,重测记录写入结果文件。
走完这一轮,评估结果不再只反映「RAG 的精度」,还同时反映了「有多少业务知识是文档里没写的」。
注意事项
- 要素拆分必须冻结。每次评分重新拆分会让 LLM 的拆分波动混入前后对比,无法判断分数变化来自哪里。
- 「放宽后仍取不到」不等于「文档里没有」。文档可能用了别的表述方式而没被匹配上,这类结果只能作为「存疑」处理。
- 评分员建议用两个不同模型取平均,分歧案例要记录下来供人工复核。判定结果需要用人工标注的样本做过校准,例如用 107 条人工标签比对过。
- 不要用从语料反向生成的问题做评估集。这类问题的答案必然在文档里,本文要处理的混合型标准答案根本不会出现。
- 测量波动不可忽略。同一配置测两次,题目级覆盖率波动标准差约 0.14;全量 298 题的平均波动约 ±0.015,25 题的题目群会扩大到约 ±0.05。小题目群上的小幅变化不足以支撑结论。
- 度量修正和系统改进不要混在一起汇报。先定好「只重测改动行」的流程,再执行,避免事后挑选有利结果。
- 标准答案里的位置指引类要素要单独处理。判断标准是:这个要素在回答完全正确的情况下能否被满足。不能满足的,属于度量缺陷。
- 文中涉及的评估库指标名称、模型行为、参数默认值都可能随版本变化,实际使用时请以所用工具与服务的官网当前信息为准。