多 Agent 协作:让 AI 自己组队干活
系列:AI Agent 从入门到实战 | 第 8 篇
一个 Agent 能力有限,就像一个人再厉害也干不了所有事。那如果让多个 Agent 组成团队,分工协作呢?这一篇我们探索 Multi-Agent 系统,看看 Agent 是怎么"组队"完成复杂任务的。
一、为什么需要多 Agent
单个 Agent 的局限:
单个 Agent 处理一个复杂任务: 用户:"帮我写一份竞品分析报告" Agent 的困境: - 要搜索 10 个竞品的信息 → 工具调用次数多 - 要分析每个竞品的优劣 → 需要不同角度的分析能力 - 要写成结构化报告 → 需要写作能力 - 要做数据可视化 → 需要代码能力 一个 Agent 干所有事 → 容易混乱、效率低、质量差多 Agent 的思路:
把任务拆给不同的专业 Agent: 🔍 搜索 Agent:专门负责搜集信息 📊 分析 Agent:专门负责数据分析 ✍️ 写作 Agent:专门负责撰写报告 🔍 审核 Agent:专门负责检查质量 各司其职 → 效率高、质量好二、多 Agent 的三种架构
架构一:层级模式(Manager-Worker)
┌──────────┐ │ Manager │ ← 负责分配任务、协调进度 │ Agent │ └────┬─────┘ / | \ ▼ ▼ ▼ ┌────┐ ┌────┐ ┌────┐ │Worker│ │Worker│ │Worker│ ← 各自执行分配到的任务 │ A │ │ B │ │ C │ └────┘ └────┘ └────┘- Manager 负责拆解任务、分配给 Worker、汇总结果
- Worker 专注执行具体任务
- 适合:任务可以明确拆分的场景
架构二:对等模式(Peer-to-Peer)
┌────┐ ┌────┐ ┌────┐ │Agent│◄─►│Agent│◄─►│Agent│ ← 平等协作,互相传递信息 │ A │ │ B │ │ C │ └────┘ └────┘ └────┘- 没有管理者,Agent 之间平等通信
- 适合:需要多个视角讨论的场景
架构三:流水线模式(Pipeline)
┌────┐ ┌────┐ ┌────┐ ┌────┐ │Agent│──►│Agent│──►│Agent│──►│Agent│ ← 串行处理 │ A │ │ B │ │ C │ │ D │ └────┘ └────┘ └────┘ └────┘- 每个 Agent 处理完后传给下一个
- 适合:有明确先后顺序的任务
三、实战:用 LangChain 搭建多 Agent 团队
我们来搭建一个竞品分析团队:
| Agent | 角色 | 职责 |
|---|---|---|
| 🔍 搜索员 | 信息搜集 | 搜索竞品的相关信息 |
| 📊 分析师 | 分析对比 | 对比各竞品的优劣 |
| ✍️ 写作者 | 撰写报告 | 把分析结果写成报告 |
完整代码
""" 多 Agent 协作实战:竞品分析团队 基于 LangChain 实现 Manager-Worker 模式 """fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.toolsimporttoolfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutor# ============ 定义共享工具 ============@tooldefsearch_info(query:str)->str:"""搜索指定产品或公司的信息"""# 模拟搜索结果(实际项目中接入真实搜索 API)mock_data={"Notion":"Notion:All-in-one 工作空间,支持文档、数据库、看板、wiki。定价:免费版可用,Plus $8/月。优势:功能全面、模板丰富。劣势:学习曲线较陡。","Obsidian":"Obsidian:本地优先的笔记应用,支持双向链接、知识图谱。定价:免费个人使用,Sync $4/月。优势:本地存储、插件生态强。劣势:协作能力弱。","Roam":"Roam Research:大纲式笔记工具,支持块引用。定价:$15/月。优势:强大的知识网络。劣势:价格贵、界面老旧。","语雀":"语雀:蚂蚁集团出品的知识库工具。定价:免费版可用,会员 ¥99/年。优势:中文友好、团队协作好。劣势:国际化不足。",}forkey,valueinmock_data.items():ifkey.lower()inquery.lower():returnvaluereturnf"搜索结果:关于 '{query}' 的信息较少,建议换个关键词。"@tooldefsave_report(content:str)->str:"""将报告内容保存到文件"""withopen("competitive_analysis.txt","w",encoding="utf-8")asf:f.write(content)return"报告已保存到 competitive_analysis.txt"# ============ Agent 1:搜索员 ============defcreate_searcher_agent():"""创建搜索 Agent"""llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0)prompt=ChatPromptTemplate.from_messages([("system","""你是一个专业的信息搜集员。你的任务是搜索指定产品的详细信息。 你需要搜集的信息包括: 1. 产品名称和简介 2. 核心功能 3. 定价策略 4. 优势和劣势 5. 目标用户群体 使用搜索工具获取信息,然后整理成结构化格式返回。 """),("human","{input}"),("placeholder","{agent_scratchpad}"),])agent=create_tool_calling_agent(llm,[search_info],prompt)returnAgentExecutor(agent=agent,tools=[search_info],verbose=True)# ============ Agent 2:分析师 ============defcreate_analyst_agent():"""创建分析 Agent"""llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0)prompt=ChatPromptTemplate.from_messages([("system","""你是一个专业的产品分析师。你的任务是对比分析多个产品的优劣。 分析维度: 1. 功能完整性 2. 用户体验 3. 定价合理性 4. 目标市场定位 5. 竞争优势 输出格式: - 每个维度的对比表格 - 每个产品的综合评分(1-10) - 总结建议 """),("human","{input}"),])# 分析师不需要工具,纯推理chain=prompt|llmreturnchain# ============ Agent 3:写作者 ============defcreate_writer_agent():"""创建写作 Agent"""llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.3)# 稍微调高温度,让写作更有创意prompt=ChatPromptTemplate.from_messages([("system","""你是一个专业的报告撰写者。你的任务是把分析结果写成一份结构清晰、语言流畅的报告。 报告结构: 1. 标题 2. 摘要(100字以内) 3. 背景介绍 4. 产品概览 5. 详细对比分析 6. 总结与建议 要求: - 语言专业但不晦涩 - 使用表格呈现对比数据 - 结论明确,建议具体 """),("human","{input}"),])chain=prompt|llmreturnchain# ============ Manager:协调者 ============defrun_competitive_analysis(products:list):"""Manager 协调整个分析流程"""print("="*60)print("🚀 竞品分析团队启动")print("="*60)# 创建各个 Agentsearcher=create_searcher_agent()analyst=create_analyst_agent()writer=create_writer_agent()# ── 第 1 步:搜索信息 ──print("\n📋 第 1 步:搜索员搜集信息...")print("-"*40)product_infos=[]forproductinproducts:print(f"\n🔍 搜索{product}...")result=searcher.invoke({"input":f"搜索{product}的详细信息"})product_infos.append(result["output"])all_info="\n\n".join(product_infos)print(f"\n✅ 信息搜集完成,共搜集了{len(products)}个产品")# ── 第 2 步:分析对比 ──print("\n📋 第 2 步:分析师进行对比...")print("-"*40)analysis_result=analyst.invoke({"input":f"请对比分析以下产品:\n\n{all_info}"})analysis=analysis_result.contentprint(f"\n✅ 分析完成")# ── 第 3 步:撰写报告 ──print("\n📋 第 3 步:写作者撰写报告...")print("-"*40)report_result=writer.invoke({"input":f"请根据以下分析结果撰写竞品分析报告:\n\n{analysis}"})report=report_result.contentprint(f"\n✅ 报告撰写完成")# ── 输出最终报告 ──print("\n"+"="*60)print("📄 最终报告")print("="*60)print(report)returnreport# ============ 主程序 ============if__name__=="__main__":# 要分析的产品列表products=["Notion","Obsidian","Roam","语雀"]# 运行竞品分析report=run_competitive_analysis(products)四、运行效果
python multi_agent_team.py输出:
============================================================ 🚀 竞品分析团队启动 ============================================================ 📋 第 1 步:搜索员搜集信息... ---------------------------------------- 🔍 搜索 Notion... > 搜索到 Notion 的详细信息... 🔍 搜索 Obsidian... > 搜索到 Obsidian 的详细信息... 🔍 搜索 Roam... > 搜索到 Roam 的详细信息... 🔍 搜索 语雀... > 搜索到 语雀 的详细信息... ✅ 信息搜集完成,共搜集了 4 个产品 📋 第 2 步:分析师进行对比... ---------------------------------------- > 从功能完整性、用户体验、定价等维度进行对比分析... ✅ 分析完成 📋 第 3 步:写作者撰写报告... ---------------------------------------- > 整理分析结果,撰写结构化报告... ✅ 报告撰写完成 ============================================================ 📄 最终报告 ============================================================ # 笔记工具竞品分析报告 ## 摘要 本报告对 Notion、Obsidian、Roam Research、语雀四款主流笔记工具进行了全面对比分析... ## 产品概览 | 产品 | 定价 | 核心特色 | 目标用户 | |------|------|---------|---------| | Notion | 免费/$8/月 | All-in-one 工作空间 | 团队协作 | | Obsidian | 免费/$4/月 | 本地优先、知识图谱 | 个人知识管理 | | Roam | $15/月 | 大纲式、块引用 | 研究者 | | 语雀 | 免费/¥99/年 | 中文友好 | 中文团队 | ## 详细对比分析 ...五、关键设计思路
1. 职责单一
每个 Agent 只负责一件事:
搜索员:只管搜信息,不管分析 分析师:只管分析,不管搜也不管写 写作者:只管写报告,不管其他好处:每个 Agent 的提示词更聚焦,输出质量更高。
2. 信息传递
Agent 之间通过文本传递信息:
搜索员输出 → 原始信息文本 → 分析师输入 分析师输出 → 分析结论文本 → 写作者输入简单但有效。更复杂的方案可以用共享内存或消息队列。
3. 串行执行
这个例子是流水线模式:搜索 → 分析 → 写作,有先后顺序。
如果任务可以并行,可以让多个搜索 Agent 同时搜索不同产品,效率更高。
六、进阶:让 Agent 之间对话
除了串行传递,还可以让 Agent 之间互相讨论:
defdebate(topic:str,rounds:int=3):"""让两个 Agent 就某个话题辩论"""llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7)# 正方pro_prompt=ChatPromptTemplate.from_messages([("system","你是正方辩手,支持以下观点。用简洁有力的论据论证。每次发言不超过100字。"),("human","{input}"),])# 反方con_prompt=ChatPromptTemplate.from_messages([("system","你是反方辩手,反对以下观点。用简洁有力的论据反驳。每次发言不超过100字。"),("human","{input}"),])pro_chain=pro_prompt|llm con_chain=con_prompt|llm# 辩论过程history=[]current_topic=topicforiinrange(rounds):print(f"\n--- 第{i+1}轮辩论 ---")# 正方发言pro_result=pro_chain.invoke({"input":current_topic})print(f"🔴 正方:{pro_result.content}")history.append(f"正方:{pro_result.content}")# 反方反驳con_result=con_chain.invoke({"input":f"对方说:{pro_result.content}\n请反驳。"})print(f"🔵 反方:{con_result.content}")history.append(f"反方:{con_result.content}")current_topic=con_result.content# 总结summary_prompt=ChatPromptTemplate.from_messages([("system","你是评委,根据双方辩论内容,给出客观总结和最终判断。"),("human","{input}"),])summary_chain=summary_prompt|llm summary=summary_chain.invoke({"input":"\n".join(history)})print(f"\n📋 评委总结:{summary.content}")# 测试debate("Notion 和 Obsidian 哪个更适合个人知识管理?")七、总结
| 概念 | 说明 |
|---|---|
| 为什么需要多 Agent | 单个 Agent 处理复杂任务效率低、质量差 |
| 三种架构 | 层级(Manager-Worker)、对等(Peer-to-Peer)、流水线(Pipeline) |
| 核心设计原则 | 职责单一、信息通过文本传递、按需选择串行或并行 |
| 进阶玩法 | Agent 之间辩论、投票、互相审核 |
多 Agent 是 Agent 技术从"玩具"走向"生产"的关键一步。
下一篇预告
📖第 9 篇:实战:用 Agent 搭建一个个人知识库
把你所有的笔记、文档、收藏都交给 Agent 管理,问什么它都能找到并回答。下一篇我们实战搭建一个完整的个人知识库系统。
👉 关注我,不迷路!
如果觉得有帮助,点个赞 👍 收藏 ⭐ 支持一下,是我持续更新的动力!