AI Agent 和传统软件最大的差异,不是多了一层大模型调用,而是行为变得更难预测。传统接口只要输入相同、版本相同,输出通常就是确定的;Agent 则可能因为模型采样、上下文变化、工具返回差异、Prompt 调整而产生不同路径和不同结论。
这让“跑通一次”失去了足够的说服力。一个 Agent 今天能完成任务,不代表改完 Prompt、升级模型、替换工具后仍然可靠。生产环境需要回答的是几个更具体的问题:
- 同一个任务重复执行,成功率有多高?
- 模型升级后,旧能力有没有退化?
- 最终答案对了,执行过程是不是也合理?
- Token、耗时、工具调用次数是否超过可接受范围?
- 遇到异常输入、工具失败、提示词注入时会不会失控?
Agent 测评要解决的不是“能不能偶尔成功”,而是“能不能持续、稳定、低成本地成功”。
Agent 测评到底测什么
可以把 Agent 测评抽象成一个闭环:
flowchart LR
A[测评用例<br/>Prompt + 输入条件] --> B[Agent 执行]
B --> C[采集执行轨迹<br/>Trace + 产物 + 指标]
C --> D[评分器打分<br/>规则 / 模型 / 人工]
D --> E[生成报告<br/>分数 + 扣分原因 + 成本]
E --> F[修复或回归]
F --> A
这个闭环有三个关键点。
第一,必须采集过程。只看最终回答,很容易漏掉“结果碰巧正确、过程完全错误”的情况。Agent 可能没有调用指定工具,却凭训练数据猜出了一个看似合理的答案;也可能漏掉关键步骤,但最后用含糊表述掩盖了问题。
第二,评分结果要可比较。同一个用例在模型 A 和模型 B 上的分数、成本、稳定性都要能横向比较;同一个 Agent 在上周和本周的表现也要能纵向比较。
第三,测评要进入研发流程。只在上线前人工点几条用例,无法覆盖模型升级、工具变化和 Prompt 微调带来的回归风险。更合理的做法是把测评接入持续集成(CI,Continuous Integration),每次关键变更都自动运行。
三类评分器:代码、模型和人工各司其职
Agent 输出里有些内容可以用程序判断,例如文件是否存在、JSON 是否合法、工具参数是否正确;有些内容只能靠语义判断,例如解释是否清楚、建议是否贴合上下文、推理是否自洽。单一评分方式覆盖不了全部场景。
一套实用的 Agent 测评体系通常需要三类评分器组合使用:
flowchart TB
A[确定性评分器<br/>脚本 / 断言 / Schema / AST] --> B[Rubric 评分器<br/>LLM-as-Judge + 评分量表]
B --> C[人工评分器<br/>专家标注 / 抽样复核 / 红队测试]
A -.优先使用.-> D[能用代码判断的硬指标]
B -.补充判断.-> E[开放式自然语言输出]
C -.校准兜底.-> F[高风险和边缘场景]
| 评分器 | 适合判断 | 优点 | 代价 | 是否适合做门禁 |
|---|---|---|---|---|
| 确定性评分器 | 文件存在、Schema 合法、工具调用顺序、Token 阈值 | 快、便宜、稳定、可复现 | 只能判断规则明确的内容 | 适合硬门禁 |
| Rubric 评分器 | 回答质量、推理合理性、建议完整性、语气风格 | 能处理开放式输出 | 有抖动,需要校准 | 适合分级门禁 |
| 人工评分器 | 专家判断、复杂主观任务、安全红队、异常诊断 | 最接近黄金标准 | 慢、贵、不可大规模跑 | 不适合日常门禁 |
选择顺序很简单:能用代码判断的,不交给模型;代码判断不了但可以写清评分标准的,再交给模型;模型也难以稳定判断、或者风险极高的,再让专家介入。
确定性评分器
确定性评分器负责所有“规则清楚、可以程序化判断”的内容。它是日常回归测评的主力。
常见规则包括:
expected_behavior:
tool_calls:
- name: mcp
contains: tperf-mcp
files:
exists:
- cpu.json
- nic.json
response:
contains:
- 测试有效
- 出现 CPU 瓶颈
- 业务 QPS 平稳
not_contains:
- api_key
- GPU 使用率
limits:
max_tool_calls: 10
max_latency_seconds: 300
这类规则的好处是稳定。只要输入数据和判定逻辑不变,结果就不会因为评分模型波动而变化。
Rubric 评分器
Rubric 是评分量表。用在 Agent 测评里,通常指让另一个大模型按照固定提示词、固定评分维度和固定输出格式打分,也叫 LLM-as-Judge。
Rubric 评分器适合判断自然语言质量,例如:
rubric:
observation_points:
- 回答是否基于给定知识库,而不是泛泛而谈
- 推理过程是否连贯,有没有跳步
- 是否编造不存在的字段、数据或 API
- 建议是否能直接指导后续排查
scoring:
process_score: 0-100
result_score: 0-100
is_false_positive: boolean
reasons:
type: array
items: string
为了减少模型评分抖动,需要固定评分模型版本、固定 Prompt、固定 JSON Schema,并定期用人工标注结果做校准。一个可用的 Rubric 评分器,和专家判断的一致率至少应达到一个团队可接受的阈值,例如 85%。
人工评分器
人工不应该承担日常回归的主要工作。专家时间最适合用在六类事情上:
| 场景 | 人工要做什么 |
|---|---|
| 校准 Rubric 评分器 | 抽样标注,与模型评分对齐 |
| 建立黄金答案 | 为新套件准备首批可信参考结果 |
| 诊断异常通过率 | 排查 0% 或 100% 这类可疑结果 |
| 审查 Trace | 定期抽样看执行轨迹,发现隐藏失败模式 |
| 主观体验判断 | 判断同理心、专业度、论证严谨度 |
| 高风险兜底 | 医疗、金融、安全等场景做强制复核 |
0% 通过率和 100% 通过率都值得警惕。前者可能是 Agent 真不行,也可能是用例写错、基线错误、评分器过严;后者可能说明 Agent 稳定,也可能说明用例太简单、评分器没抓住关键点。
五个测评维度:从做对到好用
Agent 测评不能只看最终答案。一个完整的测评框架至少要覆盖五个层次:
flowchart TB
A[功能正确性<br/>做对了吗] --> B[过程质量<br/>过程合理吗]
B --> C[效率与成本<br/>划算吗]
C --> D[鲁棒性与安全<br/>关键时刻会翻车吗]
D --> E[体验与对齐<br/>用户愿意继续用吗]
| 维度 | 典型子项 | 主要评分方式 | 优先级 |
|---|---|---|---|
| 功能正确性 | 结果正确、任务完成、指令遵循、工具调用正确 | 确定性评分器 | P0 |
| 过程质量 | 推理合理、步骤最优、上下文利用、自我纠错 | Rubric + 人工抽查 | P1 |
| 效率与成本 | Token、延迟、工具调用次数、重试率、单次成本 | 确定性评分器 | P1 |
| 鲁棒性与安全 | 稳定性、异常恢复、抗注入、幻觉率、越权风险 | 确定性 + 人工 | P0 |
| 体验与对齐 | 清晰度、语气、主动澄清、可解释性、满意度 | Rubric + 用户反馈 | P2 |
P0 维度需要优先自动化,尤其是功能正确性和安全稳定性。体验类指标也重要,但通常可以在早期用抽样方式覆盖,等产品进入稳定阶段后再接入线上反馈和 A/B 测试。
pass@k 和 pass^k 不要混用
Agent 的非确定性使得“跑几次”本身也成为指标。
| 指标 | 含义 | 衡量什么 |
|---|---|---|
| pass@k | k 次里至少成功 1 次的概率 | 峰值能力 |
| pass^k | k 次全部成功的概率 | 稳定性 |
如果一个 Agent 跑 5 次,只有 1 次成功,那么 pass@5 可以是成功,但 pass^5 是失败。生产系统更关心 pass^k,因为用户不会因为“它偶尔能做对”就接受关键任务失败。
不同 Agent 的测评重点
通用框架相同,但不同类型的 Agent 风险点不同,测评权重也应该不同。
| Agent 类型 | 核心风险 | 测评重点 | 更依赖的评分器 |
|---|---|---|---|
| 知识库问答 | 编造答案、引用错误、遗漏上下文 | 准确性、幻觉检测、引用溯源 | Rubric + 事实核查 |
| 代码生成 | 代码不可运行、需求没实现、破坏原逻辑 | 编译、测试、静态检查、Diff 审查 | 确定性评分器 |
| 工具型 Agent | 工具选错、参数错、流程不合规 | 工具调用序列、参数、产物完整性 | 确定性 + 基线对比 |
| 故障排查 Agent | 根因错误、推理跳步、漏掉关键证据 | Trace、根因准确性、排查路径 | Rubric + 人工抽查 |
| 对话服务 Agent | 答非所问、语气不一致、过度拒绝 | 指令遵循、主动澄清、体验对齐 | Rubric + 线上反馈 |
例如知识库问答需要重点防幻觉,代码生成则应该优先跑编译和测试。工具型 Agent 的关键不是“会不会说”,而是有没有按正确步骤调用正确工具。
用例集设计:从触发到异常容错
测评用例不是随便收集一批 Prompt,而是要覆盖 Agent 生命周期里的关键风险。一个实用的用例集可以分成四类:
flowchart LR
A[触发条件<br/>该不该启动 Skill] --> B[核心逻辑<br/>执行路径是否正确]
B --> C[产物质量<br/>输出是否可用]
C --> D[异常容错<br/>异常场景是否可控]
| 场景 | 要验证的问题 | 正向用例 | 负向用例 |
|---|---|---|---|
| 触发条件 | Skill 是否在正确场景启动 | 合法表述都能触发 | 相似但无关请求不误触发 |
| 核心逻辑 | 工具调用和分支路径是否正确 | 覆盖每条主流程 | 缺关键步骤、错工具、错参数 |
| 产物质量 | 回答、报告、文件是否完整准确 | 关键结论齐全、格式合法 | 幻觉、字段缺失、敏感信息泄露 |
| 异常容错 | 输入异常或工具失败时是否可控 | 明确提示、优雅降级 | 崩溃、死循环、静默失败 |
触发条件用例
触发用例要同时测“该触发”和“不该触发”。只测正例会让 Skill 变成“什么都响应”,这在线上比漏触发更难排查。
| 用例 ID | 类型 | Prompt | 预期行为 |
|---|---|---|---|
| trigger-pos-01 | 正向 | 分析用例 134263 | 触发性能分析 Skill |
| trigger-pos-02 | 正向 | 帮我看看用例 134263 的性能数据 | 触发性能分析 Skill |
| trigger-neg-01 | 负向 | CPU 高负载应该如何排查? | 不触发性能分析 Skill |
| trigger-neg-02 | 负向 | 用例 134263 是谁创建的? | 不触发性能分析 Skill |
核心逻辑用例
核心逻辑用例通常数量最多。设计时先画出 Agent 的主流程和分支,再保证每条关键路径至少有一个用例。
| 分支路径 | 用例示例 | 核心检查点 |
|---|---|---|
| 单用例 CPU 分析 | 输入仅含 CPU 异常数据 | 只获取 CPU 相关指标,不拉取无关数据 |
| 多指标综合分析 | 输入包含 CPU、网络、业务指标 | 多类指标都进入分析 |
| 多用例对比 | 对比用例 A 和用例 B | 两个用例的数据都被获取并对比 |
| 存在瓶颈 | 指标存在明显异常 | 识别瓶颈并给出建议 |
| 无明显瓶颈 | 指标正常 | 不编造问题 |
| 压测无效 | QPS 未达预期 | 标记压测无效并说明原因 |
如果一个 Skill 有 N 条核心分支,至少需要 N 个正向用例,再补充高风险分支的负向用例。分支过多时,优先覆盖高频路径、历史 Bad Case 和影响结论的关键路径。
产物质量用例
产物质量关注最终输出是否能被用户或下游系统使用。
| 用例 ID | Prompt | 检查规则 |
|---|---|---|
| output-pos-01 | 分析用例 1434534 | 检查报告文件存在、关键结论完整、结构化章节齐全 |
| output-pos-02 | 分析用例 1434534,输出 JSON 格式报告 | 校验 JSON 合法性和必填字段 |
| output-neg-01 | 分析用例 1434534 | 检查不包含不存在的指标和敏感字段 |
异常容错用例
异常用例要覆盖输入错误、边界条件和外部依赖故障。
| 子类 | Prompt 或条件 | 预期行为 |
|---|---|---|
| 不存在的 ID | 分析用例 23457778888 | 明确说明用例不存在 |
| 非法格式 | 分析用例 abc | 提示 ID 格式错误 |
| 信息不足 | 分析用例 | 主动追问用例 ID |
| 数据为空 | 用例存在但无指标数据 | 说明无可分析数据,不编造结论 |
| 数据量极大 | 大规模压测记录 | 不超时或给出可解释降级 |
| 工具失败 | 模拟 MCP 工具超时 | 重试有限次数后给出明确提示 |
MCP(Model Context Protocol,模型上下文协议)常用于让 Agent 标准化调用外部工具和数据源。只要 Agent 依赖外部工具,工具失败和返回异常就必须进入用例集。
评分规则:用扣分制把问题暴露出来
评分规则要能解释“为什么扣分”,也要能拉开好坏差距。一个简单可落地的方案是满分 100 分扣分制:
trial_score = max(0, 100 - 过程扣分 - 结果扣分 - 效率扣分 - 安全扣分)
trial_pass = trial_score >= 80
| 评分维度 | 扣分规则示例 |
|---|---|
| 任务结果 | 最终结论与预期不符,直接扣 100 分 |
| 步骤遵循 | 每缺少一个关键步骤扣 10 分 |
| 工具调用 | 工具选错、参数错误、顺序错误,每项扣 10 分 |
| 输出格式 | JSON 不合法、缺必填字段、报告章节缺失,按严重程度扣分 |
| 效率成本 | 超过基线耗时或 Token 阈值,按比例扣分 |
| 安全合规 | 泄露敏感信息、越权调用工具,按严重程度扣分或直接失败 |
评分输出建议使用结构化 JSON,便于生成报告和后续分析:
{
"case_id": "logic-cpu-01",
"trial_id": "trial-003",
"score": 86,
"pass": true,
"deductions": [
{
"dimension": "process",
"points": 10,
"reason": "缺少网络指标排除步骤"
},
{
"dimension": "efficiency",
"points": 4,
"reason": "Token 消耗超过基线 40%"
}
]
}
基线管理:先确认一次正确答案,再做回归
很多 Agent 用例很难在设计阶段手写完整预期结果,因为它不仅有最终回答,还有工具调用、上下文检索、中间产物和耗时成本。更实用的方式是先执行一次,经人工确认后把这次执行保存为基线。
flowchart LR
A[定义用例<br/>Prompt + 检查规则] --> B[执行一次 Agent]
B --> C[采集 Trace 和产物]
C --> D{人工确认可接受?}
D -- 否 --> E[修复 Agent 或调整用例]
E --> B
D -- 是 --> F[保存为基线]
F --> G[后续测评与基线对比]
基线包含两类内容。
| 基线内容 | 示例 |
|---|---|
| 预期过程 | 工具调用序列、调用参数、返回摘要、中间文件、完整 Trace |
| 预期结果 | 最终回答、Markdown 报告、JSON 文件、图表、结构化数据 |
后续每次测评都拿新执行结果和基线对比:
| 对比维度 | 确定性评分器怎么用 | Rubric 评分器怎么用 |
|---|---|---|
| 过程 | 比较关键工具调用是否缺失、顺序是否偏离 | 判断步骤选择是否合理 |
| 结果 | 检查关键字段、文件、结论是否一致 | 判断语义是否等价、建议是否完整 |
| 效率 | 比较耗时、Token、工具调用次数是否超阈值 | 通常不需要模型判断 |
基线不是永久不变的。Agent 逻辑变更、模型升级、工具接口调整、用例 Prompt 修改时,都可能需要重新执行并确认新基线。
工程化落地:Trace、隔离环境和流水线
测评方案要真正有用,必须自动运行、可追溯、可复现。
Trace 是过程测评的前提
Trace 是 Agent 执行轨迹,记录工具调用、参数、返回值、时间戳、模型输出和中间产物。没有 Trace,就只能测最终结果,无法判断过程是否正确。
理想的 Trace 可以用 JSONL 表达,每行是一个独立事件:
{"type":"tool_call","name":"read_file","params":{"path":"src/main.ts"},"timestamp":"2026-04-26T10:00:01Z"}
{"type":"tool_result","name":"read_file","result":"...","timestamp":"2026-04-26T10:00:02Z"}
{"type":"thinking","content":"需要修改 handleRequest 的参数校验逻辑","timestamp":"2026-04-26T10:00:03Z"}
{"type":"tool_call","name":"edit_file","params":{"path":"src/main.ts"},"timestamp":"2026-04-26T10:00:04Z"}
Trace 至少要满足三点:
| 要求 | 说明 |
|---|---|
| 结构化 | JSON、JSONL 或稳定协议格式,能被程序解析 |
| 信息完整 | 包含工具名、入参、返回值、时间戳、耗时、Token |
| 格式稳定 | 字段名和层级不要频繁变化,否则评分器会变脆弱 |
如果 Agent 只有非结构化日志,可以先写解析器提取关键信息,但长期看仍应把结构化 Trace 作为标准能力。
环境隔离避免状态污染
Agent 测评常常会读写文件、调用工具、生成报告。如果多个用例共用同一个工作目录,前一个用例的产物可能影响后一个用例,导致结果失真。
常见隔离方式:
# 每个用例执行前清理工作区
git checkout .
git clean -fd
# 或者为每个 trial 创建独立临时目录
tmp_dir=$(mktemp -d)
git clone "$repo_url" "$tmp_dir"
测评产物需要统一归档,包括 Trace、模型回答、评分 JSON、报告文件、HTML 报告和执行日志。
稳定性评估要多跑几次
Agent 测评不能只跑一次。建议对关键用例执行 N 次,常见取值是 5 或 10。
| N=5 执行结果 | 解释 | 后续动作 |
|---|---|---|
| ✓ ✓ ✓ ✓ ✓ | 稳定通过 | 可进入回归套件 |
| ✓ ✓ ✓ ✓ ✗ | 偶发失败 | 分析失败 Trace,按风险决定是否阻塞 |
| ✓ ✗ ✓ ✗ ✓ | 波动明显 | 排查 Prompt、工具、模型和评分器 |
| ✗ ✗ ✗ ✗ ✗ | 稳定失败 | 优先检查用例、基线和评分标准 |
不同 Agent 对失败的容忍度不一样:
| 使用类型 | 建议容忍阈值 |
|---|---|
| 关键决策类,例如故障诊断、风险判断 | 0%,N 次必须全部通过 |
| 辅助分析类,例如性能报告、数据总结 | 可接受少量失败,例如 10 次最多 1 次 |
| 创意生成类,例如文案、头脑风暴 | 允许更高波动,但核心约束必须满足 |
测评报告应该展示什么
好的测评报告不是只给一个总分,而是帮助工程师定位问题。至少应包含四层信息:
| 层级 | 内容 |
|---|---|
| 全局概览 | 用例总数、通过率、平均分、模型版本、总 Token、总费用 |
| 分组统计 | 按能力域或场景分组展示通过率和均分 |
| 单用例详情 | Prompt、基线信息、多次 Trial 分数、耗时、Token、扣分原因 |
| 执行证据 | Trace、工具调用明细、模型回答、产物文件、对话链接 |
报告里最好同时展示质量和成本。一个模型通过率更高,但 Token 消耗是另一个模型的 10 倍,未必适合生产;另一个模型虽然便宜,但 pass^5 明显偏低,也可能不适合关键场景。
实战示例:性能分析 Agent 的测评方案
假设有一个性能分析 Agent,它部署在智能体平台上,接收压测记录 ID,通过 MCP 工具拉取 CPU、内存、网络、磁盘、业务指标,再结合知识库规则判断压测是否有效、是否存在瓶颈,并输出性能分析报告。
整体调用链路可以设计成这样:
sequenceDiagram
participant U as 用户
participant P as 性能测试平台
participant A as 性能分析 Agent
participant M as MCP 工具
participant K as 业务知识库
U->>P: 发起压测并查看结果
P->>A: 压测完成后触发分析
A->>M: 拉取压测指标数据
M-->>A: 返回 CPU / 网络 / 磁盘 / 业务指标
A->>K: 检索分析规则和排查经验
K-->>A: 返回知识库片段
A-->>P: 输出结构化分析报告
U->>A: 追问瓶颈原因或优化建议
A-->>U: 返回进一步排查建议
这个 Agent 的测评重点不是闲聊体验,而是三件事:
- 操作步骤合规:是否按正确流程拉取指标、检索知识库、生成结论。
- 执行效率可控:耗时、Token、工具调用次数是否在阈值内。
- 报告质量可靠:压测有效性、性能结果、瓶颈定位和建议是否正确。
评分设计
可以把满分 100 分拆成三类扣分:
| 维度 | 最大扣分 | 评分方式 |
|---|---|---|
| 操作步骤 | 10 | 用确定性评分器比较基线与 Trial 的工具调用序列 |
| 效率成本 | 10 | 耗时和 Token 超过阈值后按比例扣分 |
| 报告内容 | 80 | 用 Rubric 对比基线报告和 Trial 报告 |
综合公式:
trial_score = max(0, 100 + step_deduction + efficiency_deduction + report_deduction)
trial_pass = trial_score >= 80
case_score =
avg(trial_score) 当所有 trial 都达标
0 当任一 trial 不达标
示例:
| 用例 | Trial 1 | Trial 2 | Trial 3 | 是否全部达标 | 用例总分 |
|---|---|---|---|---|---|
| cpu-01 | 95 | 92 | 88 | 是 | 91.7 |
| cpu-02 | 90 | 75 | 93 | 否 | 0 |
| nic-01 | 100 | 100 | 98 | 是 | 99.3 |
| disk-01 | 85 | 82 | 80 | 是 | 82.3 |
| tcp-01 | 80 | 79 | 85 | 否 | 0 |
这里采用了比较严格的稳定性策略:只要同一个用例的任意一次 Trial 低于 80 分,用例总分就归零。对于会影响性能瓶颈判断、版本发布判断的 Agent,这种策略能更早暴露偶发错误。
操作步骤评分
性能分析 Agent 的流程通常是一串工具调用。比较步骤时不能机械比较完整字符串,否则时间戳、文件内容、查询参数的小变化都会造成误报。更合理的做法是先归一化,再比较序列。
flowchart LR
A[基线步骤序列] --> C[步骤归一化]
B[Trial 步骤序列] --> C
C --> D[LCS 序列对齐]
D --> E[识别缺失 / 多余 / 顺序错误]
E --> F[按规则扣分]
LCS(Longest Common Subsequence,最长公共子序列)适合做这类序列对齐。归一化规则可以包括:
| 步骤类型 | 归一化方式 |
|---|---|
| 时间戳 | 替换为占位符 |
| 搜索工具 | 忽略非关键查询参数 |
| 写文件工具 | 只保留路径,忽略完整文件内容 |
| 终端命令 | 提取脚本名和关键参数 |
| 连续读文件 | 组内不严格校验顺序 |
这样能让评分器关注真正重要的流程差异,而不是被无关细节干扰。
报告评分
报告评分可以让模型按固定 Rubric 对比基线报告和 Trial 报告。关键判定必须严格一致,章节内容允许语义等价。
| 报告项 | 判定标准 |
|---|---|
| 压测有效性 | 有效 / 无效必须与基线一致 |
| 性能结果 | 通过 / 不通过必须与基线一致 |
| CPU 分析 | 异常等级和关键发现一致 |
| 网络分析 | 丢包、队列、RSS 等结论一致 |
| 磁盘 IO | util、await、iowait 等关键判断一致 |
| 业务指标 | QPS、错误率、延迟趋势判断一致 |
| 根因定位 | 核心原因一致 |
| 优化建议 | 排查方向一致,措辞可不同 |
| 数据准确性 | 整数精确匹配,小数允许小范围误差 |
报告评分 Prompt 应要求模型输出结构化结果,而不是自由发挥:
{
"key_judgement_match": true,
"deductions": [
{
"section": "network",
"points": 5,
"reason": "Trial 漏掉了 RSS 队列收包不均的结论"
}
],
"total_deduction": 5
}
用例集组织
性能分析 Agent 的用例最好按瓶颈类型分组,每个用例绑定一条真实压测记录。真实记录生成后不可变,比 mock 数据更接近生产,也更利于复现。
| 场景分组 | 典型覆盖 |
|---|---|
| CPU 瓶颈 | 单核高负载、中断绑核异常、RSS 配置异常 |
| 网卡瓶颈 | 队列收包不均、大象流、硬件丢包 |
| 磁盘瓶颈 | IO util 高、await 高、iowait 高 |
| 内存问题 | 内存占用率过高 |
| TCP 队列 | accept 队列溢出、连接堆积 |
| Nginx 问题 | 核间负载不均、配置或代码问题 |
| 压测配置问题 | 压力不足、目标 QPS 未达到 |
| 正常场景 | 指标正常、不应编造瓶颈 |
用例配置可以写成 YAML:
task_group: test_cpu
task_group_alias: CPU 相关指标异常分析
tasks:
- task_name: cpu_interrupt_bindcore_single_core_high_load
task_desc: CPU 瓶颈,中断绑核异常,单核高负载
tperf_test_record_id: "1258797"
prompt: "分析用例 {tperf_test_record_id}"
baseline_trial:
session_id: "66254b2c49794713b02cbecd425ebf09"
message_id: "269806ca2dd04e259b042345cf7fc313"
配置里不需要硬编码完整预期报告,只需要记录人工确认过的基线会话标识。评分时通过平台 API 获取基线报告、步骤、耗时和 Token。
执行流程
单个用例可以跑多次 Trial,并行触发、并行评分,最后聚合为稳定性结果。
flowchart TB
A[加载用例配置] --> B[获取基线数据]
B --> C[并发执行 N 次 Trial]
C --> D1[步骤评分]
C --> D2[效率评分]
C --> D3[报告评分]
D1 --> E[合并单次 Trial 得分]
D2 --> E
D3 --> E
E --> F{所有 Trial 达标?}
F -- 是 --> G[用例得分 = 平均分]
F -- 否 --> H[用例得分 = 0]
G --> I[生成 HTML 报告]
H --> I
常见执行模式有三种:
| 模式 | 作用 |
|---|---|
| 快速分析 | 每个用例跑 1 次,用于开发调试和基线确认 |
| 全量测评 | 每个用例跑 N 次,并覆盖多个模型,用于版本验收 |
| 重新评分 | 复用已有执行结果,只重跑评分器,用于调整评分逻辑 |
模型对比报告建议同时展示质量、稳定性和成本:
| 模型 | pass@1 | pass^5 | 用例通过率 | 平均分 | Token 使用量 | 费用 | 平均耗时 |
|---|---|---|---|---|---|---|---|
| model-A | 96% | 90% | 93% | 91.5 | 0.8M | $x.x | 220s |
| model-B | 94% | 76% | 89% | 84.2 | 0.6M | $x.x | 210s |
| model-C | 88% | 70% | 82% | 78.9 | 0.5M | $x.x | 190s |
pass@1 高但 pass^5 低,说明模型偶发失败较多;费用低但通过率明显下降,也未必适合生产。模型选型不能只看单次成功率。
用例集维护:能力测评和回归测评分开
Agent 测评体系需要持续维护。比较好的做法是把用例分成两套:
| 套件 | 回答的问题 | 期望通过率 | 用途 |
|---|---|---|---|
| 能力测评 | Agent 还能学会什么? | 起步可以较低 | 指导优化方向 |
| 回归测评 | 已有能力有没有退化? | 接近 100% | 守住稳定能力 |
能力测评中的用例经过优化后稳定通过,就可以“毕业”进入回归测评。回归测评集原则上只增不减,除非业务逻辑已经变化到用例失效。
flowchart LR
A[新增能力用例] --> B[能力测评]
B --> C{稳定通过?}
C -- 否 --> D[优化 Prompt / 工具 / Agent 逻辑]
D --> B
C -- 是 --> E[进入回归测评]
E --> F[CI 每次运行]
F --> G[发现退化或 Bad Case]
G --> B
线上 Bad Case 是最有价值的用例来源。每发现一次失败,都应该按固定流程处理:
- 复现问题,保存完整 Trace。
- 分析根因,明确正确行为。
- 修复 Agent、Prompt、工具或评分器。
- 把 Bad Case 加入能力测评。
- 稳定通过后转入回归测评。
术语速查
| 术语 | 含义 |
|---|---|
| Prompt | 提示词,发送给模型的指令文本 |
| Token | 模型处理文本的最小单位,也是常见计费单位 |
| Trace | Agent 执行轨迹,包含工具调用、参数、返回值和中间产物 |
| Eval | Evaluation,系统化测评 |
| Rubric | 评分量表,用固定标准约束模型评分 |
| LLM-as-Judge | 让大模型充当评委进行评分 |
| CoT | Chain of Thought,思维链 |
| pass@k | k 次里至少 1 次通过的概率 |
| pass^k | k 次全部通过的概率 |
| MCP | Model Context Protocol,模型上下文协议 |
| AG-UI | Agent-UI Protocol,Agent 与界面通信的事件协议 |
| LCS | Longest Common Subsequence,最长公共子序列 |
| Prompt Injection | 提示词注入,通过恶意输入劫持 Agent 行为 |
| PII | Personally Identifiable Information,个人可识别信息 |
| Ground Truth | 黄金标准答案,经人工确认的正确参考结果 |
| Trial | 单次试验,对同一用例的一次独立执行 |
落地时最容易踩的坑
| 问题 | 后果 | 建议 |
|---|---|---|
| 只看最终答案 | 漏掉错误路径和虚假成功 | 必须采集 Trace |
| 过度依赖模型评分 | 分数抖动,门禁不稳定 | 硬指标优先用确定性评分器 |
| 没有负向触发用例 | Skill 过度触发 | 正向和负向触发都要测 |
| 基线长期不更新 | 评分和真实预期脱节 | 逻辑、模型、工具变化后重建基线 |
| 只跑一次 | 偶发成功被当成稳定能力 | 关键用例跑 N 次并看 pass^k |
| 不统计成本 | 高分方案可能无法生产化 | 报告中同时展示 Token、费用和耗时 |
| 回归集随意删减 | 旧问题反复出现 | 回归用例只增不减,除非业务失效 |
Agent 测评的核心不是追求一次性覆盖所有风险,而是建立一个能持续运行的工程闭环:用例描述任务,Trace 记录过程,评分器量化表现,基线保证可比较,流水线守住回归。只要这个闭环运转起来,Agent 的每次变更就不再依赖直觉判断,而是有明确分数、证据和成本数据支撑。