进阶
AI 智能体自动化评测:用 promptfoo / DeepEval 给 Agent 打分
你有没有过这种经历:改了一版提示词,手测 3 个例子觉得「更好了」,上线后用户却投诉变差?因为 3 个例子根本代表不了真实分布。本教程教你用 Evals(评测集)给智能体做自动化打分——每次改提示词、换模型,都跑同一套考题,用分数说话,而不是凭感觉。
📊 本教程适合:已经上线或准备上线 Agent,想建立「改动可量化对比」机制的开发者与团队。需要 Python 与命令行基础。
先搞懂:Evals 到底测什么
Evals 就是一套「考题 + 评分标准」。你准备一批输入(问题/文档),以及期望的行为,让 Agent 跑一遍,再用指标打分:
| 指标 | 测什么 | 常用工具 |
|---|---|---|
| 答案相关性 | 答非所问没有 | DeepEval / Ragas |
| 事实一致性 | 有没有编造 | DeepEval Faithfulness |
| 召回质量 | 知识库找对没 | Ragas Context Precision |
| 回归对比 | 新版本是否退步 | promptfoo |
评测的第一步不是写代码,是攒「考题」。从真实用户日志里挑 30~50 个有代表性的问题,比凭空编 200 个更有用。本中心《Agent 反馈闭环》里沉淀的困惑点,正是最好的考题来源。
Step 1:用 promptfoo 跑「回归对比」
1 改提示词前后,分数差多少
promptfoo 最适合做「A 版 vs B 版」的对比。先装并写配置:
npm install -g promptfoo
# promptfooconfig.yaml
prompts:
- "你是客服,用不超过3句话回答:{{question}}"
- "你是客服专家,先复述用户问题再简洁回答:{{question}}"
providers:
- openai:gpt-4o-mini
tests:
- vars: { question: "退款多久到账?" }
- vars: { question: "你们支持开发票吗?" }
- vars: { question: "产品坏了怎么换?" }
promptfoo eval
promptfoo view # 打开可视化报告
💡 promptfoo 会把每个提示词版本在每道题上的表现并排展示,一眼看出「B 版是否全面优于 A 版」。
Step 2:用断言定义「通过标准」
2 不只看分数,要看「达不达标」
加 `assert` 让评测变成「通过/不通过」:
tests:
- vars: { question: "退款多久到账?" }
assert:
- type: contains # 必须含关键词
value: "退款"
- type: llm-rubric # 用模型判断语义
value: "回答说明了退款到账的大致时间"
llm-rubric 是用另一个模型当「考官」做语义判断,比关键词灵活得多,适合测「有没有说清楚」这类软指标。
Step 3:用 DeepEval 测「相关性 + 不编造」
3 专治 RAG 类 Agent 的幻觉
如果你的 Agent 接了知识库,重点测「答的是不是基于资料」:
pip install deepeval
from deepeval import assert_test
from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
from deepeval.test_case import LLMTestCase
test_case = LLMTestCase(
input="退款多久到账?",
actual_output=agent_answer,
retrieval_context=[doc1, doc2] # 知识库召回的内容
)
assert_test(test_case, [
AnswerRelevancyMetric(threshold=0.7),
FaithfulnessMetric(threshold=0.8) # 低于阈值=有编造
])
🔑 关键技巧:
FaithfulnessMetric 专门抓「模型编了知识库里没有的内容」。RAG Agent 上线前必跑这一项。Step 4:用 Ragas 给知识库召回打分
4 答案不行,先查是不是「找错资料」
很多 Agent 答得差,根因是召回的文档就不对。Ragas 专门评召回质量:
pip install ragas
from ragas import evaluate
from ragas.metrics import context_precision, context_recall
result = evaluate(
dataset=your_dataset, # 含 question / answer / contexts
metrics=[context_precision, context_recall]
)
print(result)
召回差,调提示词没用。先确认「找对文档」再优化「怎么答」,顺序别反。
Step 5:把评测接进 CI,改动自动报警
5 让分数成为发布门槛
把评测脚本放进提交/部署流程,分数不达标就拦下:
# 在 promptfoo 中要求整体通过率门槛
promptfoo eval --threshold 0.8
# 退出码非 0 → CI 失败 → 禁止合并/发布
# DeepEval 也可在 pytest 里跑,失败即红线
pytest test_agent_eval.py
🚦 建议:把「整体通过率 ≥ 0.8 且不得有 Faithfulness 不及格」设为硬门槛。既防退步,又不至于太苛刻卡死迭代。
Step 6:评测集要「养」,别一次性
6 错题本就是最好的考题库
| 动作 | 做法 |
|---|---|
| 持续补题 | 每次用户投诉/答错,转成一条测试用例 |
| 定期回测 | 换模型、调知识库后全量重跑 |
| 分层 | 冒烟集(快)常跑,全量集(慢)发布前跑 |
小结
Evals 不是「锦上添花」,而是 Agent 上线后的「安全带」。最小可行起步:攒 30 条真实考题 → promptfoo 跑回归 → 接 CI 当门槛。RAG 类再加 DeepEval 的 Faithfulness 和 Ragas 召回。配合《Agent 反馈闭环》沉淀的困惑点当题库,你的 Agent 每一次迭代都看得见好坏。下一步可看《Agent 可观测性实战》,把运行过程也监控起来。