如何量化多智能体质量?open-multi-agent评测体系指南:EvalSet离线回归、在线采样与CI质量门禁
【免费下载链接】open-multi-agentTypeScript AI agent orchestration framework with dynamic workflows. Describe the goal, not the graph: a coordinator plans the task DAG at runtime and runs it on any LLM (Claude, ChatGPT, Gemini, DeepSeek, or local models).项目地址: https://gitcode.com/gh_mirrors/op/open-multi-agent
open-multi-agent 是一款 TypeScript 多智能体编排框架,内置完整的评测(Evaluation)体系,通过 EvalSet 离线回归、在线采样和 CI 质量门禁三种方式,帮你把多智能体系统"感觉变差了"的模糊印象,变成可量化、可回归、可拦截的评测数据。
🎯 为什么多智能体系统需要量化评测
多智能体系统的输出天然不稳定:换了提示词、换了模型、甚至同样的一句话,任务 DAG 的拆解和执行路径都可能不同。open-multi-agent 没有跨提供商的随机种子(seed)约定,因此官方不建议追求"单次可复现",而是推荐用repeats多次采样、对比聚合统计。
这里还要先区分两套容易混淆的机制:
运行时验证(runConsensus()/ 任务verify) | 评测(Evaluation) | |
|---|---|---|
| 时机 | 一次业务运行过程中 | 离线批量,或线上运行结束后异步 |
| 会改变业务结果吗 | 会(可接受、修正或拒绝) | 不会,只观察 |
| 度量对象 | 单次结果 | 用例集、版本、回归与趋势 |
两者可以组合使用:验证守护单次运行,EvalSet 则能长期追踪验证通过率的变化。
📊 评测体系总览:三根支柱
- EvalSet 离线回归:把测试用例固化成版本化的 EvalSet,对"目标系统"批量打分,产出
EvalRunReport报告; - 在线采样:在生产流量中按比例或规则抽取运行,异步打分入库,绝不打断业务响应;
- CI 质量门禁:用
GatePolicy阈值 + 基线回归检查,把报告直接变成流水线里的红绿灯。
评测子路径为@open-multi-agent/core/eval,完整设计文档见 docs/evaluation.md,核心实现位于 packages/core/src/eval/。
一、EvalSet 离线回归:5 分钟跑通第一次评测
离线评测由四个概念组成,各承担一个职责:
- EvalSet:版本化的用例集。
defineEvalSet()要求名称、版本、用例 ID 唯一,用例可打标签(tags)以便按filterTags选取子集。内容一变就升version; - Scorer(评分器):对单次输出打分,分数必须是 0~1 的有限数,
pass可选,留给门禁使用自己的阈值。用defineScorer()定义并冻结; - Target(目标):被评测的系统。一个 async 函数即可,也可以直接用便捷目标
targetFromAgent()/targetFromTeam()/targetFromPlan()把现成的 agent、团队或固定计划变成评测目标; - Runner:
runEvalSet()负责调度。每条"用例 × 重复"样本跑一次,样本之间按concurrency并行(默认 2),中途中断会返回aborted: true的部分报告。
跑完后,报告EvalRunReport提供每个评分器的avg、p50、p95、min、passRate,以及按标签聚合的byTag(百分位采用最近秩法,样本少时行为可预期)。
⚠️一条重要规则:评分器失败 ≠ 零分。评分器抛错、拒绝或超时,说明"质量没有被测量",报告会把该样本记为
scorer_error并从所有分母中剔除;目标本身抛错则记为target_error。千万不要用{ score: 0 }顶替失败,否则会污染你的质量指标。
一个无需 API Key 即可运行的完整示例(双目标对比 + 规则评分器 + 评审评分器 + 门禁)在 eval-offline-regression.ts,直接npx tsx即可跑。
二、内置参考评分器与"模型评审"(Judge)
框架自带一组小而明确的参考评分器,覆盖多智能体 DAG 的结构性指标(均来自 packages/core/src/eval/scorers/):
| 评分器 | 衡量什么 |
|---|---|
toolCallSuccessScorer() | 工具调用成功比例 |
structuredOutputComplianceScorer(schema?) | 结构化输出存在且通过 Zod 校验 |
costBudgetScorer({ maxTokens?, maxCostAmount? }) | 是否在 token / 金额预算内(硬门槛) |
dependencyUtilizationScorer() | 带依赖任务链的完成率(保守代理指标) |
duplicateWorkScorer() | 智能体之间重复劳动的比例 |
noProgressScorer() | 连续"空转"轮次是否超限 |
createAnswerRelevancyScorer() | 答案与问题的相关度(评审打分均值) |
其中依赖利用率、无进展两个指标基于 trace 的结构化事实计算,重复劳动则从内存结果读输出,隐私友好。
语义类质量交给模型评审:createJudgeScorer()支持配置多个评审模型、quorum 通过规则、超时与自定义判定 Schema。注意评审会把被评测输出发送给评审模型——涉及敏感数据时这是必须做隐私决策的一步。评审提示词、模型、配置只要变化,就要升评分器version,否则基线回归比较会因"不可比"而跳过。
三、在线采样:在生产流量中"顺手"打分
离线回归覆盖的是"你想到的用例",而线上真实流量往往更刁钻。open-multi-agent 的在线评测是可选开启的:在OpenMultiAgent配置里加上evaluation即可。
它的几个关键特性决定了线上安全:
- 零侵入:运行结束后只做一次同步的采样决策和入队判断,评分与写库全部异步执行,
runAgent()、runTeam()等所有入口共用同一个评估器; - 采样策略灵活:数值采样(如
sample: 0.05抽 5%),或规则函数按状态和元数据挑选——例如"只评测金丝雀环境里失败的运行"; - 资源有界:
maxConcurrent、maxQueueLength限制队列,budget.maxEvaluationsPerMinute限每分钟评分次数,maxCostPerHour限评审成本; - 隐私默认安全:
storePayloads默认none(不存输入输出快照);redacted存脱敏截断副本;full是显式隐私决策; - 性能可忽略:官方基准中采样 + 入队判断的 p95 约 0.42 微秒;
- 生命周期由你掌控:进程退出前调用
forceFlush()等待已接纳样本、shutdown()原子停止;所有定时器不阻止进程退出。
存储侧提供InMemoryEvalStore(短生命周期、测试用)和 Node 专用 FileEvalStore(追加式 NDJSON、按批原子提交、支持压缩)。在线采样示例见 eval-online-sampling.ts。
四、CI 质量门禁:把报告变成流水线红绿灯 🚦
evaluateGate()是纯逻辑函数,输入报告 +GatePolicy,输出只有三样:pass、failures、warnings。策略支持:
- 阈值检查:按评分器指定
avg/p50/p95/min/passRate,可叠加tag作用域(例如"critical 用例 p50 ≥ 0.85"); - 健康检查:
maxScorerErrorRate(默认 >10% 报错,意味着评测设施本身不可信)与maxTargetErrorRate; - 基线回归:把上一版通过的 JSON 报告作为 baseline,限制
maxRegression与逐评分器回退幅度。评分器版本不一致时会警告并跳过该评分器的回归比较——避免"换了裁判比成绩"的假回归。
官方推荐的基线工作流是四步:运行并导出report.json→ 审查后提交为evals/baseline.json(连同版本化 EvalSet 与门禁策略)→ CI 中用--baseline对比 →只有人工确认行为变化后才更新基线,CLI 从不自动改写它。
命令行入口在 docs/cli.md:
oma eval run --set ./evals/set.json --target ./evals/target.mjs \ --gate ./evals/gate.json --baseline ./evals/baseline.json \ --report json --report junit --out ./eval-results oma eval gate --report ./candidate/report.json --gate ./evals/gate.json门禁未过或目标全部失败时退出码为 1,文件/参数错误为 2——正好对接 CI 的步骤状态;判定结果同时写入verdict.json供下游消费。报告支持 JSON(权威格式)、Markdown(人工审查)与 JUnit(CI 展示失败明细)三种格式,可直接当构建产物上传。
框架自身的 routing-stability-set.json 就是活案例:用冻结的用例集验证"换语言、换提示词长度,任务拓扑是否漂移",配合 routing-stability-gate.json 把治理类路由锁定为 0 翻转。
五、关键文件速查
- 评测设计文档:docs/evaluation.md
- 评测子路径源码:packages/core/src/eval/(runner.ts、gate.ts、online.ts、judge.ts)
- 离线回归示例(免 Key):eval-offline-regression.ts
- 在线采样示例:eval-online-sampling.ts
- 基线与门禁策略示例:baseline.json、gate.json
- CLI 参考:docs/cli.md
❓ 常见问题
评分器报错应该记 0 分吗?不要。scorer_error表示"没测到",会被排除在所有分母之外,由门禁的健康上限(maxScorerErrorRate)决定这次评测是否可信。
在线评测会拖慢业务响应吗?不会。运行结束后只发生一次采样判断和入队;评分与持久化尽力而为、与业务结果完全隔离。宿主必须在退出前等待样本时,显式调用forceFlush()。
用targetFromPlan()能让评测完全确定吗?它冻结了任务图、省去协调器再拆解,但模型响应仍会变化(无跨提供商 seed)。正确姿势是用repeats多次采样、对比分布,而不是期待逐次一致。
三根支柱的分工一句话总结:离线回归管"发布前",在线采样管"发布后",CI 门禁管"能不能合并"。三者共享同一套EvalRecord数据模型,从此你改一次提示词,质量涨跌就有据可查。
【免费下载链接】open-multi-agentTypeScript AI agent orchestration framework with dynamic workflows. Describe the goal, not the graph: a coordinator plans the task DAG at runtime and runs it on any LLM (Claude, ChatGPT, Gemini, DeepSeek, or local models).项目地址: https://gitcode.com/gh_mirrors/op/open-multi-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考