10 - 多 Agent 协作:Team 的四种模式
一句话总结:当一个 Agent 搞不定的时候,组个团队 – Agno 的 Team 提供四种协作模式,覆盖从路由分发到自主任务拆解的全部场景。
为什么需要多 Agent
前面九篇我们一直在折腾单个 Agent。给它加工具、加知识库、加记忆,搞得越来越强。但总有些场景,一个 Agent 再强也不够用。
举个例子:你让一个 Agent 同时当”股票多头分析师”和”风险分析师”,它很可能会在两种角色之间摇摆,给你一个不痛不痒的中庸回答。不是它不行,而是单一角色设定天然就有局限性。
这就像一个人同时当产品经理、设计师、开发和测试 – 不是不行,但效果肯定不如专人专事、分工协作。
Team 的核心思路就是这个:把一个复杂任务拆给多个专精的 Agent,然后由一个领导者(Leader)协调汇总。
第一个 Team:投资分析
来看一个经典场景 – 多空对决。一个分析师看多,一个分析师看空,最后由团队领导综合两边观点给出建议。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
from agno.tools.yfinance import YFinanceTools
bull = Agent(
name="多头分析师",
role="分析股票的上涨理由",
model=OpenAIChat(id="gpt-4o-mini"),
tools=[YFinanceTools()],
instructions="你是一个乐观的股票分析师,专门找投资的正面理由。用数据说话。",
)
bear = Agent(
name="空头分析师",
role="分析股票的风险因素",
model=OpenAIChat(id="gpt-4o-mini"),
tools=[YFinanceTools()],
instructions="你是一个谨慎的风险分析师,专门找投资的风险点。用数据说话。",
)
team = Team(
name="投资分析团队",
model=OpenAIChat(id="gpt-4o-mini"),
members=[bull, bear],
instructions="""\
你是投资分析团队的领导。
1. 把任务分配给多头和空头分析师
2. 综合他们的观点给出平衡的建议
3. 明确标出买入/持有/卖出的建议""",
markdown=True,
show_members_responses=True,
)
team.print_response("分析一下NVIDIA值不值得投资", stream=True)
运行之前先装一下依赖:
pip install agno openai yfinance
跑起来你会看到:先是多头分析师用 YFinance 工具查了数据,洋洋洒洒讲了一堆看涨理由;然后空头分析师同样查了数据,列出了风险点;最后团队领导综合两边意见,给出一个平衡的结论。
这就是 Team 的基本工作方式。注意几个关键点:
- 每个成员都是独立的 Agent – 有自己的 model、instructions、tools,互不干扰
- Team 本身也需要一个 model – 因为领导者也是一个”Agent”,它需要模型来理解任务、分配工作、综合结论
role很重要 – 领导者根据每个成员的 role 来决定把什么任务分配给谁show_members_responses=True– 让你在终端里看到每个成员的单独回复,方便调试
四种协作模式
Team 不只有一种工作方式。Agno 提供了四种模式,适用于不同的协作场景:
| 模式 | 关键词 | 工作方式 | 典型场景 |
|---|---|---|---|
coordinate |
协调 | 领导者挑选合适的成员,分配任务,汇总结果 | 研究 + 写作、多角色协作 |
route |
路由 | 领导者把请求转给最合适的成员,直接返回 | 客服分流、语言路由 |
broadcast |
广播 | 所有成员同时收到相同任务,领导者汇总 | 多视角分析、辩论 |
tasks |
任务 | 领导者自主拆解任务、分配、迭代执行 | 内容流水线、复杂工程 |
上面那个投资分析的例子默认用的就是 coordinate 模式。下面逐个看看其他三种。
coordinate 模式:协调分工
这是默认模式,也是最常用的。领导者分析用户的请求,挑选合适的成员,给他们分配具体任务,收到回复后综合成最终答案。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
researcher = Agent(
name="研究员",
role="负责调研和收集信息",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个研究员,提供清晰、有条理的信息摘要。",
)
writer = Agent(
name="写手",
role="负责把信息写成可读的文章",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个优秀的写手,擅长把复杂信息变成通俗易懂的文章。",
)
team = Team(
name="内容团队",
mode="coordinate",
model=OpenAIChat(id="gpt-4o-mini"),
members=[researcher, writer],
instructions=[
"你是内容团队的负责人。",
"先让研究员调研信息,再让写手把结果写成文章。",
],
show_members_responses=True,
markdown=True,
)
team.print_response("写一篇关于量子计算现状的科普文章", stream=True)
coordinate 模式下,领导者有自主判断权 – 它可以只委派一个成员,也可以同时委派多个。上面的投资分析例子就是同时委派了两个。
route 模式:智能路由
有时候你不需要多个 Agent 协作,只需要把请求转给最合适的那个人。这就是 route 模式。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
coder = Agent(
name="程序员",
role="回答编程和技术问题",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个资深程序员,擅长解释技术概念和写代码。回答要包含代码示例。",
)
writer = Agent(
name="写手",
role="回答写作和文案相关的问题",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个专业写手,擅长各种文体的写作。",
)
advisor = Agent(
name="职业顾问",
role="回答职业发展和职场问题",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个职业发展顾问,给出务实的职场建议。",
)
team = Team(
name="智能路由团队",
mode="route",
model=OpenAIChat(id="gpt-4o-mini"),
members=[coder, writer, advisor],
instructions="你是一个路由器,根据用户问题的类型,把请求转给最合适的专家。",
show_members_responses=True,
markdown=True,
)
team.print_response("怎么用Python写一个简单的爬虫?")
# -> 路由到 程序员
team.print_response("帮我写一封得体的辞职信")
# -> 路由到 写手
team.print_response("工作三年了,该不该跳槽?")
# -> 路由到 职业顾问
route 模式的关键特点:
- 领导者不综合、不加工,直接返回成员的回复
- 只选一个成员来处理(不会同时选多个)
- 适合”一个问题只需要一个专家”的场景
- 效率高 – 省去了综合汇总的开销
这个模式特别适合做客服系统:用户问技术问题转技术支持,问账单问题转财务,问退货转售后。
broadcast 模式:全员广播
有些问题需要多个角度同时看,而且你希望每个角度都是独立思考、不受彼此影响的。broadcast 模式就是干这个的 – 把相同的问题同时发给所有成员,然后领导者综合各方意见。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
optimist = Agent(
name="乐观派",
role="从机遇和正面角度分析问题",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你总是看到事物积极的一面。聚焦于机会、增长潜力和正面趋势。但要基于事实,不是盲目乐观。",
)
pessimist = Agent(
name="悲观派",
role="从风险和负面角度分析问题",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你专注于风险、挑战和潜在的坑。指出可能出错的地方和需要谨慎的原因。但要提出建设性意见,不是无脑唱衰。",
)
realist = Agent(
name="现实派",
role="提供平衡务实的分析",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你提供基于证据的客观分析。权衡机遇和风险,聚焦于最可能发生的情况。",
)
team = Team(
name="三视角分析团队",
mode="broadcast",
model=OpenAIChat(id="gpt-4o-mini"),
members=[optimist, pessimist, realist],
instructions=[
"你是一个多视角分析团队的领导。",
"所有成员会独立回答同一个问题。",
"你需要综合他们的观点,给出一个全面、平衡的总结。",
],
show_members_responses=True,
markdown=True,
)
team.print_response("现在创业做AI应用是不是一个好时机?", stream=True)
broadcast 和 coordinate 的区别:
- coordinate – 领导者决定谁来回答,可能只派一个人
- broadcast – 所有人都回答,一个不落
broadcast 适合需要”对抗性思维”的场景 – 不同立场的 Agent 独立分析同一个问题,避免了群体思维的陷阱。
tasks 模式:自主任务拆解
tasks 模式是最”智能”的一种 – 领导者会自主把一个大目标拆解成多个子任务,按顺序或并行地分配给成员,然后迭代执行直到所有任务完成。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
planner = Agent(
name="策划",
role="创建内容大纲和结构",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个内容策划,擅长把复杂话题拆分成清晰的大纲结构。",
)
writer = Agent(
name="写手",
role="根据大纲撰写内容",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个写手,根据提供的大纲写出通顺、有吸引力的内容。",
)
editor = Agent(
name="编辑",
role="审核和改进内容质量",
model=OpenAIChat(id="gpt-4o-mini"),
instructions="你是一个编辑,负责审查内容的清晰度、语法和逻辑,直接给出改进后的版本。",
)
team = Team(
name="内容流水线",
mode="tasks",
model=OpenAIChat(id="gpt-4o-mini"),
members=[planner, writer, editor],
instructions=[
"你是内容流水线的负责人。",
"对于每个请求:",
"1. 先让策划创建内容大纲",
"2. 再让写手根据大纲写初稿",
"3. 最后让编辑审核润色",
"按顺序执行任务,最终输出编辑后的成品。",
],
show_members_responses=True,
markdown=True,
max_iterations=10,
)
team.print_response("写一篇关于微服务 vs 单体架构的技术博客")
tasks 模式的特点:
- 领导者会自动拆任务、排优先级、处理依赖关系
max_iterations控制最大迭代次数,防止无限循环- 适合有明确流程的”流水线”场景 – 上一步的输出是下一步的输入
什么时候用 Team,什么时候用单 Agent
不是所有场景都需要 Team。组团队是有成本的 – 更多的 API 调用、更长的延迟、更高的费用。用之前先想想是不是真的需要。
单 Agent 就够的场景:
- 任务单一、目标明确(翻译、摘要、代码生成)
- 不需要多角度观点
- 对延迟和成本敏感
需要 Team 的场景:
- 需要多个视角的对抗性分析(多空分析、辩论)
- 需要多种专业能力的组合(调研 + 写作 + 编辑)
- 需要根据输入类型路由到不同处理器(客服分流)
- 一个复杂任务需要分步骤、流水线式完成
一个简单的判断标准:如果你发现自己在给一个 Agent 写一堆互相矛盾或者职责完全不同的 instructions,那大概是时候拆成 Team 了。
常用配置参数
除了上面已经用到的,再补充几个实用的配置:
team = Team(
name="示例团队",
mode="coordinate",
model=OpenAIChat(id="gpt-4o-mini"),
members=[agent_a, agent_b],
# 显示每个成员的单独回复(调试必备)
show_members_responses=True,
# 直接返回成员的回复,不经过领导者综合
# 适合 route 模式
respond_directly=True,
# 成员之间共享彼此的交互记录
# 后面的成员能看到前面成员说了什么
share_member_interactions=True,
# 把任务广播给所有成员(不让领导者选人)
# coordinate 模式下有效
delegate_to_all_members=True,
# tasks 模式下的最大迭代次数
max_iterations=10,
)
几个参数的使用场景:
| 参数 | 什么时候用 |
|---|---|
show_members_responses |
调试的时候,想看每个成员都说了什么 |
respond_directly |
route 模式默认就会这样;coordinate 模式下如果你不需要领导者加工 |
share_member_interactions |
成员之间有依赖,后面的成员需要参考前面的结果 |
delegate_to_all_members |
coordinate 模式下想让所有人都参与(类似 broadcast 的效果) |
max_iterations |
tasks 模式下控制循环上限,防跑飞 |
今天学了什么
回顾一下关键概念:
- Team 是多个 Agent 的协作容器,由一个领导者(Team 本身)和多个成员(members)组成
- 四种模式各有用武之地:
coordinate– 领导者分配任务、综合结果,最通用route– 路由到最合适的成员,效率最高broadcast– 全员作答、多视角碰撞tasks– 自主拆解任务、流水线执行- 每个成员都是独立的 Agent,有自己的模型、指令和工具
- Team 本身也需要 model 和 instructions – 领导者也是 Agent
- 不是所有场景都需要 Team,单 Agent 能解决的就别组队
Team 让你从”一个人单打独斗”进化到”一个团队协作”。但这只是开始 – 团队成员之间怎么共享知识、怎么传递记忆、怎么嵌套组合,还有很多可以玩的。
下一篇预告
11 - Team 进阶:知识共享与记忆传递
团队有了,但成员之间还是各干各的。下一篇我们让团队成员共享知识库、传递对话记忆、在 session 中保持上下文 – 从”一群各自为战的 Agent”变成”一个真正有默契的团队”。