季度报告的死线是明早九点,老李已经在工位前坐了六个小时。他把厚厚一沓资料——竞品数据、销售报表、技术博客——统统贴进了一个“超级 Agent”的上下文窗口里,然后敲下指令:“把这份季度报告写了,要有市场分析、技术进展、销售数据汇总,最后给出下季度建议。”
一个小时后,他收到的是一份奇怪的缝合怪:市场分析引用了 2021 年的行业数据,销售数据把万和亿搞混了,技术部分倒是写得挺通顺,但完全没提他们团队最近刚上线的微服务架构。老李差点把保温杯砸在键盘上。
“小王!”他转过头,“你不是说一个 Agent 能搞定复杂任务吗?这玩意儿连实习生都不如!”
小王凑过来看了两眼报告,表情了然:“老李,你让一个记者既做采访,又做美编,还要排版校对——他能不崩吗?Agent 也一样,一个脑子同时装太多东西,上下文就变成大杂烩,该深的地方浅,该准的地方乱。”
“那就多找几个脑子。”小王打开笔记本电脑,调出了 AutoGen 的界面,“我给你搭一个编辑部。”
编辑部:一个 Agent 干不了的事,三个 Agent 能
小王在屏幕上画了一个三角形。“你看咱们公司的编辑部——有小王负责采访收集素材,小张负责分析数据做图表,老赵负责统筹写稿。他们不需要都会对方的活儿,但合起来就能出一份杂志。”
“多 Agent 系统就是这个思路。把任务拆开,给不同类型的 Agent 分配不同的角色和工具,让它们通过对话协作。一个 Agent 只做自己擅长的事,上下文不会爆炸,还能互相检查纠错。”
他在白板上写下三个角色:
- 搜索 Agent:能调用搜索引擎、知识库、数据库,负责收集原始素材。它有工具,但不负责分析。
- 分析 Agent:能处理数据,做统计、对比、趋势判断。它有计算和推理能力,但不负责写报告。
- 写作 Agent:能把结构化信息转成流畅的报告,遵循指定的格式和风格。它不直接接触原始数据,只加工前两个 Agent 的产出。
图:协调者模式下的多 Agent 协作——每个 Agent 专注于自己的环节
第一步:定义 Agent 角色与工具
老李催道:“别光画图,代码呢?”
小王打开终端,开始定义三个 Agent 的配置。AutoGen 里每个 Agent 都有独立的系统提示、可用工具和对话角色。
from autogen import AssistantAgent, UserProxyAgent
# 搜索Agent:能使用知识库检索和网页搜索(模拟工具)
search_agent = AssistantAgent(
name="搜索员",
system_message="你是信息收集专家。收到任务后,使用工具搜索相关资料,"
"返回原文摘要和来源。不要进行分析或给出建议。",
llm_config={"tools": [{"type": "function", ...}]} # 搜索工具定义省略
)
# 分析Agent:能处理数据,做对比
analyst_agent = AssistantAgent(
name="分析师",
system_message="你是数据分析师。仅基于搜索Agent提供的资料,进行统计分析、"
"对比和趋势判断。输出结构化结论,不负责格式美化。"
)
# 写作Agent:整合素材,生成报告
writer_agent = AssistantAgent(
name="写手",
system_message="你是报告撰写人。将分析师的结构化结论转化为流畅的季度报告,"
"严格使用 Markdown 格式,遵循公司报告模板。"
)“这只是角色定义,”小王解释道,“真正的协作需要一个协调者来安排对话流程。我们用一个 UserProxyAgent 扮演老板的角色,把用户指令拆成步骤,依次唤醒三个 Agent。”
第二步:协调者编排对话流程
“协调者的核心逻辑是——拿到用户的大任务,拆成子任务,然后按依赖关系启动 Agent 间的对话。”小王继续敲代码。
# 协调者逻辑:用 AutoGen 的 GroupChat 让 Agent 自动轮流发言
from autogen import GroupChat, GroupChatManager
def create_report_team(task: str):
# 将三个Agent放入群聊
groupchat = GroupChat(
agents=[search_agent, analyst_agent, writer_agent],
messages=[],
max_round=12,
speaker_selection_method="auto" # 由协调者决定下一个发言者
)
manager = GroupChatManager(groupchat=groupchat)
# 用户代理发起任务
user = UserProxyAgent(name="老板", human_input_mode="NEVER")
user.initiate_chat(
manager,
message=f"""任务:{task}
请按以下流程协作:
1. 搜索员搜索相关资料并返回摘要
2. 分析师基于摘要给出结构化分析
3. 写手将分析结果整合成最终报告"""
)
return groupchat.messages“看到没?协调者不参与具体工作,它只控制‘谁现在该说话了’。搜索员产出后,协调者把消息转给分析师;分析师出结论后,转给写手。写手输出的最终消息就是你要的报告。”
老李若有所思:“那如果分析师发现搜索员搜的数据不够,它能不能主动要求搜索员再查一次?”
“能。这就是动态对话。Agent 在群聊里不只是单向传递,它们可以互相提问、要求补充。AutoGen 的 speaker_selection_method 设为 auto 时,LLM 会根据当前对话状态决定下一个发言者,所以搜索员和分析师之间可以来回沟通,直到双方满意。”
第三步:冲突与质量保障
“那万一搜索员和分析师意见不一致怎么办?”老李问,“比如搜索员找到的竞品数据是去年的,分析师认为该用今年的,俩 Agent 掐起来了?”
小王笑了:“这就是多 Agent 系统里最精彩的部分——冲突解决。在 AutoGen 的群聊里,Agent 可以提出质疑,其他 Agent 可以辩解或修正。如果始终达不成一致,协调者(或用户)可以介入。”
他补充道:“更严谨的做法是引入验证 Agent。比如在上述流程中加一个‘审稿 Agent’,它专门检查报告中的数据是否与原始资料一致、格式是否符合要求。审稿 Agent 可以打回给写手修改,直到通过。”
老李眼睛一亮:“那是不是还能加一个‘风格 Agent’,负责把报告改成老刘喜欢的那种腔调?”
“完全正确。Agent 团队是可插拔的,缺哪个能力就加哪个角色。这就是多 Agent 架构最大的灵活性——不是造一个全能的超级大脑,而是组一个各有所长的团队。”
那一夜,三个 Agent 写的报告
老李把自己刚才收集的资料扔给了小王搭的 Agent 团队。十分钟后,屏幕上开始滚动对话日志:
[搜索员] 已搜索“云原生安全 2026 Q1 市场份额”,找到3篇相关报告...
[分析师] 根据搜索员提供的数据,总结如下:Wiz 市场份额增长12%,...
[写手] 已生成报告草稿,包含市场分析、技术进展、销售数据...
[审稿Agent] 检查通过,格式正确,数据来源可追溯。老李下载了最终报告,仔仔细细读了十分钟。从市场趋势到技术细节,从数据图表到下季度建议,逻辑清晰,引用的竞品数据都标注了来源和时效。
他沉默地拧开保温杯,喝了一口已经凉透的枸杞水,然后说:“这份报告,明天董事会我直接用。”
小王故作惊讶:“老李,你不是觉得 Agent 不行吗?”
“我说过吗?”老李面不改色,“下不为例啊。对了,你那个协调者决定发言顺序的逻辑,如果搜索员和分析师反复踢皮球,一直不完结怎么办?那个 max_round 设成 12 够吗?什么情况下该人工介入?你给我看看那部分的配置。”
小王笑着把配置文件打开。窗外的天色已经蒙蒙亮,死线前的赶工之夜,在三个虚拟 Agent 的通力合作下,终于画上了句点。

