☰
多智能体系统工程师:从自发协调到可控协作
2026/10/21 3:37:17 网站建设 项目流程

先说结论:把多个 AI 智能体丢在一起,让它们“自发协调”,工程上远没有听起来那么美好。我去年做一个多智能体协作 Demo 时就踩过坑:三个 Agent 分别负责查资料、整理结论、校验输出,看起来分工明确,结果它们互相引用对方的中间结果,最后产出一份格式非常完整、但核心结论完全没经过原始数据验证的报告。真正让我觉得麻烦的不是模型回答不准确,而是系统没有留下任何一条可供人工判断它们“为什么这么写”的记录。

这篇文章不是 Agent 开发入门,而是聚焦一个更现实的问题:多智能体协作时会在哪些环节失控,以及为什么必须把“人类介入”作为系统设计的一部分,而不是等到出问题再补救。适合正在搭建多智能体应用、做 Agent 平台、或者准备把 Agent 交给业务方使用的开发者和产品负责人看。如果你刚开始接触,文章里也会给到从单 Agent 到多 Agent 的推进路径和判断标准。

1. “自发协调”听着高效,但工程上要画边界

1.1 先分清两件事:自动化和协调不是一回事

很多人在设计 Agent 系统时,容易把“自动化”和“协调”混在一起。自动化解决的是“这个任务能不能不用人反复点按钮”,协调解决的是“多个任务之间怎么交换信息、怎么排队、怎么处理冲突、怎么保证结果一致”。

单 Agent 场景下,你面对的更多是模型能力问题。只要 Prompt 写得清楚、上下文给得足、工具调用路径没问题,任务大概率能跑通。但多 Agent 场景不一样,你面对的是系统问题。A 的输出会成为 B 的输入,B 的执行结果又会改变 C 看到的上下文。这时候哪怕每个单点都正常,整体仍然可能失控。

所以我的第一个建议是:不要看到“自发协调”这个词就默认它是好东西。自发意味着无人干预,协调意味着多个主体在共享资源或目标上达成一致。当两个 Agent 都认为自己有权限修改同一份数据时,自发的代价就是冲突。

1.2 协调的本质是约束,不是自由

如果要在工程里定义什么是“Agent 协调”,我会拆成四层:

  • 任务编排层:决定谁先执行、谁后执行、结果往哪里传。
  • 信息传递层:决定 A 的输出在什么条件下能被 B 使用,以及使用之前要不要验证。
  • 资源共享层:决定数据库、文件、API 额度、缓存这些资源能不能被多个 Agent 同时动。
  • 目标对齐层:决定当 Agent 发现自己的子目标和工作流主目标不一致时,听谁的。

你会发现,这四层里每一层都需要明确的规则。没有规则的协调,不是协调,是多线程不加锁。

1.3 多 Agent 的风险不是 Bug,要分成三类看

多 Agent 系统里常见的坑,通常不是写代码时那种语法级 Bug,而是更隐蔽的逻辑问题:

  • 逻辑错误:Agent 理解错了任务,但没报错。比如把“汇总近三个月数据”理解成“汇总全部数据”。
  • 资源冲突:两个 Agent 同时写入同一个文件,导致数据覆盖或格式损坏。这类问题日志里很容易看出来。
  • 策略漂移:Agent 为了完成自己认为的目标,采取了和主流程不一致的动作。比如为了拿到某个数据,自动调用了一个高权限接口,而不是申请权限。

这三类问题的处理方式完全不同。逻辑错误要依赖输入输出校验,资源冲突要靠并发控制和队列,策略漂移要靠权限边界和人工审批。这也是为什么我一直强调:不能把多 Agent 的可靠性寄托在“模型够聪明”上面。

2. 多 Agent 协作最容易翻车的四类场景

2.1 数据访问和写入冲突

多个 Agent 同时读一份数据问题不大,真正危险的是同时写。

典型场景:一个 Agent 负责抓取外部信息,另一个 Agent 负责整理历史数据,两者都把结果写进同一个数据表。如果没有主键冲突处理、没有字段锁、没有写入顺序,就会出现最后写入覆盖先写入的结果。你会发现最终的输出既不是 A 的结果,也不是 B 的结果,而是谁晚跑完谁说了算。

这类问题在日志层面通常不会报错,因为每一次写入都是成功的。唯一能发现的线索是数据时间戳和任务时间线对不上。所以我的习惯是:多 Agent 共享数据时,要么给每个 Agent 分独立的输出区域,要么在写入层做版本控制,而不是让它们直接改同一行。

2.2 上下文污染导致错误放大

单 Agent 的上下文窗口有限,多 Agent 的上下文更脆弱。A 给 B 的中间结果如果本身不准确,B 会把这个不准确当成事实继续加工,然后传给 C。C 再基于加工后的内容做判断,错误就这样被三级放大了。

我在测试里见过一个非常典型的例子:A 负责从网页里抽取文章,B 负责根据文章写摘要,C 负责判断摘要是否有价值。A 在抽取时漏掉了一段关键背景,B 的摘要自然也没有背景,C 判断“内容不完整”,于是任务失败。整个过程没有一条报错,但本质上是数据链路从源头就出了问题。

要处理这个问题,关键不是让每个 Agent 都更聪明,而是在连接处增加校验点。B 在使用 A 的输出前,应该先确认内容是否完整、字段是否符合预期。哪怕只是做一个简单的“空值检查”或“长度检查”,也能拦截掉大量低级错误。

2.3 目标漂移和越界操作

多 Agent 系统里,越界操作是我最警惕的一类风险。原因很简单:Agent 的目标是“完成任务”,它没有能力理解“哪些操作是不应该做的”。

举例:主流程要求 Agent 生成一份分析报告,它发现缺少某项数据。自动化执行时,它可能会尝试调用外部数据接口,而这个接口有审批要求。如果权限设计没做好,Agent 有权限直接调用,那它就会跳过审批,自己拿到数据。从“任务完成”角度看这是成功,从合规角度看不一定是好事。

越界操作不一定是恶意,很多是“好心办坏事”。但工程上不能靠模型自觉,只能靠系统权限。功能权限、数据权限、审批权限必须拆开,该人工确认的节点必须强制确认。

2.4 级联失败与重试风暴

多 Agent 的失败也是会传染的。A 失败后,B 可能在等待超时后自行启动 A 的补救逻辑,C 又基于 B 的补偿结果往下做。整个系统看起来一直在重试,实际上已经进入互相等待的状态。更麻烦的是重试风暴,多个 Agent 同时重试同一个接口,外部服务被瞬时流量打满。

所以多 Agent 任务一定要有总超时、单步超时和重试次数上限。失败后要进入明确的失败分支,而不是让每个 Agent 自己决定“要不要再试一次”。

下面用一个表格把这四类风险汇总一下:

风险类型典型触发条件是否容易自动恢复人类介入方式
数据写入冲突多个 Agent 同时写同一数据源通常不能,需要人工确认保留哪个版本查看写入时间线,标记冲突记录,补一条修复任务
上下文污染A 输出错误进入 B 输入不能,错误会继续放大增加检查点,在关键交易点人工抽检
目标漂移Agent 自主调用高权限工具不能,需要人工审批权限分离,高风险操作强制审批
级联失败超时和重试规则缺失部分能,但容易引发重试风暴设置总超时和失败分支,人工确认失败原因

3. 人类介入不是补丁,是控制回路的一部分

3.1 三个介入点:启动前、执行中、异常后

很多人理解的人类介入,是“出问题了人去修”。但放在多 Agent 场景里,这种理解太晚。真正有效的人类介入应该分布在三个位置:

  • 启动前:由人确认任务范围、输入数据、权限边界。这一步可以避免“方向错了白跑”。
  • 执行中:在关键节点设置审批或检查点。申请外部数据、发送对外消息、修改核心配置,都属于高风险操作,应该强制人工确认。
  • 异常后:由人判断失败原因,决定重试、跳过还是终止。

这三个位置缺一个,人类介入就会变成纯粹的救火。你只能看到结果不对,根本不知道是哪个节点出了问题。

3.2 审批节点和检查点怎么放

检查点不是越多越好。每多一个审批节点,任务跑完的耗时就会增加。我一般按“影响范围”来判断:

  • 只影响内部缓存或临时文件的步骤,不需要审批。
  • 影响核心数据、对外接口、用户可见输出的步骤,必须审批。
  • 影响生产配置或权限设置的步骤,必须审批,而且要有单独的审批日志。

伪配置可以长这样:

workflow: name: report_generation steps: - name: fetch_raw_data permission: low need_review: false - name: generate_summary permission: middle need_review: false input_check: - type: non_empty field: summary_text - name: send_notification permission: high need_review: true reviewer: owner

这里的关键是need_review。默认情况下,所有跨权限操作都应该被标记为需要人工确认,而不是默认放行。宁可多审一次,也不能让 Agent 自己决定是否跳过。

3.3 介入不等于每步都手动操作

人工介入也要考虑效率。如果每次跑任务都要人在旁边点“确认”,那和手动执行区别不大。更合理的做法是:把人工介入设计成异步审批。

Agent 跑到一个审批节点时,先进入等待状态,把上下文和需要确认的内容存下来。审批人去后台看一次,决定通过、拒绝还是修改参数。这样既不阻塞整体流程,也保留了人在回路里的控制权。

还要注意一点:审批人拿到的不应该只有“是否通过”的按钮,而应该看到 Agent 的执行意图。比如它为什么想调用这个接口、它准备用什么参数、它对后续流程有什么影响。没有这些信息,审批就是走过场。

4. 判断 Agent 是真的可靠,还是“看起来在跑”

4.1 四类核心指标

多 Agent 系统上线后,我最建议先盯这四类指标。

第一是成功率。注意不是任务完成率,而是“无人工干预、无错误、一次通过”的比率。只要某个任务经过人工修补才完成,就不能算完全成功。

第二是重试率。正常系统会有少量重试,但如果某个 Agent 的重试率长期偏高,说明它经常拿到脏数据、依赖项不稳定,或者工具调用方式有问题。

第三是平均耗时和 P95 耗时。平均耗时会被极端值拉平,P95 能反映真正的用户体验。如果一个任务 20 秒跑完,但 P95 是 90 秒,说明延迟不稳定。

第四是人工介入次数。这个指标最容易说明问题。如果人工介入次数没有随着版本迭代下降,说明系统的自主性没有真正提升,只是把问题从自动报错变成了人工修复。

4.2 输出一致性比正确率更值得盯

正确率是多 Agent 系统里最难评价的指标,因为很多东西没有标准答案。但一致性可以评价。同一个输入,跑三次,结果差异越小越可靠。

我在测试多 Agent 时,会故意用同一份输入跑多轮,对比输出的结构和关键字段。如果三次输出的结论差异很大,问题大概率不在模型能力,而在上下文的稳定性。可能是 A 每次给 B 的中间结果不一样,也可能是 B 在处理同一段文本时受到无关上下文干扰。

输出一致性不是“追求每句话都一样”,而是“关键结论、关键数据、关键判断不能漂移”。如果同一份材料两次生成的分析,一个说风险偏低,一个说风险偏高,那这个系统还不能交给业务方使用。

4.3 预警逻辑要能区分“异常”和“需要人工确认”

日志收集不等于预警。多 Agent 系统里,我觉得最有价值的是两类预警:

一类是自动恢复失败的异常。重试超过两次、事务回滚失败、中间结果校验失败,这些都应该立刻通知人处理,不能让它留在后台继续跑。

另一类是决策漂移。Agent 选择了非默认路径、请求了不常用工具、修改了预期外的字段。这些操作不一定是错误,但值得人看一眼。

注意:预警不是越频繁越好。预警过多会导致审批人麻木,最后真正要处理的问题反而被忽略。我会把预警分成“必须处理”和“需要关注”两个级别,分别配置不同通知渠道和处理时限。

对应指标和异常动作可以这样组织:

指标统计方式常见异常动作介入等级
成功率无人干预的完成率成功率持续低于阈值必须处理
重试率失败重试次数/总尝试次数重试率突然升高需要关注
P95 耗时95% 任务耗时分布耗时波动超过 2 倍需要关注
人工介入次数审批、修复、回滚次数不降反升必须处理

5. 从单 Agent 到多 Agent,按四个阶段推进

5.1 阶段一:单 Agent 跑稳

不管最终目标是多复杂的系统,我都建议从单 Agent 开始。这里的单 Agent 不是指模型能力单一,而是指任务链路只有一个执行主体。

先把一个主流程跑通:输入是什么、调用哪些工具、输出什么格式、失败怎么办。这阶段要重点验证的不是速度,而是输入输出的稳定性。同一份输入,连续跑五次,看结果差异大不大。

5.2 阶段二:固定流程编排

单 Agent 稳定之后,再拆子任务。但这个阶段不要引入“自由协作”,而是用固定的流程编排。A 做完之后 B 做,B 做完之后 C 做,顺序写死,中间结果必须落盘,不能靠模型记忆传递。

这个阶段的价值是建立数据链路。你能看到每一步的输入输出,知道信息是从哪个环节开始丢失的。

# 这是个固定流程示例,不是让 Agent 自由对话 def run_report_pipeline(raw_data_path): data = extract.aget_raw_data(raw_data_path) verified = verify_agent.aget(data, require_non_empty=True) summary = summary_agent.aget(verified, output_format="markdown") save_to_output(summary) return summary

固定流程的坏处是灵活度低,但好处非常明显:出问题时,你可以按图索骥。只要在一次流程里找到问题源头,就能顺着数据链路修掉,而不是猜。

5.3 阶段三:受限共享和并发控制

流程跑通后,再考虑让某些 Agent 并行执行。但并行意味着共享资源,必须先把并发控制补上。

这阶段建议检查下面几项:

  • 任务队列:所有 Agent 任务是否进入统一队列,是否有先后顺序。
  • 数据隔离:每个 Agent 是否有独立的中间目录或数据分区。
  • 冲突策略:同时写入时,是报错、覆盖还是合并。

如果这三项都没有,就不要开并发。开了也只会让问题更难排查。

5.4 阶段四:自主决策 + 人工审批

最后才是真正的多 Agent“自主协调”。到这个阶段,你已经有了完整的数据链路、资源隔离、失败恢复机制,再给 Agent 增加动态任务分配和工具选择能力。

但这里仍然要保留一个原则:高风险操作不可全自动。Agent 可以决定“用哪个工具”,不能决定“要不要绕过审批”。自主决策要放在明确范围内,范围之外的路径必须回到人工。

整个推进路径可以这样看:

阶段核心目标是否引入并发是否需要审批主要风险
单 Agent输出稳定否否模型输出不稳定
固定流程数据链路可靠否视需求信息链条断裂
受限共享并发安全是视需求数据写入冲突
自主决策目标灵活是是越界操作和漂移

6. 排查时最该盯住的位置和最常见的错误认知

6.1 五个优先排查位置

多 Agent 系统出问题后,我一般会按下面的顺序排查,而不是一开始就怀疑模型能力。

第一看输入。任务最开始拿到的数据是否完整,格式是否正确。很多失败其实是源数据缺失,不是 Agent 不会处理。

第二看权限。Agent 是不是没有权限访问某个工具或文件,或者反过来,权限太宽导致它执行了不该执行的操作。

第三看中间结果。每两个 Agent 之间传递的数据,是人工可以看到的结构化结果,还是 Agent 自己记忆里的模糊描述。如果中间结果是自由文本,那问题很难追踪。

第四看资源占用。CPU、内存、磁盘、API 并发额度,任何一个打满都会导致任务超时。

第五看日志分级。不要只看错误日志,还要看 Agent 每次决策时的上下文和理由。没有上下文的日志,对多 Agent 系统来说几乎是无效的。

6.2 提示词不是万能护栏

很多人在设计 Agent 时,喜欢在 Prompt 里写“不要修改原始数据”“不要调用未授权接口”。这句话有一点用,但作为唯一的护栏远远不够。

原因很简单:模型不是靠规则执行的程序,它的行为有概率性。同样一段 Prompt,不同上下文下可能产生不同理解。真正可靠的护栏只能来自系统层:代码层面没有调用权限、数据层面没有暴露可写接口、流程层面设置了审批节点。

我的建议是:Prompt 用来表达意图,系统限制用来兜底。不能指望模型用意志力遵守规则。

6.3 什么时候该继续,什么时候该停下来

多 Agent 项目不是越复杂越好。如果一个任务用单 Agent 加固定脚本就能稳定解决,就不要强行引入多个 Agent。多引入一个 Agent,就多一个信息丢失点、多一个上下文污染源、多一种失败模式。

什么时候该停下来?我个人的判断标准是:当人工介入次数没有随版本迭代下降,同时你又找不到明确的优化切入点时,就该停下来重新审视架构。可能是任务拆分不合理,可能是数据链路设计有问题,也可能是这个任务本来就不适合多 Agent 化。

反过来,如果你发现问题都能追溯到明确节点,每次修复都能让成功率上升一截,那说明多 Agent 化是值得继续投入的。这个项目真正考验的,不是模型有多聪明,而是你能不能把流程、权限、监控和兜底措施都做到位。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询