跳转至

Multi-Agent 协作、自进化与记忆系统

这篇回答几个 Agent 产品里最容易变复杂的问题:

多个 Agent 如何协作?
multi-agent 到底是谁在决策?
multi-agent 有哪些架构?
Agent 如何自进化?
怎么防止 Agent 之间 A2A 互相调用停不下来?
通用 Agent 的记忆系统怎么设计?

先给一个总判断:

Multi-Agent 的核心不是“多几个模型角色聊天”,而是任务分解、责任边界、状态共享、停止条件和评测闭环。

如果没有这些,多 Agent 很容易变成:

成本更高
延迟更长
互相甩锅
循环调用
最终答案更不可控

Multi-Agent 解决什么

单 Agent 像一个通才。

Multi-Agent 更像一个小团队。

它适合解决:

  • 任务很复杂,一个 Agent 很难同时做好规划、执行、审查。
  • 能力差异明显,比如搜索、代码、数据分析、写作、测试。
  • 需要互相校验,比如生成者和评审者分离。
  • 任务可以并行,比如同时调研多个资料源。
  • 需要权限隔离,比如只让某个 Agent 能访问生产数据。
  • 需要跨系统协作,比如企业里不同平台的 Agent 互相委托。

但不要一上来就 multi-agent。

更推荐顺序是:

单 Agent + 工具
  ↓
Router / Handoff
  ↓
Supervisor + 专家 Agent
  ↓
Graph / Workflow multi-agent
  ↓
跨系统 A2A 协作

Multi-Agent 到底是谁在决策

Multi-Agent 里有很多“决策点”。

不要只问:

哪个 Agent 决策?

要拆成:

决策点 决策内容 常见决策者
任务是否需要拆分 单 Agent 做还是多 Agent 做 Router / Supervisor
分给谁 哪个专家 Agent 处理 Supervisor / Planner
下一步做什么 搜索、写代码、测试、总结 当前执行 Agent
是否需要协作 要不要请求别的 Agent 当前 Agent 或 Supervisor
结果是否合格 是否通过验收 Critic / Evaluator / 程序 grader
是否继续 继续循环还是停止 Supervisor / Runtime
是否写入记忆 经验是否沉淀 Memory Manager / Evaluator

所以 multi-agent 的决策不是一个点,而是一条链。

User Goal
  ↓
Router 判断任务类型
  ↓
Planner 拆任务
  ↓
Supervisor 分配任务
  ↓
Worker 执行
  ↓
Critic / Evaluator 检查
  ↓
Supervisor 决定继续、重试、合并或停止

真正成熟的系统里,最重要的决策通常不完全交给模型。

应该是:

模型做语义判断
程序做边界控制
评测做质量裁决
权限系统做安全兜底

常见 Multi-Agent 架构

1. Router / Handoff

这是最简单、最推荐的起点。

入口 Agent
  ↓
根据任务路由给一个专家
  ↓
专家完成后返回

例子:

用户:帮我分析这段 SQL 为什么慢。
Router:这是数据库性能任务。
Handoff -> DBA Agent
DBA Agent:查看执行计划、索引、慢查询日志,给优化建议。

优点:

  • 简单。
  • 成本可控。
  • 容易调试。

缺点:

  • 路由错了后面就容易全错。
  • 不适合需要多个专家同时协作的任务。

适合:

  • 客服意图分流。
  • 企业助手。
  • IDE 中按任务类型分给代码、测试、文档 Agent。

2. Supervisor + Workers

这是最常见的多 Agent 架构。

Supervisor
  ├── Research Agent
  ├── Coding Agent
  ├── Test Agent
  └── Writer Agent

Supervisor 负责:

  • 理解目标。
  • 拆任务。
  • 分配任务。
  • 收集结果。
  • 判断是否重试。
  • 生成最终答案。

Worker 负责:

  • 做自己擅长的一类任务。
  • 不直接控制全局流程。

优点:

  • 职责清楚。
  • 容易加权限。
  • 容易加停止条件。

缺点:

  • Supervisor 会成为瓶颈。
  • Supervisor prompt 和状态设计很关键。

适合:

  • 研究报告。
  • 代码修复。
  • 数据分析。
  • 企业流程自动化。

3. Hierarchical Multi-Agent

当 Agent 数量变多时,可以分层。

Global Supervisor
  ├── Engineering Supervisor
  │   ├── Backend Agent
  │   └── Test Agent
  ├── Research Supervisor
  │   ├── Search Agent
  │   └── Source Checker
  └── Writing Supervisor
      ├── Outline Agent
      └── Editor Agent

优点:

  • 能管理更复杂任务。
  • 每层只看自己相关状态。

缺点:

  • 状态同步更复杂。
  • 任务边界不清时容易踢皮球。
  • 成本和延迟上升。

适合:

  • 大型企业工作流。
  • 长周期自动化任务。
  • 多部门协作类 Agent。

4. Blackboard / Shared Workspace

Blackboard 架构像一个共享白板。

Shared Workspace
  ↑       ↑       ↑
Agent A Agent B Agent C

每个 Agent 不一定直接互相聊天,而是:

  • 读取共享状态。
  • 写入自己的发现。
  • 订阅自己关心的事件。
  • 由调度器决定谁下一步行动。

例子:

Research Agent 写入资料
Data Agent 写入统计
Critic Agent 写入风险
Writer Agent 读取这些材料写报告

优点:

  • 不需要所有 Agent 互相通信。
  • 适合异步协作。
  • 状态可审计。

缺点:

  • 需要设计共享状态 schema。
  • 写入冲突和信息污染要处理。

适合:

  • 多人协作式任务。
  • 长任务。
  • 异步 Agent 系统。

5. Debate / Critic / Review

这种架构不是为了分工,而是为了提高质量。

Generator
  ↓
Critic
  ↓
Reviser
  ↓
Evaluator

例子:

Coder 写补丁
Reviewer 找 bug
Coder 修改
Test Agent 跑测试
Evaluator 判断是否完成

优点:

  • 能降低明显错误。
  • 适合代码、法律、报告等高风险输出。

缺点:

  • 成本更高。
  • Critic 也可能误判。
  • 没有客观测试时容易变成空谈。

适合:

  • 代码生成。
  • 文档审查。
  • 安全审查。
  • 高价值业务输出。

6. Graph / Workflow Agent

生产系统里,最稳的不是全自由聊天,而是图或状态机。

Start
  ↓
Classify
  ↓
Plan
  ↓
Execute
  ↓
Review
  ↓
Done / Retry / Human

每个节点可以是一个 Agent。

边上有明确条件:

if review_pass:
    done
elif retry_count < 2:
    execute_again
else:
    ask_human

优点:

  • 可控。
  • 可观测。
  • 容易加停止条件。
  • 适合生产。

缺点:

  • 灵活性弱于自由对话。
  • 需要提前设计流程。

适合:

  • 企业流程。
  • 工单自动化。
  • 审批流。
  • 代码修复流水线。

7. Swarm / Peer-to-Peer

Swarm 架构里 Agent 之间更平等。

Agent A ↔ Agent B ↔ Agent C

每个 Agent 可以互相请求帮助。

优点:

  • 灵活。
  • 适合探索。
  • 适合研究实验。

缺点:

  • 最容易循环。
  • 最难做责任归属。
  • 最难控制成本。

如果没有很强的 runtime 控制,不建议新手从这里开始。

一个推荐的通用架构

如果你要做一个通用 Agent 产品,我更推荐从这个架构开始:

User
  ↓
Entry Agent / Router
  ↓
Task Manager
  ↓
Planner
  ↓
Supervisor
  ├── Specialist Agents
  ├── Tools / MCP
  ├── Memory Manager
  └── Evaluator
  ↓
Response Composer

核心模块:

模块 作用
Entry Agent 理解用户意图,判断任务类型
Task Manager 创建 task id、预算、状态、取消信号
Planner 拆任务和依赖
Supervisor 分派任务、合并结果、控制继续或停止
Specialist Agents 专家执行者
Tool Runtime 真正执行工具和权限控制
Memory Manager 读写记忆,不让所有 Agent 随便写
Evaluator 判断结果质量
Response Composer 面向用户整理最终输出

这里有个关键设计:

Agent 可以建议,Runtime 必须裁决。

不要让任意 Agent 自由创建无限子 Agent、无限 A2A 调用、无限工具调用。

A2A 和 MCP 的区别

这两个词容易混。

协议 / 概念 解决什么
Tool Calling 模型调用当前应用提供的工具
MCP 标准化 Agent / 模型应用如何连接外部工具、数据和资源
A2A 标准化 Agent 和 Agent 之间如何发现、委托、协作和返回结果

可以这样理解:

MCP:Agent 调工具
A2A:Agent 找另一个 Agent 帮忙

例子:

代码 Agent 通过 MCP 调用 git、测试、文件工具。
代码 Agent 通过 A2A 把安全审查委托给 Security Agent。

如何防止 Multi-Agent / A2A 停不下来

这是工程里非常重要的问题。

多 Agent 停不下来,通常有几类原因:

原因 表现
目标不清 Agent 一直补充、扩展、反思
没有预算 无限调用工具或其他 Agent
没有 owner 每个 Agent 都觉得别人还要继续
没有终止协议 不知道什么叫完成
环路调用 A 找 B,B 又找 A
失败重试无上限 一直 retry
评价标准模糊 Critic 永远觉得还能改

1. 给每个任务设置预算

每个任务创建时就要有预算。

{
  "task_id": "task_123",
  "max_steps": 20,
  "max_agent_calls": 8,
  "max_tool_calls": 30,
  "max_wall_time_seconds": 300,
  "max_tokens": 100000,
  "max_cost_usd": 2.0
}

预算不是写给模型看的装饰。

Runtime 必须强制执行。

2. 设置 hop count / TTL

A2A 调用必须带 hop count。

{
  "task_id": "task_123",
  "from": "research_agent",
  "to": "source_checker",
  "hop_count": 2,
  "max_hops": 4
}

超过 max_hops

禁止继续委托
返回当前最佳结果

这和网络里的 TTL 很像。

3. 禁止无约束回调

不要允许:

Agent A -> Agent B -> Agent A -> Agent B ...

可以维护调用栈:

call_stack = [A, B]

如果 B 想再调用 A,需要判断:

  • 是否形成循环。
  • 是否有新的输入。
  • 是否经过 Supervisor 批准。
  • 是否仍在预算内。

默认策略:

Worker 不能直接反向调用 parent
只能把问题返回 Supervisor

4. 所有委托都要有 contract

A2A 请求不能只写:

帮我看看这个。

应该写成 contract:

{
  "goal": "检查这份回答是否有事实错误",
  "input_refs": ["draft_001", "sources_001"],
  "expected_output": "列出最多 5 个问题,或返回 PASS",
  "deadline": "60s",
  "allowed_actions": ["read_shared_workspace"],
  "forbidden_actions": ["call_other_agents", "modify_files"],
  "done_condition": "返回 PASS 或 findings"
}

重点是:

  • 输入明确。
  • 输出明确。
  • 权限明确。
  • 截止时间明确。
  • 完成条件明确。

5. 用状态机控制生命周期

任务状态应该有限。

CREATED
PLANNED
RUNNING
WAITING_AGENT
WAITING_TOOL
REVIEWING
DONE
FAILED
CANCELLED
ESCALATED

禁止 Agent 自己发明状态。

每次状态转换要有规则。

例子:

RUNNING -> WAITING_AGENT:必须创建 delegation contract
WAITING_AGENT -> REVIEWING:必须收到 result artifact
REVIEWING -> DONE:必须通过 evaluator
REVIEWING -> RUNNING:retry_count < max_retry

6. Critic 要有限度

Critic 很容易导致无限修改。

应该限制:

最多 2 轮 revision
每轮最多 5 个问题
只报告会影响任务目标的问题
不能提出无限优化建议

Critic 输出也要结构化:

{
  "verdict": "pass | revise | fail",
  "blocking_issues": [],
  "non_blocking_suggestions": [],
  "confidence": 0.82
}

只有 blocking_issues 才能触发重做。

7. 加 circuit breaker

当系统发现异常模式,自动熔断。

触发条件:

  • 同两个 Agent 反复互调。
  • 同一工具连续失败。
  • token 消耗过快。
  • 没有新增信息但继续调用。
  • 多次 revision 后分数不升。
  • 超过 wall time。

熔断后:

停止自动循环
返回当前状态
请求用户或人工确认

Agent 如何自进化

先说我的判断:

Agent 自进化的重点不是让 Agent 随便改自己的 prompt,而是建立可靠的反馈闭环。

自进化至少包括四层。

1. 结果层:知道自己做得好不好

没有 eval,就没有进化。

需要保存:

  • 用户目标。
  • trace。
  • 工具调用。
  • 最终答案。
  • 用户反馈。
  • 自动评分。
  • 人工评分。
  • 失败原因。

例子:

任务:修复登录 bug
结果:测试未通过
失败原因:没有运行 AuthServiceTest
改进点:代码任务必须先定位相关测试,再运行测试

2. 记忆层:把经验沉淀下来

不是所有失败都写入长期记忆。

应该先经过评估:

这条经验是否可复用?
是否和已有记忆冲突?
是否有证据?
是否过期?
是否只适用于某个项目?

可写入:

  • 用户偏好。
  • 项目规则。
  • 常见失败模式。
  • 成功工作流。
  • 工具使用经验。
  • 测试命令。
  • API 约束。

3. Skill 层:把重复经验变成流程

如果某类任务反复出现,就不要只靠记忆。

应该沉淀成 skill。

多次代码 review 都发现同类问题
  ↓
生成 code-review skill 的检查清单
  ↓
下次 review 自动加载

Skill 比普通记忆更结构化:

  • 什么时候用。
  • 步骤是什么。
  • 调哪些工具。
  • 输出什么格式。
  • 怎么验证。

4. 策略层:改 prompt、工具、路由和流程

自进化最终可能改:

  • system prompt。
  • developer prompt。
  • tool description。
  • tool schema。
  • routing policy。
  • memory retrieval policy。
  • eval dataset。
  • skill workflow。
  • workflow graph。

但生产系统里不要让 Agent 直接改线上策略。

建议流程:

线上 trace
  ↓
失败聚类
  ↓
生成改进建议
  ↓
离线 eval 验证
  ↓
人工审核
  ↓
灰度发布
  ↓
监控回滚

这才是可靠的自进化。

自进化系统的关键模块

一个可进化 Agent 系统可以这样设计:

Runtime Trace
  ↓
Evaluator
  ↓
Failure Analyzer
  ↓
Memory Writer
  ↓
Skill Builder
  ↓
Prompt / Policy Proposal
  ↓
Offline Eval
  ↓
Human Review
  ↓
Versioned Release

每个模块职责:

模块 作用
Trace Store 保存完整过程
Evaluator 给成功/失败和分数
Failure Analyzer 归因失败原因
Memory Writer 写入可复用经验
Skill Builder 把经验变成可执行流程
Prompt Optimizer 提出 prompt 改动
Policy Optimizer 提出路由、工具、权限改动
Eval Runner 验证改动是否真的变好
Release Manager 版本、灰度、回滚

这里最关键的是:

所有进化都要可回滚
所有进化都要经过 eval
所有进化都要有版本

通用 Agent 记忆系统怎么设计

记忆不是把聊天记录全部塞进向量库。

一个通用 Agent 的记忆要分层。

记忆类型

类型 保存什么 例子
Working Memory 当前任务临时状态 当前计划、已读文件、工具结果
Episodic Memory 历史事件 上次帮用户部署 vLLM 的过程
Semantic Memory 稳定事实 项目使用 Java 21,数据库是 PostgreSQL
Procedural Memory 做事流程 代码修复要先跑相关测试
Preference Memory 用户偏好 用户喜欢中文、喜欢详细例子
Policy Memory 规则和边界 生产库只读,删除操作必须确认
Skill Memory 可复用能力 code-reviewpdf-extraction skill

不同记忆的生命周期不同。

Working Memory:任务结束可清理
Preference Memory:长期保留,但用户可修改
Policy Memory:高优先级,必须审计
Procedural Memory:经 eval 验证后沉淀

推荐架构

Agent Runtime
  ↓
Memory Gateway
  ├── Short-term Store
  ├── Vector Store
  ├── Relational Store
  ├── Document Store
  └── Skill Registry

不要让 Agent 直接写数据库。

中间要有 Memory Gateway。

它负责:

  • 鉴权。
  • 去重。
  • 冲突检测。
  • 重要性评分。
  • 过期策略。
  • 隐私过滤。
  • provenance 记录。
  • 召回和排序。

记忆数据结构

一条记忆可以这样设计:

{
  "memory_id": "mem_123",
  "type": "procedural",
  "scope": "project",
  "subject": "Java tests",
  "content": "修改 AuthService 后需要运行 AuthServiceTest。",
  "evidence": ["trace_2026_06_21_001"],
  "source": "eval_failure_analysis",
  "confidence": 0.86,
  "created_at": "2026-06-21T10:00:00+08:00",
  "updated_at": "2026-06-21T10:00:00+08:00",
  "expires_at": null,
  "access_policy": {
    "users": ["user_1"],
    "projects": ["project_a"],
    "agents": ["coding_agent"]
  },
  "status": "active"
}

关键字段:

字段 为什么重要
type 决定如何使用
scope 防止把项目规则误用于全局
evidence 记忆要有来源
confidence 低置信度不要强注入
expires_at 防止过期事实长期污染
access_policy 控制谁能读
status 支持禁用和回滚

记忆写入策略

不要每轮都写长期记忆。

推荐写入流程:

Candidate Memory
  ↓
过滤敏感信息
  ↓
判断是否可复用
  ↓
查重和冲突检测
  ↓
打 scope 和 confidence
  ↓
必要时请求用户确认
  ↓
写入

适合写入:

  • 用户明确偏好。
  • 项目稳定规则。
  • 经过验证的成功流程。
  • 重复出现的失败原因。
  • 工具或环境约束。

不适合写入:

  • 一次性聊天内容。
  • 未验证猜测。
  • 敏感信息。
  • 过期状态。
  • 被 prompt injection 影响的内容。

记忆读取策略

读记忆也要控制。

一次请求不能把所有记忆都塞进上下文。

推荐:

先按 scope 过滤
  ↓
按任务语义召回
  ↓
按 recency / confidence / evidence 排序
  ↓
去重
  ↓
压缩成上下文

注入上下文时要区分:

用户偏好:可以作为偏好
项目规则:作为约束
历史事件:作为参考
外部文档:作为证据

不要把所有记忆都写成 system 级指令。

否则低质量记忆会污染高优先级规则。

记忆冲突怎么处理

例子:

旧记忆:项目使用 Java 17。
新记忆:项目已升级到 Java 21。

不能简单都召回。

应该:

  • 标记冲突。
  • 比较时间。
  • 比较证据来源。
  • 必要时请求确认。
  • 旧记忆改成 superseded。

记忆状态可以有:

active
superseded
deprecated
deleted
needs_review

记忆和权限

记忆系统必须考虑权限。

尤其是企业 Agent。

问题包括:

  • A 用户的记忆不能泄露给 B 用户。
  • 项目 A 的规则不能误用于项目 B。
  • 生产环境信息不能注入到低权限 Agent。
  • 被删除的记忆不能继续被向量库召回。

所以不要只靠向量库。

向量库适合相似检索。

权限、版本、删除、审计更适合结构化数据库配合管理。

Multi-Agent 和记忆怎么结合

多 Agent 系统不要让每个 Agent 都自由写长期记忆。

更好的方式:

Worker Agent 产生 memory candidate
  ↓
Memory Manager 审核、归并、打标签
  ↓
Evaluator 判断是否有证据
  ↓
写入 Memory Store

读取也要分角色:

Agent 可读记忆
Router 用户偏好、任务分类历史
Planner 成功流程、项目规则
Coding Agent 代码库规则、测试命令、历史 bug
Critic Agent 质量标准、失败模式
Writer Agent 用户风格偏好、输出格式

不要所有 Agent 共享所有记忆。

这会导致:

  • 上下文膨胀。
  • 信息污染。
  • 权限泄漏。
  • Agent 互相强化错误经验。

一个完整例子:代码修复 Multi-Agent

用户:

修复登录 token 过期判断 bug,并跑测试。

流程:

Entry Agent
  ↓
Router: code_fix
  ↓
Planner:
    1. 定位认证相关代码
    2. 查相关测试
    3. 修改逻辑
    4. 跑测试
    5. 总结
  ↓
Supervisor
  ├── Code Search Agent: 找 AuthService / AuthServiceTest
  ├── Coding Agent: 修改代码
  ├── Test Agent: 运行 AuthServiceTest
  └── Review Agent: 检查 diff 和测试结果
  ↓
Evaluator:
    tests_passed = true
    diff_scope_ok = true
  ↓
Memory Manager:
    发现项目规则:认证相关改动必须跑 AuthServiceTest
    写入 project procedural memory
  ↓
Final Response

注意停止条件:

测试通过
diff 范围合理
review 无 blocking issue
或达到 retry 上限

不是让几个 Agent 一直讨论“还可以怎么优化”。

设计 checklist

做 multi-agent 前,先问这些问题:

  • 是否真的需要多个 Agent,还是一个 Agent 加工具就够?
  • 每个 Agent 的职责边界是什么?
  • 谁是任务 owner?
  • 谁能创建子任务?
  • 谁能调用其他 Agent?
  • 每次委托的输入、输出、权限、截止时间是什么?
  • 任务预算是多少?
  • 最大 hop count 是多少?
  • 什么条件算完成?
  • 什么情况必须停下来问用户?
  • trace 如何保存?
  • 失败如何归因?
  • 什么经验能写入记忆?
  • 记忆如何删除、过期、审计?
  • 每次自进化如何 eval 和回滚?

我的设计建议

如果要做一个通用 Agent 产品,我建议优先抓四件事。

第一,强 Runtime。

预算、权限、状态机、取消、审计、熔断

第二,强 Context Builder。

不同 Agent 看到不同上下文
记忆按 scope 注入
工具和权限明确注入

第三,强 Evaluator。

没有评价信号,就没有可靠自进化

第四,强 Memory Manager。

记忆必须可溯源、可删除、可冲突处理、可权限控制

我不建议一开始追求“Agent 自己改自己,越跑越聪明”。

更可靠的路线是:

先让 Agent 可观测
再让失败可归因
再让经验可沉淀
再让改动可评测
最后才谈自动优化

下一步

继续读:

参考资料