跳到主要内容

检索与生成系统评估:从证据命中到回答正确

回答读起来顺畅,不代表资料找对了;引用确实存在,也不代表它支持那句话。评估检索增强生成系统时,要把“找到证据”和“根据证据回答”拆开,再检查组合后的结果。Ragas 论文把检索上下文、回答忠实性和生成质量区分为不同评估维度,并探索模型辅助评分。

一条测试样本需要什么

假设要评估虚构的设备手册助手。一条样本不仅保存问题和参考答案,还应保存适用手册版本、支持答案的原文位置、必须提到的条件,以及没有证据时应如何回应。自然语言答案可以有多种正确表述,原文证据和关键事实比单一标准句更稳定。

测试集中应同时出现精确编号查询、同义改写、多段组合、过期与现行版本冲突、语料中无答案等情况。问题最好来自预期使用场景;全由同一个模型根据文档生成,容易过于贴近原文词汇,低估真实用户表达造成的困难。若用生成问题扩大覆盖,仍需抽样人工核对其可回答性和证据。

把近重复问题放进同一划分,避免调参问题的改写进入测试集。固定语料快照,否则上次没有答案、这次已经新增文档的题目无法直接比较。

召回率与排名回答不同问题

对于一个问题,如果共有 3 个已标注的相关片段,前 5 项里出现了其中 2 个,则 Recall@5 = 2/3。但相关片段不一定需要全部进入答案:有的互为重复,有的分别提供必要事实。应同时记录“是否找齐解题所需的事实”,避免用大量重复标注美化召回。

MRR 关注第一个相关结果的位置。若三个问题的首个相关结果分别位于第 1、第 4 位和未命中,MRR 为 (1 + 1/4 + 0) / 3 ≈ 0.417。它适合需要尽快找到一个有用结果的任务,却不能确认多证据问题是否找全。nDCG 可使用分级相关标签,衡量高价值结果是否靠前,但仍依赖标注质量。

rankings = [["a", "b", "c"], ["x", "y", "z"], ["m", "n", "o"]]
relevant = [{"a", "c"}, {"z"}, {"p"}]
recalls = [len(set(r) & truth) / len(truth)
for r, truth in zip(rankings, relevant)]
print(round(sum(recalls) / len(recalls), 3)) # 0.667

这里计算的是三个虚构问题的宏平均 Recall@3;每个问题权重相同。如果没有穷尽相关片段的标注,应说清“已标注相关项的召回”,不要把未标注都判为无关。

忠实、正确、完整要分别判

忠实性问:答案中的主张是否得到提供上下文的支持?正确性问:主张是否符合适用的事实?完整性问:关键条件是否遗漏?如果上下文来自过期手册,答案可以忠实复述,却对当前版本错误。只输出一句正确但无关的话,也不能通过完整性与问题相关性检查。

引用还需要两种检查:每个引用是否真的支持相邻主张,以及需要证据的主张是否都有来源。一个答案附上很多链接,不能证明这两项成立。对“找不到依据”的题目,应单独统计错误作答和适当弃权,避免系统靠猜测提高表面完成率。

模型评分器适合批量筛查,但评分提示、参考资料和模型版本都可能影响结果。可把同一答案的顺序和措辞改变后重评,检查评分是否稳定;对高低分分歧与临界例子做人工抽查。不要让被测模型自己一句“通过”就充当结果证据。

用四种输入定位瓶颈

在同一组问题上比较以下条件,保留相同生成模型与回答预算:

条件能帮助判断什么
不提供文档模型靠已有知识或猜测能做到什么
提供人工选定的正确证据给足证据后,生成环节是否仍失败
提供真实检索结果实际端到端效果
在正确证据中加入相似但无关或过期片段系统是否会被干扰材料带偏

这些是诊断实验,不要求任一条件必然优于另一条件。若人工证据仍无法使答案正确,先检查问题、指令与生成模型;若人工证据表现好而真实检索差,再沿检索流程查看召回、重排和组装的损失。

改进必须兼顾成本与分布

比较新旧方案时用同一批问题做配对分析,查看哪些变好、哪些变坏,而不只看平均分。报告样本量和抽样方式,小样本的一两题变化不能直接当作稳定提升。重复生成可观察随机波动;按问题重采样可估计整体指标的不确定性,但不能弥补样本本身缺少目标场景。

同时记录首字延迟、总延迟、检索与生成资源消耗、无答案题的弃权率。增加候选和上下文可能提高召回,也可能增加延迟和干扰。真正要选的是在目标问题分布与预算下表现合适的系统,而不是某个孤立最高分。

斯坦福信息检索教材的排序结果评估章节 从有序结果推导 precision–recall 曲线、平均精确率和折扣增益。先跟踪加入一个相关或不相关结果时曲线怎样变化,再拿自己评估集里的一小段已标注排序手算。

探索关联打开关联网络