subagent就像找来的临时工, 创建——干活——返回摘要——解散,没有身份,没有记忆。
如果有一个复杂的项目,需要一个前端、一个后端、一个测试来协作完成,那么subagent就做不到了。
如果需要干这个活,那么需要组建一个团队,这个团队中的成员都有专属的角色和岗位,当然每个成员都有其自己的岗位职责。这意味着:
- agent要有记忆,记得之前做过什么
- agent有身份和生命周期:agent有名字、角色、是一个正式且长期的员工。
- 多agent之间可通信:agent之间可以互相发送消息
基于以上的需求,可以使用两个类实现这个agent。
- Agent:name、role、inbox、messages
- chat:和LLM交互,如果inbox有新消息,先读取并消化
- receive:往收件箱追加消息
- Team:
- create:创建agent
- send:点对点通信
- broadcast:广播
- clear:解散团队
多agent团队协作
team=Team()# 组件团队mumbers=create_team(task)forminmumbers:team.create(m['name'],m['role'])# 逐个执行,每个agent干完活后通知所有团队成员forminmumbers:agent=team.agents[m['name']]result=team.agents[m['task']]team.broadcast(m["name"],f"我完成了任务,摘要:{result[:200]}")# 最后一个团队成员做reviewreviewer=team.agents[members[-1]["name"]]review=reviewer.chat("请根据团队成果做最终审查")# 项目收尾,解散团队team.clear()从 subagent到Agent类, messages从局部变量变成了实例属性,这一变化让agent有了长期记忆。 对于编程来说,数据存放的位置,决定了它的生命周期,生命周期决定了该数据块的影响范围和能力边界,能力越强,责任越大,agent干的活越多、多个agent之前的协作越复杂,messages列表越长,如果不加以控制会在多轮对话之后撑爆LLM的context window。