多智能体协作的坑:Bug在第二步,你却在第五步才发现

KaiDev 专家 7小时前 更新于 2026年7月25日 174 浏览 12 点赞 约 3 分钟

在公司推行AI Agent工作流这段时间,我发现一个极其离谱的现象:单Agent调试简直是小儿科,看一眼提示词,看一眼工具调用,结果不对直接改。但一旦涉及到多Agent协作(比如用LangGraph这种图结构),调试就变成了某种形式的“刑讯逼供”。

最典型的剧本是这样的:Agent A 把任务传给 Agent B → B 调用工具 → 结果传回 A → A 根据结果做了个决定 → 过了三步之后,最终输出的结果错得离谱。

这时候最绝望的来了:你盯着第五步的错误结果发呆,然后得像个侦探一样,手动翻几千行日志,回溯到第二步,才发现其实是 Agent A 在移交给 B 的那一刻,传的东西就走样了。

这种“静默失败”简直是多智能体架构的隐形成本。

为什么移交环节总是悄悄崩掉?

单链条模式下,状态是线性的。但多Agent模式下,状态往往是“隐式”的。

你在日志里看到 A 说:“我已经把正确的信息发过去了。”
接着看到 B 说:“我收到了一个看起来还行的数据。”

单独看,两个 Agent 表现得都像个模范员工。但问题就出在 A 的“意图”和 B 的“实际接收”之间那个真空地带。如果你的日志只记录每个 Agent 的输入输出,这个缺口永远被掩盖,直到最后一步崩盘。

几个实操层面的避坑指南

在公司里为了不被产品经理催死,我总结了几个能快速定位问题的野路子,建议直接照搬:

一、把“移交”当成一级事件来记录
别只写 Agent A finishedAgent B started。这种日志在排查时毫无意义。你应该记录:

  • 为什么决定移交(决策链路)
  • 传输的真实 Payload(原始数据)
  • 接收方被告知了什么
  • 接收方的权限范围(比如 B 是否真的能访问 A 认为它能访问的内存空间)

二、停止盲目全量重跑
很多同事习惯于修改一个提示词后重新跑一遍整个图。这不仅慢,而且如果你的 Agent 涉及发邮件、改 Jira 单子等有副作用的操作,重跑一次可能会给客户发十封重复邮件。
最高效的方法是实现“节点跳转检查”,直接跳到出错的那个移交节点,检查当时的 State 镜像。

三、在边界处做快照比对(低成本预警)
我尝试过一个方案,在 Agent 边界强制做 Snapshot:

  • 发送方快照:A 发出时的状态
  • 接收方快照:B 在执行第一个 LLM 调用前,绑定到工作状态的数据
  • 对比 Diff

如果这两者不一致,Bug 在第二步就会被揪出来,而不是等到第五步。

给个具体的配置思路

如果你在写自定义的 State 检查逻辑,可以参考这个简单的伪代码逻辑,在 Agent 切换的拦截器里加一段:

def handoff_interceptor(sender_state, receiver_state):
    # 强制校验关键字段是否在传输中丢失或变形
    critical_keys = ["user_id", "task_context", "session_id"]
    for key in critical_keys:
        if sender_state.get(key) != receiver_state.get(key):
            # 触发警告,直接在日志中高亮,而不是等结果出错
            print(f"[CRITICAL_DIVERGENCE] Key {key} changed during handoff!")
            print(f"Sender: {sender_state.get(key)} | Receiver: {receiver_state.get(key)}")

总结一下

现在的所谓“AI 可观测性”工具,大多在关注 LLM 的 Token 消耗或单次调用耗时,这对于单链条有用,但对于复杂的多智能体系统来说太浅了。

真正的痛点在于:谁在什么时候看到了什么内存?谁在移交时把信息搞丢了?

如果你也在折腾 AI Agent 工作流,记住一句话:记录移交过程,比记录 Agent 本身重要得多。

工作流AIAI落地programmingpython

全部回复 (2)

脚本小子小柯 专家 11小时前
建议给每个节点加个日志输出,不然真不知道哪一步把参数给搞丢了。
0 回复
老陈 专家 11小时前
状态传递最坑,中间某个环节稍微丢了点上下文,后面全在瞎猜。
0 回复

发表回复

支持 Markdown 格式