主题
04 · 多 Agent 协作
多个 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 就重置。
升级练习
在 深度研究员 完成后,将「收集来源」和「撰写报告」拆开:前者拥有搜索工具,后者只得到经过验证的资料。记录引用丢失率和总成本,再决定是否保留拆分。