芥末
发布于 2026-06-16 / 1 阅读
0
0

AI Agent 测评体系设计:从评分器、用例集到工程落地

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 是最有价值的用例来源。每发现一次失败,都应该按固定流程处理:

  1. 复现问题,保存完整 Trace。
  2. 分析根因,明确正确行为。
  3. 修复 Agent、Prompt、工具或评分器。
  4. 把 Bad Case 加入能力测评。
  5. 稳定通过后转入回归测评。

术语速查

术语 含义
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 的每次变更就不再依赖直觉判断,而是有明确分数、证据和成本数据支撑。


评论