第 5 章 / 共 12 章

Eval:判断 AI 效果好不好

Eval 是 AI 学习路线的第五章。

前面几章已经完成了几个关键能力:Prompt 让需求表达更清楚,Structured Output 让输出更稳定,Tool Calling 让 AI 可以调用工具,RAG 让 AI 可以使用私有知识。到了第五章,我们要解决一个更关键的问题:如何判断 AI 的效果到底好不好。

很多 AI 功能在演示时看起来不错,但一旦进入真实业务,就会遇到回答不稳定、格式偶尔错误、检索来源不准、工具调用失败、成本过高、延迟过长等问题。只靠主观感觉,很难判断一个 AI 系统能不能上线,也很难判断一次 Prompt、模型或检索策略调整有没有带来真实提升。

这一章要解决的问题是:

如何建立 AI 输出质量评估能力,用数据判断系统效果、风险和上线条件。

学完这一章,你应该能做到三件事:

  • 设计一套可复用的 AI 测试集
  • 用人工评分和自动评分评估 AI 输出
  • 对 Prompt、RAG、Tool Calling 和模型效果做回归对比

1. Eval 是什么#

Eval 可以理解成 AI 系统的测试和评估体系。

传统软件测试通常检查:

  • 接口是否返回 200
  • 字段类型是否正确
  • 页面按钮是否可点击
  • 数据库是否写入成功
  • 单元测试是否通过

AI 系统还需要额外检查:

  • 回答是否正确
  • 回答是否完整
  • 回答是否基于资料
  • 输出格式是否稳定
  • 工具是否调用成功
  • 是否出现无依据内容
  • 成本是否可接受
  • 延迟是否可接受
  • 改动后效果是否退化

Eval 的作用,就是把这些质量问题变成可以检查、可以记录、可以对比的评估项。

一个基础 Eval 流程如下:

准备测试问题
运行 AI 系统
收集输出、工具调用、引用来源、耗时和成本
按照评分规则评估结果
统计通过率、准确率、失败原因
对比不同 Prompt、模型或策略

有了 Eval,AI 系统才具备持续优化的基础。

2. 为什么需要 Eval#

AI 输出有一个明显特点:结果会受 Prompt、模型、上下文、检索结果、工具返回、采样参数影响。同一个任务,在不同时间、不同输入、不同模型下,结果可能有差异。

如果没有 Eval,很容易出现这些问题:

  • 改 Prompt 后不知道效果有没有提升
  • 换模型后不知道哪些能力退化
  • RAG 检索调参后只看个别示例
  • 工具调用偶发失败但没人统计
  • 上线前只做人工体验,缺少覆盖面
  • 用户反馈问题后无法复现
  • 成本和延迟逐渐变高但没有告警

Eval 能带来几个直接收益:

  • 用数据判断质量
  • 发现稳定性问题
  • 复现用户反馈
  • 对比不同方案
  • 防止版本退化
  • 支撑上线决策
  • 帮助团队形成统一质量标准

AI 功能越接近真实业务,Eval 越重要。

3. Eval 的基本对象#

不同 AI 能力需要评估不同对象。

常见评估对象包括:

  • Prompt
  • Structured Output
  • Tool Calling
  • RAG
  • Agent
  • 模型
  • 工作流
  • 安全策略
  • 成本和延迟

3.1 Prompt Eval#

Prompt Eval 关注模型回答质量。

常见检查项:

  • 是否回答了问题
  • 是否遗漏关键点
  • 是否遵守输出格式
  • 是否遵守限制条件
  • 是否表达清楚
  • 是否进行了必要自检

适合场景:

  • 文档总结
  • 需求分析
  • 测试点生成
  • 代码审查
  • 错误日志分析

3.2 Structured Output Eval#

Structured Output Eval 关注输出能不能被程序稳定解析。

常见检查项:

  • JSON 是否合法
  • 字段是否齐全
  • 字段类型是否正确
  • 枚举值是否有效
  • 数组长度是否符合要求
  • schema 校验是否通过
  • 是否混入多余解释文字

适合场景:

  • 抽取结构化字段
  • 生成任务计划
  • 生成测试用例 JSON
  • 生成可执行配置

3.3 Tool Calling Eval#

Tool Calling Eval 关注工具选择和参数质量。

常见检查项:

  • 是否选择了正确工具
  • 是否传入正确参数
  • 参数是否通过 schema 校验
  • 工具是否执行成功
  • 失败后是否正确处理
  • 是否触发必要人工确认
  • 是否避免危险操作

适合场景:

  • 文件读取
  • 数据库查询
  • API 调用
  • 命令执行
  • 工单创建
  • 运维巡检

3.4 RAG Eval#

RAG Eval 关注检索和回答两个层面。

检索层面检查:

  • 正确资料是否进入 topK
  • 检索结果是否相关
  • 是否漏掉关键文档
  • 是否返回过期资料
  • rerank 后排名是否更好

回答层面检查:

  • 回答是否基于资料
  • 结论是否有来源
  • 来源是否能支撑结论
  • 资料不足时是否说明无法确认
  • 资料冲突时是否说明差异

适合场景:

  • 文档问答
  • 代码库问答
  • 产品知识库
  • 内部制度问答

3.5 Agent Eval#

Agent Eval 关注多步骤任务执行。

常见检查项:

  • 是否正确拆解任务
  • 是否选择合理步骤
  • 是否在每一步观察结果
  • 是否能从失败中恢复
  • 是否避免无限循环
  • 是否在关键节点请求确认
  • 最终结果是否达到目标

适合场景:

  • 自动排障
  • 自动测试设计
  • 代码审查
  • 部署检查
  • 文件整理

4. 测试集设计#

测试集是 Eval 的基础。

一个 AI 测试集通常由多条测试样例组成,每条样例至少包含:

  • 输入问题
  • 输入材料
  • 期望结果
  • 评分标准
  • 任务类型
  • 难度
  • 标签

示例:

{
"id": "rag-auth-001",
"task_type": "rag_qa",
"question": "登录接口密码错误时返回什么错误码?",
"context": "docs/api-login.md",
"expected_answer": "返回 401,错误码为 INVALID_PASSWORD。",
"expected_sources": ["docs/api-login.md"],
"rubric": [
"必须包含 401",
"必须包含 INVALID_PASSWORD",
"必须引用 docs/api-login.md",
"不能补充资料中没有出现的错误码"
],
"difficulty": "easy",
"tags": ["auth", "api", "error_code"]
}

测试集要尽量覆盖真实业务问题,避免只放简单示例。

5. 测试集覆盖范围#

一个可用测试集需要覆盖不同类型问题。

建议包含:

  • 正常场景
  • 边界场景
  • 异常场景
  • 信息不足场景
  • 多资料合并场景
  • 资料冲突场景
  • 格式约束场景
  • 工具失败场景
  • 权限限制场景
  • 高成本长上下文场景

以 RAG 系统为例,测试集可以这样设计:

类型示例问题评估重点
明确答案登录接口成功返回哪些字段?是否命中正确资料
信息不足删除账号后能否恢复?是否说明资料不足
多文档合并注册流程涉及哪些接口?是否整合多来源
冲突资料两份文档对超时时间描述不同怎么办?是否说明冲突
精确关键词E10032 是什么错误?是否命中错误码
权限隔离查询内部财务规则是否按权限过滤

测试集越贴近真实用户问题,Eval 结果越有参考价值。

6. 标准答案设计#

标准答案用于判断 AI 输出是否正确。

常见标准答案形式包括:

  • 精确答案
  • 关键词列表
  • 期望来源
  • 评分规则
  • JSON schema
  • 正则表达式
  • 人工参考答案

6.1 精确答案#

适合答案固定的任务。

示例:

{
"question": "登录接口密码错误时返回什么 HTTP 状态码?",
"expected_answer": "401"
}

6.2 关键词列表#

适合答案表达方式可能不同,但关键内容固定的任务。

示例:

{
"required_keywords": ["401", "INVALID_PASSWORD"],
"forbidden_keywords": ["403", "ACCOUNT_DISABLED"]
}

6.3 期望来源#

适合 RAG 问答。

示例:

{
"expected_sources": [
"docs/api-login.md",
"tests/auth/login-cases.md"
]
}

6.4 评分规则#

适合开放式任务。

示例:

满分 5 分:
1 分:指出核心问题
1 分:解释影响
1 分:给出可执行修复建议
1 分:说明验证方法
1 分:避免无依据推断

标准答案越清楚,评估结果越稳定。

7. 人工评分#

人工评分适合开放式任务和高风险场景。

常见人工评分维度包括:

  • 正确性
  • 完整性
  • 相关性
  • 可执行性
  • 格式规范
  • 引用准确性
  • 安全性
  • 表达清晰度

示例评分表:

维度分值说明
正确性0-5结论是否正确
完整性0-5是否覆盖关键点
可执行性0-5建议是否能落地
引用准确性0-5来源是否支撑结论
安全性0-5是否避免危险建议

人工评分的优点:

  • 能处理复杂判断
  • 能发现细微质量问题
  • 适合上线前评审

人工评分的缺点:

  • 成本高
  • 速度慢
  • 不同评审人标准可能不一致

为了提升一致性,需要提前写清评分规则,并准备正例和反例。

8. 自动评分#

自动评分适合大规模、重复执行的 Eval。

常见自动评分方式包括:

  • schema 校验
  • 关键词匹配
  • 正则匹配
  • 来源匹配
  • 工具调用日志检查
  • 单元测试
  • LLM-as-judge
  • 规则评分脚本

8.1 schema 校验#

适合 Structured Output。

示例:

import { z } from "zod";
const TestCaseSchema = z.object({
title: z.string(),
steps: z.array(z.string()).min(1),
expected_result: z.string(),
priority: z.enum(["P0", "P1", "P2", "P3"])
});
const result = TestCaseSchema.safeParse(aiOutput);
if (!result.success) {
throw new Error("AI 输出未通过 schema 校验");
}

8.2 关键词匹配#

适合事实型答案。

示例:

{
"required_keywords": ["401", "INVALID_PASSWORD"],
"forbidden_keywords": ["403"]
}

评分逻辑:

包含全部 required_keywords 得分
出现 forbidden_keywords 扣分

8.3 来源匹配#

适合 RAG。

检查项:

  • 输出 sources 是否包含期望文档
  • 引用文档是否真实存在
  • 引用片段是否进入检索结果
  • 引用内容是否能支撑结论

8.4 工具调用日志检查#

适合 Tool Calling 和 Agent。

检查项:

  • 调用了哪个工具
  • 参数是否正确
  • 工具是否成功
  • 是否出现重复调用
  • 是否触发确认机制
  • 是否调用了禁止工具

示例记录:

{
"case_id": "tool-read-file-001",
"expected_tool": "read_file",
"expected_args": {
"path": "package.json"
},
"actual_tool": "read_file",
"actual_args": {
"path": "package.json"
},
"success": true
}

8.5 LLM-as-judge#

LLM-as-judge 指的是用另一个模型给回答评分。

适合评估:

  • 需求分析质量
  • 总结质量
  • 回答完整性
  • 代码审查建议
  • 文档改写质量

示例 Judge Prompt:

你是一名 AI 输出评审员。
请根据评分规则评估候选回答。
评分规则:
1. 正确性:0-5 分
2. 完整性:0-5 分
3. 引用准确性:0-5 分
4. 是否包含无依据内容:有 / 无
请输出 JSON:
{
"correctness": 0,
"completeness": 0,
"citation_accuracy": 0,
"has_unsupported_claims": false,
"reason": "简短说明"
}
问题:
...
参考资料:
...
候选回答:
...

使用 LLM-as-judge 时要注意:

  • Judge Prompt 要稳定
  • 评分规则要具体
  • 关键场景仍需要人工抽检
  • 同一批样例使用同一评审模型
  • 保存评审理由,方便复盘

9. 回归测试#

AI 系统也需要回归测试。

每次修改这些内容后,都应该跑 Eval:

  • Prompt
  • 模型
  • temperature
  • 工具描述
  • tool schema
  • RAG chunking
  • embedding 模型
  • rerank 策略
  • 输出格式
  • 安全规则

回归测试关注两个问题:

  • 新版本是否提升了目标指标
  • 新版本是否破坏了已有能力

示例对比:

指标旧版本新版本变化
回答准确率82%88%+6%
引用准确率76%84%+8%
JSON 解析成功率98%97%-1%
平均延迟2.1s2.8s+0.7s
平均成本0.012 元0.016 元+0.004 元

如果新版本准确率提升,但延迟和成本明显上升,就需要结合业务目标判断是否值得上线。

10. Prompt A/B 测试#

Prompt A/B 测试用于比较两个 Prompt 版本。

示例:

Prompt A:请总结下面的需求。
Prompt B:请按业务目标、用户流程、功能点、异常场景、待确认问题总结下面的需求。

评估维度:

  • 是否覆盖核心内容
  • 是否结构清楚
  • 是否减少遗漏
  • 是否减少无依据补充
  • 输出是否更稳定

A/B 测试流程:

  1. 准备同一批测试样例
  2. 分别用 Prompt A 和 Prompt B 运行
  3. 用同一套评分规则评估
  4. 统计每个维度得分
  5. 分析新 Prompt 的收益和代价

示例结果:

版本正确性完整性格式稳定性平均成本
Prompt A3.83.24.0
Prompt B4.24.54.6

如果 Prompt B 在关键指标上更好,成本和延迟也能接受,就可以作为新版本。

11. RAG Eval#

RAG Eval 需要分开看检索和回答。

11.1 检索评估#

检索评估关注资料是否找对。

常见指标:

  • Recall@K
  • Precision@K
  • MRR
  • NDCG

示例:

{
"question": "登录接口密码错误时返回什么错误码?",
"expected_sources": ["docs/api-login.md"],
"retrieved_sources": [
"docs/api-login.md",
"docs/register.md",
"docs/session.md"
]
}

如果正确来源出现在 top 3,说明检索基本命中。

11.2 回答评估#

回答评估关注模型是否正确使用资料。

检查项:

  • 答案是否正确
  • 答案是否完整
  • 是否引用来源
  • 来源是否支撑结论
  • 是否加入无依据内容
  • 资料不足时是否说明缺口

示例评分:

{
"answer_correct": true,
"source_supported": true,
"has_unsupported_claims": false,
"missing_key_points": [],
"score": 5
}

11.3 RAG 常见指标#

指标含义用途
Recall@K正确资料是否进入前 K 个结果判断有没有找全
Precision@K前 K 个结果里相关资料占比判断噪声是否太多
Citation Accuracy引用是否支撑结论判断来源质量
Answer Accuracy答案是否正确判断最终效果
Hallucination Rate无依据内容比例判断幻觉风险

RAG 调优时,先看检索,再看回答。检索没有命中资料,后续回答很难稳定。

12. Tool Calling Eval#

Tool Calling Eval 关注模型是否正确调用工具。

常见指标:

  • 工具选择准确率
  • 参数生成准确率
  • schema 校验通过率
  • 工具执行成功率
  • 失败恢复成功率
  • 人工确认触发准确率
  • 危险工具误调用率

示例测试样例:

{
"id": "tool-001",
"user_input": "帮我读取 package.json 看项目脚本",
"expected_tool": "read_file",
"expected_arguments": {
"path": "package.json"
},
"forbidden_tools": ["run_command", "delete_file"]
}

评分逻辑:

选对工具:1 分
参数正确:1 分
schema 通过:1 分
工具执行成功:1 分
没有调用禁止工具:1 分

工具调用 Eval 要保留调用日志。只看最终回答,可能看不出中间步骤是否有风险。

13. 幻觉率#

幻觉率用于衡量 AI 输出中无依据内容的比例。

常见幻觉包括:

  • 编造不存在的接口
  • 编造不存在的文档来源
  • 编造错误码
  • 编造业务规则
  • 编造文件路径
  • 编造执行结果
  • 把推测当成事实

评估方法:

  • 检查关键结论是否有来源
  • 检查引用是否真实存在
  • 检查答案是否超出资料范围
  • 检查代码或命令是否真实可执行
  • 对高风险结论人工复核

示例记录:

{
"case_id": "rag-015",
"unsupported_claims": [
"声称接口支持 reset_token 字段,但资料中没有出现"
],
"hallucination": true
}

降低幻觉率的方法:

  • Prompt 中要求只基于资料回答
  • 资料不足时要求说明缺口
  • 每个关键结论附来源
  • 对引用做程序校验
  • 对高风险答案加入人工审核
  • 优化检索质量

幻觉率适合做上线门槛。例如:核心业务问答幻觉率必须低于 2%。

14. 成本、延迟、准确率对比#

AI 系统上线时,不能只看准确率,还要看成本和延迟。

常见指标:

  • 输入 token 数
  • 输出 token 数
  • 单次调用成本
  • 平均响应时间
  • P95 响应时间
  • 工具调用次数
  • 检索耗时
  • rerank 耗时
  • 成功率
  • 准确率

示例:

方案准确率平均延迟P95 延迟单次成本
小模型 + 无 rerank78%1.2s2.1s
大模型 + 无 rerank86%2.5s4.8s
大模型 + rerank91%3.4s6.2s

选择方案时,需要结合业务场景:

  • 客服实时回复更看重延迟
  • 代码审查更看重准确率
  • 批量离线分析更能接受较高延迟
  • 高频功能更需要控制成本
  • 高风险决策更需要人工审核

Eval 的目标,是帮助你看清这些取舍。

15. 上线前评估表#

AI 功能上线前,可以准备一份评估表。

示例:

评估项目标当前结果是否通过
回答准确率>= 85%88%通过
引用准确率>= 90%92%通过
JSON 解析成功率>= 99%99.3%通过
工具执行成功率>= 95%96%通过
危险工具误调用率0%0%通过
幻觉率<= 2%1.5%通过
P95 延迟<= 5s4.7s通过
单次平均成本<= 预算符合通过
人工确认链路必须存在已接入通过
审计日志必须记录已记录通过

上线评估表可以让 AI 功能从“感觉不错”走向“有证据支撑”。

16. Eval 数据记录#

每次 Eval 都应该记录结果,方便后续对比。

建议记录:

  • Eval 执行时间
  • 测试集版本
  • Prompt 版本
  • 模型名称
  • 模型参数
  • 检索配置
  • 工具版本
  • 每条样例输入
  • AI 输出
  • 工具调用日志
  • 检索结果
  • 评分结果
  • 成本
  • 延迟
  • 错误原因

示例:

{
"eval_run_id": "eval-20260601-001",
"dataset_version": "rag-v1.2",
"prompt_version": "qa-v3",
"model": "example-model",
"case_count": 100,
"answer_accuracy": 0.88,
"citation_accuracy": 0.92,
"hallucination_rate": 0.015,
"average_latency_ms": 2100,
"average_cost": 0.012
}

记录 Eval 数据后,团队才能追踪质量趋势。

17. 常见 Eval 问题#

17.1 测试集太简单#

表现:

  • Demo 效果很好
  • 真实用户问题失败很多
  • 边界场景覆盖不足

处理方式:

  • 加入真实用户问题
  • 加入失败样例
  • 加入资料冲突和信息不足场景
  • 按业务模块补齐覆盖

17.2 评分标准太模糊#

表现:

  • 不同评审人分数差异很大
  • 同一回答有人认为合格,有人认为不合格
  • 无法判断版本提升是否有效

处理方式:

  • 写清每个分数档位
  • 给出正例和反例
  • 把开放式评分拆成多个维度
  • 关键指标用程序规则校验

17.3 只看最终回答#

表现:

  • 回答看起来正确
  • 工具调用过程存在风险
  • 引用来源无法支撑结论
  • 成本和延迟异常

处理方式:

  • 记录中间步骤
  • 记录工具调用日志
  • 记录检索结果
  • 记录 token、成本和耗时

17.4 只测成功场景#

表现:

  • 正常问题表现稳定
  • 信息不足、工具失败、权限不足时表现混乱

处理方式:

  • 增加失败场景
  • 增加权限场景
  • 增加超时场景
  • 增加资料缺失场景
  • 检查用户提示是否清楚

17.5 没有固定版本#

表现:

  • 同一测试集多次结果无法对比
  • Prompt 改动后无法追踪
  • 模型升级后找不到退化原因

处理方式:

  • 给测试集编号
  • 给 Prompt 编号
  • 记录模型和参数
  • 记录检索配置
  • 保存每次 Eval 结果

18. Eval 实战练习#

可以按下面顺序练习:

  1. 给 Prompt 做 A/B 测试
  2. 给 Structured Output 设计 schema 校验
  3. 给 RAG 系统设计 30 条测试问题
  4. 统计 RAG 的 Recall@K 和引用准确率
  5. 统计工具调用成功率
  6. 统计危险工具误调用率
  7. 比较不同模型的回答质量
  8. 比较不同 chunk size 的检索效果
  9. 记录每次调用的成本和延迟
  10. 做一份 AI 功能上线前评估表

每个练习都可以检查三个问题:

  • 评估标准是否清楚
  • 评估结果是否可复现
  • 评估结论是否能指导下一步优化

19. 阶段验收标准#

学完这一章,可以用下面的问题检查自己:

  • 我能不能设计一批覆盖真实场景的测试问题?
  • 我能不能为每条样例写清期望结果?
  • 我能不能设计人工评分表?
  • 我能不能用规则或脚本做自动评分?
  • 我能不能评估 RAG 检索质量?
  • 我能不能评估工具调用成功率?
  • 我能不能统计幻觉率?
  • 我能不能比较不同模型的成本、延迟和准确率?
  • 我能不能用 Eval 结果判断改动是否值得上线?
  • 我能不能保存 Eval 记录,支持后续回归对比?

如果这些问题大多数都能做到,说明 Eval 阶段已经基本合格。

20. 本章总结#

Eval 的核心是用测试集、评分规则和运行数据判断 AI 系统效果。

一套可用的 Eval 体系,建议至少包含:

  • 测试集设计
  • 标准答案设计
  • 人工评分
  • 自动评分
  • 回归测试
  • Prompt A/B 测试
  • RAG 检索和回答评估
  • Tool Calling 成功率评估
  • 幻觉率统计
  • 成本、延迟、准确率对比
  • 上线前评估表
  • Eval 结果记录

Eval 是 AI 工程化路线中的质量门槛。它让 AI 功能从主观体验走向数据判断,也让每一次 Prompt、模型、检索、工具和流程调整都有可对比依据。

这一章的目标很明确:用可复现的方式判断 AI 效果,知道哪里好、哪里差、哪里能上线、哪里还需要继续优化。