墨墨墨墨墨宝の宝藏之地
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

Multi-Agent 真正难的不是多,而是如何让它可控

写作时间:2026-09-10 16:25:20
# 多Agent

这两年 Multi-Agent 很火。

只要涉及复杂任务,很多方案似乎都会自然演变成:

一个 Planner,下面挂几个 Agent,大家各司其职、相互协作,最后再由 Supervisor 汇总结果。

从 Demo 上看,这种架构非常漂亮。

但真正放到企业项目里,很快就会发现一个问题:

Multi-Agent 最难的地方,从来不是“怎么做几个 Agent”,而是怎么让这些 Agent 在复杂任务里保持可控。

任务到底怎么拆?

谁应该执行?

Agent 之间怎么传递上下文?

一个 Agent 错了之后,怎么防止错误继续扩散?

多个 Agent 同时跑的时候,Token、模型并发、数据库连接、工具权限又由谁管理?

如果这些问题没有解决,那么 Agent 数量越多,系统反而越容易失控。

所以在我看来,真正适合企业落地的 Multi-Agent,不应该从“我要设计几个 Agent”开始,而应该从一个更基础的问题开始:

如何把复杂业务拆成明确的责任主体,并通过任务契约、共享状态、验证机制和统一 Runtime,把它们组织成一个可控系统。


一、Multi-Agent 首先应该是“场景型”的

我更倾向于一种相对保守的 Multi-Agent 设计:

先限定业务场景,再设计 Agent。

而不是一开始就试图做一个什么任务都能规划、什么 Agent 都能动态生成的“通用智能体社会”。

对于一个明确业务场景,核心结构其实可以比较固定:

用户任务
   ↓
Supervisor / Coordinator Agent
   ↓
任务拆解 + Agent选择 + 状态管理
   ↓
┌────────────┬────────────┬────────────┐
│ 专业 Agent A │ 专业 Agent B │ 专业 Agent C │
└────────────┴────────────┴────────────┘
       ↓           ↓
     Skill / Tool / MCP
       ↓
Shared State / Artifact / Evidence
       ↓
Review / Validation
       ↓
Supervisor 汇总
       ↓
最终结果

这里真正重要的不是 Agent 的数量,而是每一层的职责。

Supervisor 负责任务拆解、路由和状态控制。

专业 Agent 对特定业务结果负责。

Tool、Skill、MCP 提供底层能力。

Shared State 保存不同 Agent 之间需要共享的信息。

Validation Gate 负责阻断错误。

最后由 Supervisor 汇总。

这样整个系统才是一条明确的任务执行链路,而不是几个模型互相聊天。


二、先定义场景边界,再定义 Agent

真正开始设计之前,我认为第一件事情不是画 Agent 架构图,而是把场景边界讲清楚。

至少需要回答几个问题:

  • 输入是什么?
  • 最终输出是什么?
  • 系统负责什么?
  • 系统明确不负责什么?
  • 哪些结果允许模型判断?
  • 哪些结果必须程序验证?
  • 哪些节点需要人工确认?

这是整个 Multi-Agent 架构最重要的前置条件。

因为如果业务边界本身都没有定义清楚,后面的 Agent 拆分一定会越来越混乱。

很多所谓 Multi-Agent 系统最后变得复杂,并不是 Agent 技术本身有多复杂,而是:

业务职责本来就没有划分清楚。


三、Agent 应该按照“责任”拆,而不是按照“工具”拆

一个很常见的误区是:

有一个搜索工具,就做一个搜索 Agent。

有一个 SQL 工具,就做一个 SQL Agent。

有一个 OCR,就做一个 OCR Agent。

最后形成:

Search Agent
SQL Agent
OCR Agent
RAG Agent
API Agent

这种设计本质上只是给 Tool 外面套了一层 LLM。

我更认可的方式是:

按照“谁对结果负责”划分 Agent。

比如一个企业风险分析场景,可以拆成:

材料分析 Agent
财务分析 Agent
政策风险 Agent
风险综合 Agent
报告生成 Agent

然后每个 Agent 自己拥有允许使用的能力。

例如:

财务分析 Agent
├─ SQL
├─ 财务知识库
└─ 计算工具

而不是:

SQL Agent
RAG Agent
Calculator Agent

前者是业务角色。

后者只是工具代理。

Agent 应该成为责任主体,Tool 才是能力。

这个区别非常重要。


四、每个 Agent 都应该有明确契约

Agent 一旦被当成一个独立执行单元,就不能只定义一句 Prompt:

“你是一个风险分析专家。”

这远远不够。

一个相对完整的 Agent Contract 至少应该定义:

Role
Goal
Scope
Boundary
Skill
Input
Output
Failure Type

例如:

Role:
企业风险分析 Agent

Goal:
基于企业材料和征信信息识别风险因素

Scope:
财务风险、经营风险、征信风险

Boundary:
不得做最终审批决策

Skill:
SQL / RAG / 征信查询 / 风险规则

Input:
企业信息、财务数据、征信数据

Output:
risk_factors / evidence / confidence

Failure:
DATA_MISSING
TOOL_ERROR
INSUFFICIENT_EVIDENCE
RULE_CONFLICT

这样 Supervisor 才知道:

什么任务应该派给它,

什么任务不应该派给它,

执行成功应该返回什么,

执行失败之后应该如何处理。

否则多个 Agent 很容易出现职责重叠。


五、Task 和 Result 必须标准化

Multi-Agent 很容易犯的一个错误,是 Agent 之间通过自然语言描述任务。

比如:

“你帮我看看这个企业有没有风险。”

然后另一个 Agent 再自己理解。

任务数量少的时候问题不明显,一旦开始并行、重试、依赖编排,系统马上变得不可维护。

更合理的方法是定义统一 Task Schema。

例如:

{
  "task_id": "task_1024",
  "parent_task_id": "task_1000",
  "goal": "分析企业财务风险",
  "owner": "financial_agent",
  "dependency": ["task_1010"],
  "priority": 2,
  "status": "PENDING",
  "timeout": 30,
  "retry": 2,
  "expected_output": "financial_risk_report"
}

至少需要包含:

task_id
parent_task_id
goal
owner
dependency
status
expected_output

同样,Agent 返回结果也应该统一。

例如:

{
  "status": "SUCCESS",
  "result": {},
  "evidence": [],
  "confidence": 0.91,
  "issues": [],
  "next_action": null
}

至少包含:

status
result
evidence
confidence
issues
next_action

做到这一步之后,Agent 才真正从“几个模型角色”变成了一个可以被调度的任务执行系统。


六、第一版一定要限制 Agent 的自治范围

Multi-Agent 很容易让人产生一种冲动:

既然 Agent 能规划,那为什么不让它无限拆?

既然它能调用其他 Agent,那为什么不让 Agent 之间自由协作?

理论上当然可以。

但第一版工程系统最好完全反过来。

应该主动限制:

Agent 集合
任务拆解深度
Agent 调用次数
LLM 调用次数
Token Budget
Tool 调用次数
Retry
Timeout

例如:

max_depth = 3
max_retry = 2
max_agent_calls = 10
max_token = 30000
timeout = 60s

Agent 并不是越自主越好。

企业场景真正需要的是:

有限自治。

也就是在确定的边界内允许 Agent 自己决策,而不是完全开放。


七、Agent 之间不要共享完整聊天记录

这是 Multi-Agent 最容易出现 Token 爆炸的地方。

假设 Agent A 有 20k 上下文。

然后传给 B。

B 再产生 10k。

接着整个上下文传给 C。

很快就会变成:

Agent A:20k
Agent B:30k
Agent C:45k
Agent D:60k

Agent 数量增加之后,上下文成本会快速膨胀。

所以我更倾向于引入一个 Shared Workspace。

               Shared Workspace
              /       |        \
          Agent A   Agent B   Agent C

Agent 不互相复制完整对话。

Workspace 里保存结构化信息:

{
  "task": "分析某企业风险",

  "artifacts": {
    "financial_analysis": "artifact://123",
    "policy_analysis": "artifact://456"
  },

  "facts": [],

  "evidence": [],

  "hypothesis": [],

  "decisions": [],

  "risks": [],

  "errors": []
}

Agent 每次只读取自己需要的信息。

这时候 Agent 之间传递的就不是“聊天历史”,而是任务状态与产物引用。


八、必须区分 Fact、Evidence、Hypothesis 和 Decision

这一点我认为尤其重要。

Multi-Agent 一个非常危险的问题是:

A 的推测,很容易在传递过程中变成 B 的事实。

例如 Agent A 输出:

“该企业可能存在现金流压力。”

Agent B 收到后可能变成:

“该企业存在现金流压力。”

到了 Agent C:

“由于企业现金流存在问题……”

一个概率判断经过几轮 Agent 之后,就变成了确定事实。

所以 Shared State 最好强制区分:

Fact
Evidence
Hypothesis
Decision

例如:

{
  "facts": [
    {
      "content": "2025 年经营现金流为 -320 万",
      "source": "financial_report.pdf"
    }
  ],

  "hypothesis": [
    {
      "content": "企业可能存在现金流压力",
      "confidence": 0.72
    }
  ]
}

模型生成的判断不能自动升级成事实。

这是 Multi-Agent 系统保证上下文可靠性的关键设计之一。


九、Validation Gate 是阻止错误级联的关键

Single Agent 错一次,通常只是当前答案错了。

Multi-Agent 错一次,问题可能严重得多。

因为后面的 Agent 会建立在前一个 Agent 的结果上继续推理。

最终甚至会出现一种非常危险的情况:

整个答案结构完整、逻辑流畅,但全部建立在第一个错误之上。

所以关键任务之间必须设置 Validation Gate。

例如:

材料解析 Agent
      ↓
字段完整性校验
      ↓
财务分析 Agent
      ↓
数值一致性校验
      ↓
风险分析 Agent
      ↓
风险规则校验
      ↓
报告 Agent

验证可以有三种方式:

Rule Validation
Program Validation
LLM Review

优先级应该是:

程序校验 > 规则校验 > LLM Review

能够用程序验证的东西,不要交给另一个模型判断。

比如:

  • 数字是否一致
  • JSON 字段是否完整
  • 引用是否存在
  • 枚举是否合法
  • 金额计算是否正确
  • 必填字段是否缺失

这些完全可以程序化验证。


十、Multi-Agent 最值得测试的八个地方

Multi-Agent 测试不能平均用力。

真正应该深度测试的是几个高风险节点。

1. 任务拆解

这是第一优先级。

重点测试:

是否漏任务
是否重复拆任务
是否拆得过细
是否拆得过粗
依赖关系是否正确
是否错误并行

甚至可以专门构造一套“容易拆错”的复杂任务数据集。

因为第一步拆错,后面全部都会错。


2. Agent 路由

这里测试的重点不是:

Agent 会不会做?

而是:

这件事情到底该不该由它做?

尤其多个 Agent 能力存在重叠的时候,很容易出现:

Agent A 做一次
Agent B 又做一次
Supervisor 再做一次

既浪费 Token,又可能产生结果冲突。


3. 上下文传递

需要重点验证:

证据有没有丢失
旧数据有没有覆盖新数据
不同 Agent 是否看到不同版本
Hypothesis 是否被当成 Fact
上下文是否越来越大

这也是为什么结构化 Shared State 很重要。


4. 错误级联

必须专门构造:

上游 Agent 输出错误结果

看看下游 Agent:

是继续相信,

还是能够发现问题。

这是 Multi-Agent 和普通 Agent 最大的测试差异之一。


5. 终止与重试

一定要测试:

Agent 无限 Retry
无限拆任务
A → B → A
循环委托
Tool 一直失败
模型一直要求补信息

所以必须存在:

max_depth
max_retry
max_agent_calls
timeout
budget

这些其实就是 Agent Runtime 的安全阀。


6. Review

Review Agent 很容易退化成:

“这个结果总体不错,逻辑清晰。”

这种 Review 基本没有意义。

真正有效的 Review 必须有明确评分维度,比如:

事实一致性
字段完整性
引用覆盖率
数字准确性
规则命中率
证据充分程度

Review Agent 不是来“发表意见”的,而是执行一套明确的质量标准。


7. Shared State 一致性

只要多个 Agent 并行,就必须测试:

重复认领
并发写
旧结果覆盖新结果
失败恢复
任务状态错乱
幂等

做到这里的时候,其实会发现:

Multi-Agent 已经开始从 AI 问题变成分布式系统问题。


8. 成本与延迟

每个任务至少应该统计:

Agent 数量
LLM 调用次数
Token
Tool 调用次数
Retry 次数
总耗时
P95

Multi-Agent 最大的陷阱之一就是:

效果提升 5%,成本提升 300%。

所以效果永远不能脱离成本讨论。


十一、真正的多 Agent 管理,其实是资源管理

继续往工程层面走,会出现一个更重要的问题:

多个 Agent 到底怎么管理资源?

很多时候我们会下意识认为:

每个 Agent 自己管自己的一套资源。

但我认为更加合理的思路应该是:

Agent 只是任务执行单元,资源统一收口到 Runtime / Scheduler。

Agent 本身不应该真正拥有资源。

它使用的是系统分配给它的:

模型额度
Token
并发槽位
上下文
数据库连接
RAG
Tool
API
缓存
权限
任务队列

所以真正应该做资源管理的不是 Agent。

而是 Runtime。


十二、任务资源:Task Queue + Scheduler

所有 Agent 不应该随便启动。

统一流程应该是:

用户任务
   ↓
Planner
   ↓
Task Queue
   ↓
Scheduler
├─ Agent A
├─ Agent B
└─ Agent C

Scheduler 根据:

priority
dependency
resource
load
timeout
budget

决定任务何时运行。

Task 中至少需要保存:

task_id
parent_task_id
priority
dependency
timeout
retry
status

这样才能真正处理:

任务抢占
重复执行
依赖等待
失败重试
任务恢复
死循环

换句话说,Multi-Agent 后面一定会自然演变成一个任务调度系统。


十三、模型资源:统一 Model Gateway

Multi-Agent 最贵的资源通常不是 CPU,也不是数据库。

而是模型。

所以我不会允许每个 Agent 随便直接调用模型。

所有调用统一经过:

Agent
  ↓
Model Gateway
  ↓
Qwen / DeepSeek / GPT / Small Model

Model Gateway 管:

全局并发
Agent 并发额度
Token Budget
RPM
TPM
模型路由
Timeout
Retry
熔断
降级

例如一个任务最多允许:

Total:30k Token

Planner:5k
Research Agent:15k
Reviewer:10k

如果 Research Agent 已经消耗完 15k,那么后续就必须:

压缩上下文
切换小模型
减少检索
降级策略
或停止任务

而不是让 Agent 继续无限调用。


十四、上下文也是一种资源

上下文管理其实也是资源调度的一部分。

如果 Agent A、B、C 各自维护一套完整上下文:

Agent A Context
Agent B Context
Agent C Context

然后彼此复制,成本会非常高。

所以更合理的是:

Shared Workspace

Workspace 保存:

Task
Fact
Evidence
Artifact
Decision
Risk
Error

Agent 只按需读取。

也就是说:

Context 不应该属于 Agent,而应该属于任务。

Agent 只是任务上下文的一个消费者。

这个思路一旦建立起来,Multi-Agent 的上下文管理就会清晰很多。


十五、Tool 也必须经过 Gateway

企业场景下还有一个非常重要的原则:

Agent 有调用意图,不代表 Agent 有执行权限。

比如:

SQL
RAG
CRM
征信
OCR
外部 API

都不应该让 Agent 直接连接。

可以增加:

Agent
  ↓
Capability Gateway
  ↓
SQL / RAG / CRM / OCR / API

Gateway 负责:

连接池
QPS
Timeout
幂等
权限
限流
审计
熔断

例如:

风险 Agent → 征信 Tool √
风险 Agent → SQL Tool  √

报告 Agent → 征信 Tool ×

不是说报告 Agent 技术上不能调用。

而是业务上没有必要给它这个权限。


十六、Agent 之间最好不要自由互相调用

很多 Multi-Agent 架构喜欢画成:

A ↔ B ↔ C ↔ D ↔ E

看起来非常智能。

但是工程管理成本会迅速增长。

因为很快你就会不知道:

谁调用了谁
为什么调用
谁产生的 Token
哪里产生了循环
谁修改了状态

更容易控制的是:

           Planner
        /     |      \
       A      B       C
        \     |      /
         Shared State

或者做成明确层级:

L4 Planner
     ↓
L3 Domain Agent
     ↓
L2 Workflow
     ↓
L1 Tool

并通过白名单限制调用关系。

比如:

Planner → 风险 Agent   √
Planner → 报告 Agent   √

风险 Agent → SQL Tool  √
风险 Agent → 征信 Tool √

报告 Agent → SQL Tool  ×
报告 Agent → 征信 Tool ×

调用图越明确,系统越容易治理。


十七、最终会形成一个 Agent Runtime

把前面的设计合起来,整个架构最后大概会变成:

                    Planner
                       │
                       ▼
                Task Scheduler
             ┌─────────┼─────────┐
             ▼         ▼         ▼
          Agent A   Agent B   Agent C
             │         │         │
     ┌───────┴─────────┴─────────┴───────┐
     │            Agent Runtime           │
     │                                    │
     │   Task Budget / Token Budget       │
     │   Concurrency / Timeout / Retry    │
     │   Context / State / Permission     │
     └───────┬────────────┬───────────────┘
             │            │
             ▼            ▼
       Model Gateway   Tool Gateway
             │            │
          LLM Pool    DB/RAG/API/OCR

到了这里,其实 Agent 已经不再是整个系统的核心。

真正的核心变成了:

Agent Runtime。


十八、Multi-Agent Runtime 很像一个小型操作系统

我觉得这是一个很好理解 Multi-Agent 的类比。

操作系统里:

Process
↓
申请 CPU / 内存 / IO
↓
OS Scheduler
↓
决定资源如何分配

Agent 系统也应该类似:

Agent
↓
申请 Token / Model / Tool / Context
↓
Agent Runtime
↓
决定是否允许执行

进程不能说:

我要 100GB 内存。

操作系统就直接给它 100GB。

同样,Agent 也不应该说:

我要调 5 次模型、访问数据库、再启动 3 个 Agent。

系统就全部执行。

真正成熟的 Multi-Agent Runtime 最终应该包含:

Scheduler
Budget Manager
Context Manager
Model Gateway
Tool Gateway
Policy Engine
State Store
Tracing

分别负责:

Scheduler        → 管任务
Budget Manager   → 管成本
Context Manager  → 管上下文
Model Gateway    → 管模型
Tool Gateway     → 管工具
Policy Engine    → 管权限
State Store      → 管状态
Tracing          → 管全过程

从这个角度看,所谓 Multi-Agent Framework,做到最后,其实已经越来越像一个:

Agent 操作系统。


十九、Multi-Agent 第一阶段最值得做的只有三件事

如果真的要从零搭一个企业级 Multi-Agent 系统,我反而不会一开始研究那些复杂的 Agent 协商协议、自主谈判、动态角色生成。

第一阶段我认为最值得做好的只有三件事情:

统一调度。

所有任务通过 Scheduler。

统一预算。

所有 Agent 消耗经过 Runtime。

统一状态。

所有 Agent 围绕 Shared State 协作。

这三件事情稳了之后,再往上增加:

动态规划
复杂协作
Agent Reflection
Agent Debate
动态 Agent
长期 Memory

才有意义。

否则 Agent 数量一多,很快就会变成:

谁都能调谁,谁都在吃 Token,出了问题也不知道是谁造成的。


二十、最终一定要和 Single Agent 做对比

还有一个非常容易忽略的问题:

Multi-Agent 不能只和自己比。

上线前一定应该准备 Single-Agent Baseline。

然后对比:

任务完成率
准确率 / 业务指标
错误发现率
平均耗时
P95
Token 成本
模型调用次数
人工介入率
Retry Rate
稳定性

如果 Single Agent:

准确率:87%
耗时:8 秒
成本:1

Multi-Agent:

准确率:89%
耗时:25 秒
成本:3

那 Multi-Agent 是否值得,就必须重新考虑。

Multi-Agent 应该解决 Single Agent 真正解决不了的问题。

比如:

复杂任务完成率
专业准确性
任务可解释性
容错能力
并行处理能力
复杂业务编排

如果这些地方没有明显提升,那就没有必要为了 Multi-Agent 而 Multi-Agent。


最后

我现在越来越觉得,Multi-Agent 真正值得研究的并不是:

怎样让几个 Agent 像人一样开会。

而是:

怎样把多个不完全可靠的智能执行单元,组织成一个可靠的工程系统。

这两种思路差别非常大。

前者关注的是 Agent 有多聪明。

后者关注的是:

责任
任务
状态
资源
权限
成本
错误
验证

而在真正的企业系统里,后面这些东西往往比 Agent 本身更加重要。

所以如果让我用一句话总结场景型 Multi-Agent,我会这么说:

Multi-Agent 的核心不是“做几个 Agent”,而是把复杂业务拆成明确的责任主体,再通过任务契约、共享状态、验证门和运行边界,把这些不完全可靠的智能单元组织成一个可控系统。

而如果只选三个最值得花时间验证的问题,我认为是:

任务拆解是否正确,上下文是否可靠,错误是否能够被及时阻断。

如果再往工程层面进一步浓缩,那就是:

统一调度、统一预算、统一状态。

这三个东西稳了,Multi-Agent 才真正具备落地价值。

avatar

墨墨墨墨墨宝

在 AI 的浪潮里写代码,也顺便研究怎么别被浪拍死。

RECOMMENDED

企业级模型调用问题归档

2026-09-07 22:38:29

FDE 不是更高级的驻场开发,而是一种高成本的公司运行机制

2026-09-08 17:47:56

PDF 文件解析到底应该怎么做?从文本提取到企业级文档理解

2026-09-09 22:28:33

Table of Contents