AI Eval(评估体系)
Eval(Evaluation)是衡量 AI 系统质量的系统化方法。好的评估体系是构建可靠 AI 应用的基础——没有评估,就无法知道系统是在变好还是变差。
为什么需要 Eval
- LLM 输出是非确定性的,不能靠"试一试感觉还行"来判断质量
- 修改 Prompt、换模型、调参数后,需要量化对比效果
- 上线前需要建立质量基线,上线后需要持续监控
评估的基本流程
准备测试集 → 运行系统 → 收集输出 → 评分 → 分析结果 → 迭代改进
评估维度
通用维度
| 维度 | 说明 | 示例 |
|---|---|---|
| 准确性(Accuracy) | 回答是否正确 | 事实问答的正确率 |
| 相关性(Relevance) | 回答是否切题 | 是否回答了用户的问题 |
| 完整性(Completeness) | 是否覆盖了所有要点 | 摘要是否遗漏关键信息 |
| 一致性(Consistency) | 多次运行结果是否稳定 | 相同输入是否得到相似输出 |
| 安全性(Safety) | 是否产生有害内容 | 是否拒绝不当请求 |
| 延迟(Latency) | 响应速度 | P50/P95/P99 延迟 |
| 成本(Cost) | Token 消耗 | 每次调用的费用 |
RAG 专用维度
| 维度 | 说明 |
|---|---|
| Context Precision | 检索到的文档中,相关的排名是否靠前 |
| Context Recall | 是否召回了所有相关文档 |
| Faithfulness | 回答是否忠实于检索到的上下文(不编造) |
| Answer Relevance | 回答是否与问题相关 |
Agent 专用维度
| 维度 | 说明 |
|---|---|
| 任务完成率 | Agent 是否成功完成了任务 |
| 步骤效率 | 完成任务用了多少步(越少越好) |
| 工具选择准确性 | 是否选了正确的工具 |
| 错误恢复能力 | 遇到错误时能否自我修正 |
评分方法
1. 精确匹配(Exact Match)
输出是否与标准答案完全一致。适用于分类、提取等有确定答案的任务。
2. 规则评分(Rule-based)
用代码检查输出是否满足特定规则:
def eval_format(output):
# Check if the output is valid JSON
try:
json.loads(output)
return 1.0
except:
return 0.0
3. LLM-as-Judge(LLM 评判)
用另一个 LLM 来评估输出质量:
请评估以下回答的质量(1-5分):
问题:{question}
参考答案:{reference}
模型回答:{output}
评分标准:
5分 - 完全正确且表述清晰
4分 - 基本正确,有小瑕疵
3分 - 部分正确
2分 - 大部分不正确
1分 - 完全错误或无关
注意事项:
- LLM 评判存在位置偏差(倾向于给第一个选项高分)
- 存在冗长偏差(倾向于给更长的回答高分)
- 建议多次评判取平均,或交换位置评判
4. 人工评估(Human Evaluation)
最可靠但最昂贵的方式,适用于:
- 主观性强的任务(创意写作、对话质量)
- 建立评估基线
- 校准自动评估指标
测试集设计
构成
{
"input": "用户输入/问题",
"expected_output": "期望的输出(可选)",
"context": "相关上下文(RAG 场景)",
"metadata": {
"category": "问题类别",
"difficulty": "easy/medium/hard"
}
}
原则
- 覆盖性:涵盖常见场景和边界情况
- 代表性:反映真实用户的分布
- 数量:至少 50-100 条,关键场景更多
- 标注质量:标准答案要准确,最好多人标注
- 持续更新:根据线上发现的 bad case 不断补充
评估工具
| 工具 | 特点 |
|---|---|
| Ragas | RAG 专用评估框架 |
| DeepEval | 通用 LLM 评估框架 |
| Promptfoo | Prompt 测试和对比工具 |
| LangSmith | LangChain 生态的追踪和评估 |
| Braintrust | 企业级评估平台 |
| OpenAI Evals | OpenAI 的评估框架 |
最佳实践
- Eval-First:先建评估体系,再开发功能
- 自动化:将 Eval 集成到 CI/CD 流程中
- 分层评估:单元测试(单个组件)→ 集成测试(端到端)→ 人工抽检
- 版本管理:对测试集和评估结果做版本管理
- 回归测试:每次改动后运行全量评估,确保不退步