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.1s | 2.8s | +0.7s |
| 平均成本 | 0.012 元 | 0.016 元 | +0.004 元 |
如果新版本准确率提升,但延迟和成本明显上升,就需要结合业务目标判断是否值得上线。
10. Prompt A/B 测试
Prompt A/B 测试用于比较两个 Prompt 版本。
示例:
Prompt A:请总结下面的需求。Prompt B:请按业务目标、用户流程、功能点、异常场景、待确认问题总结下面的需求。评估维度:
- 是否覆盖核心内容
- 是否结构清楚
- 是否减少遗漏
- 是否减少无依据补充
- 输出是否更稳定
A/B 测试流程:
- 准备同一批测试样例
- 分别用 Prompt A 和 Prompt B 运行
- 用同一套评分规则评估
- 统计每个维度得分
- 分析新 Prompt 的收益和代价
示例结果:
| 版本 | 正确性 | 完整性 | 格式稳定性 | 平均成本 |
|---|---|---|---|---|
| Prompt A | 3.8 | 3.2 | 4.0 | 低 |
| Prompt B | 4.2 | 4.5 | 4.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 延迟 | 单次成本 |
|---|---|---|---|---|
| 小模型 + 无 rerank | 78% | 1.2s | 2.1s | 低 |
| 大模型 + 无 rerank | 86% | 2.5s | 4.8s | 中 |
| 大模型 + rerank | 91% | 3.4s | 6.2s | 高 |
选择方案时,需要结合业务场景:
- 客服实时回复更看重延迟
- 代码审查更看重准确率
- 批量离线分析更能接受较高延迟
- 高频功能更需要控制成本
- 高风险决策更需要人工审核
Eval 的目标,是帮助你看清这些取舍。
15. 上线前评估表
AI 功能上线前,可以准备一份评估表。
示例:
| 评估项 | 目标 | 当前结果 | 是否通过 |
|---|---|---|---|
| 回答准确率 | >= 85% | 88% | 通过 |
| 引用准确率 | >= 90% | 92% | 通过 |
| JSON 解析成功率 | >= 99% | 99.3% | 通过 |
| 工具执行成功率 | >= 95% | 96% | 通过 |
| 危险工具误调用率 | 0% | 0% | 通过 |
| 幻觉率 | <= 2% | 1.5% | 通过 |
| P95 延迟 | <= 5s | 4.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 实战练习
可以按下面顺序练习:
- 给 Prompt 做 A/B 测试
- 给 Structured Output 设计 schema 校验
- 给 RAG 系统设计 30 条测试问题
- 统计 RAG 的 Recall@K 和引用准确率
- 统计工具调用成功率
- 统计危险工具误调用率
- 比较不同模型的回答质量
- 比较不同 chunk size 的检索效果
- 记录每次调用的成本和延迟
- 做一份 AI 功能上线前评估表
每个练习都可以检查三个问题:
- 评估标准是否清楚
- 评估结果是否可复现
- 评估结论是否能指导下一步优化
19. 阶段验收标准
学完这一章,可以用下面的问题检查自己:
- 我能不能设计一批覆盖真实场景的测试问题?
- 我能不能为每条样例写清期望结果?
- 我能不能设计人工评分表?
- 我能不能用规则或脚本做自动评分?
- 我能不能评估 RAG 检索质量?
- 我能不能评估工具调用成功率?
- 我能不能统计幻觉率?
- 我能不能比较不同模型的成本、延迟和准确率?
- 我能不能用 Eval 结果判断改动是否值得上线?
- 我能不能保存 Eval 记录,支持后续回归对比?
如果这些问题大多数都能做到,说明 Eval 阶段已经基本合格。
20. 本章总结
Eval 的核心是用测试集、评分规则和运行数据判断 AI 系统效果。
一套可用的 Eval 体系,建议至少包含:
- 测试集设计
- 标准答案设计
- 人工评分
- 自动评分
- 回归测试
- Prompt A/B 测试
- RAG 检索和回答评估
- Tool Calling 成功率评估
- 幻觉率统计
- 成本、延迟、准确率对比
- 上线前评估表
- Eval 结果记录
Eval 是 AI 工程化路线中的质量门槛。它让 AI 功能从主观体验走向数据判断,也让每一次 Prompt、模型、检索、工具和流程调整都有可对比依据。
这一章的目标很明确:用可复现的方式判断 AI 效果,知道哪里好、哪里差、哪里能上线、哪里还需要继续优化。