Skip to content

04 · 多 Agent 协作 ​

🎯 难度:中级⏱ 预计:60 分钟# 职责拆分# 协作# 成本

多个 Agent 并不是把同一个 Prompt 改几个角色名,然后让它们无限聊天。核心是:职责、信息和权限边界能否真正拆开。

三种协作结构 ​

结构组织方式适合
顺序流水线研究 → 写作 → 检查输入输出明确的阶段任务
Supervisor一个调度者分配子任务有多个工具域的复杂需求
并行专家同时处理独立子任务,汇总多来源比较、可拆分调研

单模型调用完成一个固定阶段,不一定需要叫它「Agent」。设计上先区分流水线节点与有独立工具循环的 Agent。

最小的双角色流水线 ​

沿用 config.py,在单个文件中运行。这里只演示职责拆分,不包含检索,也不能把生成的观点当作已证实的研究。

python
from config import get_client, model_name

client = get_client()

def ask(role: str, task: str) -> str:
    reply = client.chat.completions.create(
        model=model_name(),
        messages=[{"role": "system", "content": role}, {"role": "user", "content": task}],
        max_tokens=700,
    )
    choice = reply.choices[0]
    if choice.finish_reason != "stop":
        raise RuntimeError("阶段输出未正常结束")
    return choice.message.content or ""

if __name__ == "__main__":
    topic = "给前端新人的 Python 学习建议"
    draft = ask("你负责写简洁的学习建议,不编造运行经验。", topic)
    review = ask(
        "你负责检查建议是否有明显误导;指出问题,不声称联网验证。",
        f"主题:{topic}\n待检查草稿:\n{draft}",
    )
    print("草稿:", draft)
    print("检查意见:", review)
    client.close()

观察:第二个调用只看到我们显式传入的草稿,不会自动共享第一个调用的历史。

上下文交接要有契约 ​

不要把全部历史直接扔给所有 Agent。交接内容建议包含:

text
任务 ID、目标、约束
已完成事项、尚未解决的问题
产物位置与来源引用
允许使用的工具、剩余预算

用 Pydantic 校验结构,用确定性检查确认引用和文件存在。子 Agent 的总结仍然是不可信数据,不能自动提升为上级指令。

常见失败 ​

  • 信息损耗:研究员给出了来源,写作者删掉了来源。
  • 相互放大错误:多个相同模型都接受了第一份幻觉。
  • 协调开销:拆成五个人,实际只是多花四轮 Token。
  • 权限外溢:写作 Agent 继承了不需要的文件写入能力。
  • 无限交接:A 找 B,B 找 A,没有全局预算。

先用单 Agent 建立基线,再证明拆分带来的成功率或延迟改善。全局预算不能因为交给子 Agent 就重置。

升级练习 ​

在 深度研究员 完成后,将「收集来源」和「撰写报告」拆开:前者拥有搜索工具,后者只得到经过验证的资料。记录引用丢失率和总成本,再决定是否保留拆分。

用心写给每一个想入门 Agent 开发的前端工程师