26-AI评估与失败样本

O泡李华 7

怎样证明 AI 回答变好了?RAG 与 Agent 的评估体系

几次人工提问都答对了,无法证明系统稳定;一个平均分也可能掩盖越权和金额错误。评估先定义成功是什么,再分别观察证据、回答、执行过程与成本。

1. 先建立可重复的问题集

问题、权限、来源、正确要点与拒答条件一起保存。

建立问题集时需要保存什么?

每个问题保存 ID、原问题、文档版本、相关资料或片段、关键事实、允许答案范围,以及是否应该拒答。多租户场景还要保存测试身份与允许范围。

类别 示例目的
明确事实 是否能找到单个规定
例外条件 是否遗漏限制条款
专有名称与编号 是否准确命中特定对象
多段组合 是否能组成完整证据
无答案 是否拒绝编造
版本与权限 是否使用有效且允许的资料

调参集与最终评估集应分开。用户真实失败问题也要加入后续回归,但不能因此偷偷改掉原有标注来让指标变好。

检索指标各自表示什么?

Recall@k 是已召回相关项占全部标注相关项的比例;Precision@k 是前 k 项中相关项的比例;MRR 关注首个相关结果的位置;nDCG 可以考虑分级相关性和排名。

必须先定义相关项是原文档还是 Chunk。一个文档拆成十个片段后,标注文档命中和标注全部相关片段,含义不同。

多段联合证据也不能只看“命中任意一段”。例如退货规则和例外缺一不可,应额外评估所需证据是否完整覆盖。BEIR 等研究强调跨任务评估,不能用单一语料的结果概括所有检索场景。BEIR

2. 用明确公式计算检索指标

完整示例区分相关集合、排序与无答案样本。

一个独立的指标计算示例

下面 Python 程序使用人工指定排序,展示公式,不调用模型或向量库。保存为 retrieval_metrics.py。

def metrics(ranked, relevant, k):
    if k <= 0:
        raise ValueError("k must be positive")
    if len(ranked) != len(set(ranked)):
        raise ValueError("deduplicate ranked ids first")
    if not relevant:
        raise ValueError("no-answer queries need separate evaluation")
    top = ranked[:k]
    hits = sum(item in relevant for item in top)
    first = next((i for i, item in enumerate(top, 1) if item in relevant), None)
    return {
        "precision_at_k": hits / k,
        "recall_at_k": hits / len(relevant),
        "reciprocal_rank_at_k": 0 if first is None else 1 / first,
        "all_required_evidence_found": relevant.issubset(set(top)),
    }

if __name__ == "__main__":
    print(metrics(["noise", "policy", "exception"], {"policy", "exception"}, 3))

按公式,预期 Precision@3 和 Recall@3 分别为 2/3、1,倒数排名为 1/2,完整覆盖为 true。这个示例把 relevant 视为都必需的证据集合;存在多套替代证据时应另外建模。

该实现的 Precision 分母固定为 k,不足 k 条时空位视为未命中。实际工具可能选择不同约定,报告里要写清楚。MRR 是对多个问题的倒数排名取平均,不能将一个问题的值直接称为整体 MRR。

回答指标为何要与检索分开?

资料找到但模型忽略了例外,是生成或 Prompt 问题;资料根本未进入候选,是检索链问题。只用最终答案评分,会把原因混在一起。

可以逐项检查事实正确性、证据支持、完整性、引用是否对应原文,以及是否包含未支持断言。措辞流畅不是事实依据。

可给生成阶段直接提供人工选定的正确证据,建立“理想检索”对照。如果仍然回答错误,继续扩大向量候选可能没有作用。

拒答也需要正反两面评估

无答案时编造需要减少;有充分证据却拒答也会降低可用性。分别计算无答案问题的正确拒答比例,以及可回答问题的错误拒答比例。

权限导致不能回答与知识库没有答案也不同。评估可以内部分类,但对外不应泄露“另一租户确实有这份文件”。

冲突资料、过期资料和问题条件不完整也应纳入样本。拒答不一定只是固定一句“没有结果”,可能需要澄清或提示版本无法确认。

模型评分可以替代人工吗?

模型裁判适合辅助批量筛选,但可能偏好自己的表达、被答案中的指令影响,或漏判细微事实错误。需要明确评分标准、固定评估模型与 Prompt,并用人工抽检校准。

报告同时保留样本数、按类别的结果、失败例子、耗时和成本。只有一个平均分,可能掩盖金额、权限等关键问题。本文没有虚构任何实际质量提升数据。

3. 控制变量,按失败类别比较

文档、配置、模型和样本固定,逐个加入候选优化。

合成样本怎样设计?

使用虚构的制度文档与两类租户,不使用真实员工信息。问题包括直接规则、专有编号、例外、跨段说明、旧版本冲突、无依据和越权。

每个问题保存应检索来源、关键答案要点与拒答要求。下面是评估记录的结构示例:

{
  "sampleId": "policy-exception-001",
  "userScope": "tenant-a-finance",
  "question": "临时出差到特殊地区的住宿标准如何确定?",
  "requiredEvidence": ["travel-v2-section-3", "travel-v2-appendix-a"],
  "expectedPoints": ["说明普通标准", "说明例外条件", "引用附表"],
  "mustReject": false,
  "forbiddenEvidence": ["tenant-b-secret"]
}

这是虚构评估样本,不代表任何企业真实制度。开发集用于调整参数,留出集用于最终比较,避免把所有样本反复调成正确答案。

从失败位置分类

下面列出要检验的失败假设,不是运行结果:

假设样例 可能失败位置 需要查看的证据
例外附表未召回 解析、切分或召回 原文、片段、候选
编号问题无结果 语义匹配不足 关键词与向量候选
正确片段排得很后 排序问题 候选及排序分数
候选正确仍漏条件 上下文或生成 最终提示上下文、回答
旧版规则被采用 版本过滤 文档状态与查询条件
其他租户标记出现 权限链路 检索、重排、缓存、请求

先确认原文被正确解析,再检查片段是否完整,之后看候选和最终上下文。不要把所有失败统称为“模型幻觉”。

每次只改变一个主要因素

实验 A 改进切分,让规则与例外保持可关联;实验 B 加关键词检索并融合;实验 C 对固定候选集重排;实验 D 增加受限查询改写。

按问题类型比较,避免只看总平均。关键词可能改善编号问题,却对自然语言问法帮助有限;重排可能改善候选排序,但增加等待和费用。

消融实验移除其中一个组件,检查效果是否下降。如果复杂方案移除重排后表现相当,就应重新考虑维护这个组件是否值得。为什么语义相似仍然找不到?Embedding、关键词与混合检索、RAG 怎样取得完整证据?重排、改写与拒答。

避免每轮同时换模型、切分和提示词,最终即使指标变化,也很难解释是哪项改动导致。

指标和记录怎样组织?

检索观察证据覆盖,例如每个样本要求的证据片段是否进入 Top K;回答观察关键要点、依据支持与正确拒答;权限泄漏独立统计,不能被高平均准确率抵消。

延迟分开记录检索、重排、模型首片段和完整完成时间。费用包括 Embedding、重排、改写与生成,不能只计算最后一次模型请求。

以下表保留为待测量记录,不填入虚构数值:

配置 证据覆盖 答案要点 正确拒答 权限泄漏 延迟 / 费用
基线 待测量 待测量 待测量 待检查 待测量
切分调整 待测量 待测量 待测量 待检查 待测量
混合检索 待测量 待测量 待测量 待检查 待测量
候选重排 待测量 待测量 待测量 待检查 待测量

如果用模型评分,还要抽样人工复核,检查评分模型是否偏向长答案、错误引用或自身风格。评价本身也可能出错。

怎样形成有边界的结论?

结论写明在哪些样本、配置和权限条件下改善,增加了什么成本,还存在哪些失败。不要从几十条制度问题推导所有企业文档都适用。

没有测量前,能得出的结论是“优化流程已设计,候选方案和评价方法明确”,不能说“准确率显著提升”。真正完成实现后,将逐样本记录、配置版本和失败案例补入文章。

上线也保留回退配置,观察新文档与真实用户问法。离线样本通过不代表线上输入分布永远一致。

4. Agent 还需要检查执行轨迹

最终答案之外,工具权限、停止原因和实际环境状态同样属于结果。

单 Agent 基线怎样建立?

保持相同模型、工具集合、业务权限和测试问题,先记录单 Agent 的任务完成情况。样本要包含正常问题、缺少编号、权限不足、下游超时以及资料冲突。

观察完成率、错误工具调用、依据完整度、整体延迟、费用和停止原因。不要只比较最终回答的长度。更长的回答可能只是重复了多个子任务的内容。

再运行分工方案,比较它在哪类问题上改善、在哪类问题上退化。没有真实评估之前,可以说“设计上允许并行查询”,不能写“性能提高了某个百分比”。

正常完成、主动停止和失败要分开

任务停止至少包含 COMPLETED、NEEDS_USER_INPUT、BUDGET_EXCEEDED、CANCELLED、FAILED。这些状态决定界面怎样提示,以及任务能否恢复。

预算耗尽时,不应让模型为了凑出答案再发起一次不受预算控制的总结请求。可以提前预留总结额度,或者用程序生成已确认事实与未完成项。

取消请求需要向下游传播,但不能承诺撤销已经完成的写入。执行器可以停止提交新任务;对于已经发送的业务操作,要查询其结果并记录最终状态。

5. 设计判断与适用边界

把确定性校验、人工检查与模型评分组合使用。格式和唯一约束适合程序判断,证据是否支持结论需要标注与复核,模型评分则记录评分器与提示词版本。重要错误单独统计,不让总体平均分掩盖泄漏或非法操作。

Agent 评估保留完整轨迹与最终业务状态:说已创建工单不等于工单存在,说已停止不等于下游已停止。重复运行观察稳定性,同时控制环境资源与费用。未执行的计划保持待测量,不从他人的评估报告移植自己的效果数字。

Agent 评估文章提示我们保留执行轨迹与可检查结果。本文评价方案不以模型自我陈述代替真实业务状态。 Anthropic:Demystifying evals for AI agents。

6. 问答

问:Recall 高,回答就一定正确吗?

答:还需要正确排序、完整证据和生成利用,检索指标只描述一部分链路。

问:无答案问题可以直接算 Recall 吗?

答:相关集合为空时公式需要另定义,通常单独评估拒答与误答。

问:为什么先做失败分类?

答:不同层次需要不同修复,生成问题不能代替解析或权限修复。

问:优化可以只看答案得分吗?

答:还要检查证据、拒答、泄漏、延迟和费用。

参考资料