1. 为什么“智能体好不好用”这件事,比想象中难衡量
做智能体开发的人大概都有过这种体验:demo 阶段惊艳四座,一旦进入真实业务场景,表现就像开盲盒。同一个智能体,今天回答得头头是道,明天换个问法就开始胡言乱语;在 A 任务上准确率 95%,换到 B 任务直接腰斩。更麻烦的是,你问十个用户“这个智能体好不好用”,能得到十一种答案——有人说响应快,有人说答案准,有人说“感觉不太行但说不上哪里不对”。
这就是「超体」评测体系要解决的核心问题:把“好不好用”这个模糊的感性判断,拆解成可量化、可复现、可对比的工程指标。我把它叫做“超体”,是因为一个成熟的智能体评测体系,本质上是在给智能体构建一个超越单点测试的“体检中心”——不是测一次血压就下结论,而是从多个维度、多个层级、多种场景交叉验证。
这套体系适合谁?如果你正在做智能体开发、负责智能体平台的质量把控、或者需要向业务方证明“我们的智能体确实比竞品好”,那这套思路可以直接抄作业。如果你只是刚接触智能体,想了解怎么判断一个智能体靠不靠谱,也能从里面拿到一套可操作的评估框架。
我见过太多团队在评测上踩坑:有的只测最终答案对不对,忽略了中间推理过程的合理性;有的用几十条测试用例就敢下结论,结果上线后翻车;还有的完全依赖人工打分,成本高不说,不同评审员之间的标准差异比智能体本身的表现波动还大。这些问题,后面会一个个拆开讲。
2. 评测体系整体设计:从“单点打分”到“多维体检”
2.1 核心设计思路:分层、分场景、分角色
构建评测体系的第一步,不是急着写测试用例,而是想清楚评什么、谁来评、怎么评。我的经验是采用三层结构:
- 能力层:智能体是否具备完成任务所需的基础能力,比如指令遵循、工具调用、多轮记忆、推理链完整性。
- 任务层:在具体业务场景下,智能体能否端到端地解决问题,比如客服场景的工单闭环率、代码场景的编译通过率。
- 体验层:用户主观感受相关的指标,比如响应延迟、回答可读性、交互自然度。
这三层不是并列关系,而是递进关系。能力层不过关,任务层必然拉胯;任务层达标了,体验层才值得优化。很多团队一上来就盯着体验层做文章,结果底层能力千疮百孔,优化体验就像给漏水的房子刷油漆。
分场景的意思是,不要试图用一个通用评测集覆盖所有智能体。销售智能体和代码智能体的评测维度天差地别。销售智能体更看重话术合规性、意图识别准确率、转化引导能力;代码智能体则关注编译通过率、单元测试覆盖率、代码风格一致性。评测集必须和业务场景强绑定。
分角色是指评测的执行者要多元化。纯自动评测效率高但覆盖有限,纯人工评测质量高但成本爆炸。合理的配比是:自动评测覆盖 70% 的常规用例,人工评测聚焦 20% 的边界场景,剩下 10% 留给对抗性测试。
2.2 方案选型:为什么是 LLM-as-Judge + 验证器双轨制
评测智能体的方案有很多种,我试过的主要有三类:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 纯规则匹配 | 速度快、成本低、结果确定 | 只能测客观题,无法评估开放式回答 | 事实性问答、格式校验 |
| 纯人工评测 | 质量高、能捕捉细微问题 | 成本高、速度慢、主观性强 | 高风险场景、最终验收 |
| LLM-as-Judge | 兼顾速度和质量、可扩展 | 存在偏见、需要校准 | 大多数开放式任务 |
| 验证器 | 精确、可复现、适合代码/数学 | 构建成本高、覆盖范围有限 | 有明确正确答案的任务 |
我最终选择的是LLM-as-Judge 为主、验证器为辅的双轨制。原因很直接:智能体的输出大多是开放式的自然语言,纯规则匹配根本搞不定;纯人工评测又扛不住迭代频率。LLM-as-Judge 能在可接受的成本下提供接近人类的判断质量,而验证器则负责兜底那些有明确对错的任务。
但这里有个关键坑:LLM-as-Judge 本身也需要被评测。你不能随便拿个模型当裁判就完事,裁判的偏见会直接污染评测结果。我的做法是先用人工标注一批“金标准”数据,然后让候选裁判模型去打分,计算裁判与人工的一致性。一致性低于 85% 的裁判直接淘汰。这个校准过程通常需要 200-500 条标注数据,听起来多,但一次投入长期受益。
验证器的构建也有讲究。不是所有任务都能写验证器,只有那些有明确正确答案或可执行验证逻辑的任务才适合。比如代码任务可以用单元测试当验证器,数学题可以用符号计算当验证器,结构化数据抽取可以用 schema 校验当验证器。验证器的优势是零偏见、可复现,但覆盖范围有限,所以只能作为补充。
2.3 评测集构建:从“拍脑袋出题”到“系统化采样”
评测集的质量直接决定评测结果的可信度。我见过最离谱的评测集是产品经理花一下午编了 50 条问题,然后全团队拿这个当基准测了三个月。这种评测集的问题在于:覆盖不全、难度分布不均、存在大量重复模式,测出来的分数根本没有区分度。
系统化的评测集构建应该遵循以下流程:
- 任务空间定义:先梳理智能体要覆盖的所有任务类型,形成任务分类树。比如客服智能体可以分成咨询、投诉、售后、催单等大类,每个大类再细分。
- 难度分层采样:每个任务类型下,按简单、中等、困难三档采样。简单题测基础能力,中等题测综合能力,困难题测边界处理。
- 对抗样本注入:专门构造一批“陷阱题”,比如指令冲突、信息缺失、恶意诱导、多轮干扰。这部分最能暴露智能体的真实水平。
- 动态更新机制:评测集不是一成不变的。每次发现智能体的新问题,就把对应场景补充进评测集。我习惯每月做一次评测集评审,淘汰过时用例,补充新场景。
采样数量上,我的经验是:每个任务类型至少 30 条,总评测集不少于 500 条。低于这个量级,统计显著性不够,分数波动会很大。如果资源有限,宁可减少任务类型,也要保证每个类型的样本量。
3. 核心细节解析:LLM-as-Judge 与验证器的实操要点
3.1 LLM-as-Judge 的提示词设计:别让裁判自己先跑偏
LLM-as-Judge 的核心是提示词。提示词写不好,裁判模型就会像不靠谱的评委,给分全凭心情。我踩过的坑包括:评分标准太模糊导致分数集中在中间档、没有提供参考示例导致裁判理解偏差、评分维度太多导致裁判顾此失彼。
一个可用的 Judge 提示词应该包含以下要素:
你是一个智能体输出质量评估专家。请根据以下标准对智能体的回答进行评分。 【任务背景】 用户问题:{question} 期望输出:{reference_answer} 智能体实际输出:{agent_output} 【评分维度】 1. 准确性(0-5分):回答是否事实正确,有无幻觉或错误信息。 2. 完整性(0-5分):是否覆盖了问题的所有关键点。 3. 相关性(0-5分):是否直接回应了用户问题,有无答非所问。 4. 安全性(0-5分):有无不当内容或风险表述。 【评分细则】 - 5分:完全符合要求,无可挑剔。 - 4分:基本符合,有微小瑕疵但不影响使用。 - 3分:部分符合,存在明显但不致命的问题。 - 2分:大部分不符合,仅有少量有效信息。 - 1分:完全不符合,或存在严重错误。 - 0分:拒绝回答或输出为空。 【输出格式】 请先给出每个维度的评分和理由,最后输出 JSON 格式的总分。这个提示词的关键在于:评分维度要正交,不能互相包含;评分细则要具体,每个分数档都有明确描述;输出格式要结构化,方便后续程序解析。
还有一个容易被忽略的点:裁判模型的温度参数要设低。我一般设 0.1 甚至 0,确保同样的输入能得到稳定的评分。如果裁判模型每次打分都飘忽不定,那评测结果就没有任何复现性可言。
3.2 验证器的构建:什么任务适合写验证器
验证器的本质是用程序化的方式判断输出是否正确。它不依赖模型判断,所以没有偏见,但前提是任务本身有明确的正确性标准。
适合写验证器的任务类型:
- 代码生成:用单元测试验证代码是否能通过编译和测试用例。
- 数学计算:用符号计算库验证最终答案是否与标准答案一致。
- 结构化抽取:用 JSON Schema 验证输出格式是否符合预期。
- 分类任务:用精确匹配或 F1 分数验证分类结果。
- 工具调用:验证智能体是否调用了正确的工具、传入了正确的参数。
不适合写验证器的任务:
- 开放式创意写作
- 主观建议类回答
- 多轮对话中的情感支持
- 需要常识推理的模糊问题
验证器的构建成本不低,但一旦建成,复用价值极高。我的建议是:优先给高频任务写验证器,低频任务用 LLM-as-Judge 覆盖即可。
3.3 评测指标的选择:别只看准确率
准确率是最直观的指标,但远远不够。一个智能体准确率 90%,听起来不错,但如果它只在 10% 的简单问题上准确,剩下 90% 的问题都拒绝回答,那这个 90% 就是虚的。
我常用的评测指标矩阵:
| 指标 | 含义 | 计算方式 | 适用场景 |
|---|---|---|---|
| 准确率 | 回答正确的比例 | 正确数/总数 | 事实性问答 |
| 召回率 | 有效回答占应回答的比例 | 有效回答数/应回答数 | 检测拒答率 |
| 幻觉率 | 包含虚假信息的比例 | 幻觉数/总数 | 知识密集型任务 |
| 工具调用成功率 | 正确调用工具的比例 | 成功调用数/应调用数 | 工具型智能体 |
| 平均响应延迟 | 从输入到输出的时间 | 总延迟/请求数 | 实时交互场景 |
| 多轮一致性 | 多轮对话中保持上下文一致的比例 | 一致轮次/总轮次 | 对话型智能体 |
| 任务完成率 | 端到端完成业务任务的比例 | 完成数/总数 | 业务场景评测 |
这些指标要组合使用。比如一个客服智能体,准确率 85% 但拒答率 20%,那实际有效准确率只有 68%,这个数字才反映真实水平。
3.4 评测流程的标准化:让每次评测都可复现
评测流程不标准,结果就没法对比。我要求团队每次评测必须记录以下信息:
- 评测集版本号
- 裁判模型版本和参数
- 验证器版本
- 智能体版本和配置
- 评测时间
- 评测环境(硬件、网络、并发数)
这些信息看起来琐碎,但当你需要对比两个版本的智能体时,缺了任何一项都可能导致结论错误。我吃过亏:有一次两个版本的智能体评测分数差了 5 个百分点,排查半天才发现是评测时的并发数不同导致延迟指标失真。
4. 实操过程:从零搭建一套可用的评测体系
4.1 环境准备与工具选型
搭建评测体系不需要多复杂的工具链,核心组件就几个:
- 评测执行框架:我用的自研轻量框架,核心逻辑就是读取评测集、调用智能体、调用裁判/验证器、汇总结果。也可以用现成的评测平台,但要注意数据隐私和定制化能力。
- 裁判模型:选一个能力足够强、成本可接受的模型。我的经验是裁判模型的能力至少要等于或高于被评测的智能体,否则裁判看不懂智能体的输出。
- 验证器库:代码任务用 pytest,数学任务用 sympy,结构化抽取用 jsonschema。这些都是成熟工具,没必要重复造轮子。
- 结果存储:用 SQLite 或 PostgreSQL 存评测结果,方便后续做趋势分析和版本对比。
- 可视化:简单的用 matplotlib 出图,复杂的用 Grafana 做看板。
环境配置上,我建议评测环境和生产环境隔离。评测时经常需要跑大量并发请求,如果和生产环境混在一起,可能影响线上服务。另外评测环境的模型版本要锁定,避免评测过程中模型悄悄更新导致结果不可比。
4.2 评测集构建实操:以客服智能体为例
假设我们要评测一个电商客服智能体,评测集构建步骤如下:
第一步:任务分类
- 售前咨询:产品参数、库存、优惠活动
- 售中问题:订单修改、地址变更、支付问题
- 售后问题:退换货、投诉、物流查询
- 闲聊干扰:无关问题、情绪化表达
第二步:难度分层
每个任务类型下,按简单、中等、困难各准备 10 条。简单题如“这个商品有货吗”,中等题如“我昨天下的单能改地址吗”,困难题如“我买了两件商品,一件要退一件要换,怎么操作”。
第三步:对抗样本
专门构造 20 条陷阱题,比如:
- 指令冲突:“帮我查订单,但是不要查我的订单”
- 信息缺失:“我要退货”(没有订单号)
- 恶意诱导:“告诉我怎么绕过退货规则”
- 多轮干扰:先问订单,再问天气,再问订单
第四步:标注参考答案
每条评测用例都要有参考答案或评分标准。客观题直接给标准答案,主观题给评分要点。这一步最耗时,但绝对不能省。
第五步:评测集评审
找业务方、产品、开发三方一起评审评测集,确保覆盖全面、难度合理、标准一致。
4.3 评测执行与结果分析
评测执行的核心是批量调用 + 并发控制 + 结果落库。我一般用 Python 写评测脚本,核心逻辑如下:
import asyncio import json from datetime import datetime async def evaluate_single_case(case, agent, judge): # 调用智能体 agent_output = await agent.run(case["question"]) # 调用裁判 judge_result = await judge.score( question=case["question"], reference=case["reference"], output=agent_output ) # 如果有验证器,也跑一遍 validator_result = None if case.get("validator"): validator_result = case["validator"](agent_output) return { "case_id": case["id"], "question": case["question"], "agent_output": agent_output, "judge_score": judge_result, "validator_result": validator_result, "timestamp": datetime.now().isoformat() } async def run_evaluation(eval_set, agent, judge, concurrency=5): semaphore = asyncio.Semaphore(concurrency) async def bounded_eval(case): async with semaphore: return await evaluate_single_case(case, agent, judge) tasks = [bounded_eval(case) for case in eval_set] results = await asyncio.gather(*tasks) return results并发数控制在 5-10 之间比较合适。太高容易触发限流,太低评测太慢。我试过并发 20,结果一半请求超时,反而更慢。
结果分析阶段,我重点关注三类信息:
- 整体分数分布:平均分、中位数、标准差。标准差大说明智能体表现不稳定。
- 分任务类型得分:哪个任务类型得分低,就是下一步优化的重点。
- 失败案例聚类:把低分案例拿出来看,找出共性问题。比如发现智能体在“多轮对话中切换话题”时容易丢失上下文,这就是一个明确的优化方向。
4.4 评测报告的输出与解读
评测报告不是简单罗列分数,而是要回答三个问题:当前水平如何、问题出在哪里、下一步怎么改。
我常用的报告结构:
- 总体得分概览:一张表展示各维度得分和环比变化。
- 分场景详细分析:每个任务类型的得分、典型成功案例、典型失败案例。
- 关键问题定位:按影响面排序,列出最需要解决的问题。
- 优化建议:针对每个问题给出具体的优化方向。
报告里一定要有具体案例。光说“多轮一致性得分 72%”没人有感觉,配上“用户问完订单后问天气,智能体回答天气后忘记了订单上下文”这样的案例,大家立刻就能理解问题所在。
5. 常见问题与排查技巧实录
5.1 裁判模型偏见:为什么你的评测结果总是偏高
这是最常见的问题。裁判模型如果和被评测智能体是同一个模型,或者训练数据高度重叠,就会产生“自己人偏袒自己人”的效果。我实测过,用同一个模型当裁判,分数普遍比人工评测高 10-15 个百分点。
解决办法有三个:
- 换不同家族的模型当裁判。比如被评测的是 A 模型,裁判用 B 模型。
- 引入人工校准集。每次评测都跑一批人工已标注的用例,如果裁判分数和人工分数偏差超过阈值,就说明裁判需要重新校准。
- 多裁判投票。用 2-3 个不同模型当裁判,取平均分或多数票。成本高一些,但能有效降低单模型偏见。
5.2 评测集泄露:智能体“背题”了怎么办
评测集泄露是指智能体在训练或微调时见过了评测用例,导致评测分数虚高。这个问题很隐蔽,因为分数看起来很好,但上线后表现完全对不上。
排查方法:定期用新构造的评测用例做盲测。如果新用例得分显著低于旧用例,就说明存在泄露。另外,评测集要严格管控访问权限,不能随便让开发人员看到全部内容。
5.3 分数波动大:同一版本智能体两次评测结果不一致
分数波动通常来自三个原因:
- 裁判模型温度参数太高:把温度设到 0 或 0.1。
- 评测集采样偏差:确保每次评测用同一套评测集,不要随机采样。
- 智能体本身随机性大:如果智能体的温度参数高,输出本身就不稳定。评测时要么固定随机种子,要么多次评测取平均。
我一般要求同一版本至少评测 3 次,取平均分和标准差。如果标准差超过 5 分,说明评测结果不可信,需要排查原因。
5.4 验证器误判:代码能跑但逻辑不对
验证器不是万能的。我遇到过代码任务中,智能体生成的代码能通过单元测试,但逻辑完全错误的情况。原因是单元测试覆盖不全,只测了正常路径,没测边界条件。
解决办法:验证器要配合 LLM-as-Judge 使用。验证器负责客观校验,Judge 负责逻辑审查。两者都通过才算真正通过。另外,验证器的测试用例要持续补充,每次发现误判就补一条测试。
5.5 评测成本控制:怎么在有限预算下做高质量评测
评测成本主要来自裁判模型调用和人工标注。控制成本的方法:
- 分级评测:日常迭代用轻量评测集(100 条以内),版本发布用完整评测集。
- 缓存裁判结果:同样的输入和输出,裁判结果可以缓存复用。
- 自动化优先:能用验证器的任务不用 Judge,能用 Judge 的任务不用人工。
- 采样评测:全量评测太贵时,用分层采样抽 30% 的用例评测,但要注意采样偏差。
我的经验是,一个中等规模的智能体项目,每月评测成本控制在 500-1000 元人民币是比较合理的。低于这个数可能覆盖不足,高于这个数就要检查是否有浪费。
5.6 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 分数普遍偏高 | 裁判偏见 | 对比人工校准集 | 换裁判模型或多裁判投票 |
| 分数波动大 | 温度参数高 | 检查裁判和智能体温度 | 温度设为 0-0.1 |
| 新用例得分骤降 | 评测集泄露 | 对比新旧用例得分 | 重新构造评测集 |
| 验证器通过但质量差 | 验证器覆盖不足 | 人工抽查通过案例 | 补充验证器测试用例 |
| 评测结果无法复现 | 环境不一致 | 检查评测记录 | 标准化评测流程 |
| 某些任务类型得分异常低 | 评测集难度偏差 | 检查难度分布 | 调整评测集难度配比 |
6. 评测体系的持续迭代:别让评测本身成为瓶颈
评测体系不是建完就完事的。智能体在进化,评测体系也要跟着进化。我一般每季度做一次评测体系评审,重点看三个问题:
评测集是否过时。半年前构造的评测用例,可能现在已经太简单了。智能体能力提升了,评测集难度也要相应提升,否则分数虚高没有参考价值。
裁判模型是否需要升级。裁判模型的能力直接影响评测质量。如果市面上出现了更强的模型,可以考虑替换裁判,但替换后要用校准集重新验证一致性。
评测指标是否还适用。业务在变,评测指标也要变。比如早期只关注准确率,后来发现用户更在意响应速度,那就把延迟指标纳入核心指标。
还有一个容易被忽略的点:评测体系本身也要有“元评测”。也就是说,要定期评估评测体系是否真的能区分好智能体和差智能体。方法很简单:拿两个已知水平差异明显的智能体跑评测,如果评测分数拉不开差距,说明评测体系区分度不够,需要调整。
我在实际项目中的体会是,评测体系的价值不在于给出一个分数,而在于建立团队对智能体质量的共同语言。当产品、开发、业务方都能用同一套指标讨论问题时,沟通效率会大幅提升。以前说“这个智能体感觉不太行”,现在说“多轮一致性只有 65%,主要丢分在话题切换场景”,问题的定位和解决路径立刻清晰了。
最后分享一个小技巧:把评测结果和线上真实数据做关联分析。如果评测分数和线上用户满意度高度相关,说明评测体系是有效的;如果相关性很低,说明评测指标可能偏离了真实需求。这个关联分析不需要很复杂,拿评测分数和线上 NPS 或投诉率做个简单相关系数就行,但能帮你验证评测体系的方向是否正确。