十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Day 13】一个Agent又搜资料又写报告?拆成三个Agent各干各的

【Day 13】一个Agent又搜资料又写报告?拆成三个Agent各干各的 系列专栏AI Agent 实战Day 13 / 18前置阅读Day 01 从Chatbot到Agent · Day 09 任务规划 · Day 11 自我反思署名梅雅达编程笔记先说结论前面 12 天我们写的 Agent都是一个人全包——又搜资料、又分析、又写报告。任务简单的时候没问题一旦复杂起来提示词越写越长输出越来越不受控。这篇我把一个大任务拆成三段研究员搜资料、分析师出结论、写作者写报告。三个 Agent 各有各的 system prompt前一个的输出直接喂给后一个像流水线一样。用 GLM-4.7-Flash 跑的免费。完整代码在下面复制就能跑。一个Agent全包问题出在哪先看看一个人干所有事的写法长什么样# 传统做法一个Agent包揽所有环节defsingle_agent_pipeline(task):clientLLMClient(providerglm)# 万能提示词又当研究员又当分析师又当写作者super_prompt(你是一个全能助手。你需要完成以下全部工作\n1. 调研相关信息\n2. 分析数据并提炼洞察\n3. 撰写最终报告\n请一步一步完成最后输出完整报告。)# 一次调用指望LLM自己分步骤完成所有工作resultclient.chat(task,system_promptsuper_prompt)returnresult我实际用这种写法跑过几次问题很明显角色混乱一个 prompt 里塞三种身份LLM 容易精神分裂——前一段还在列数据后一段突然开始煽情没法单独重跑所有步骤一次调用中间哪步出了问题只能全盘重来上下文浪费第一步调研来的原始数据又长又杂后面分析的时候这些东西全占着 token反而干扰重点加环节很痛想加一个审校得改整个 prompt重新调试说白了一个人同时干项目经理、程序员和测试不是不行但每样都干不精。真实世界里复杂任务靠的是分工。软件项目有前端后端测试医院有挂号问诊检验药房。多 Agent 也是同一个思路把大任务拆成多个环节每个环节交给一个专门的 Agent前一个的输出作为后一个的输入。三个角色各管一段研究员、分析师、写作者每个角色一个独立的 system prompt研究员Agent 分析师Agent 写作者Agent (调研收集) → (分析洞察) → (生成报告)研究员只负责搜资料、整理事实输出结构化调研结果分析师拿到研究员的材料提炼趋势和洞察不重复原始数据写作者拿到分析师的结论写成面向读者的通俗报告关键点不在多个 Agent这个形式而在每个环节有自己独立的 prompt 和上下文。研究员的 prompt 里只说搜集整理分析师只说提炼洞察写作者只说通俗易读。同一个 LLM 换了 prompt在不同环节就表现出不同的专业人格。对比一下就清楚了维度单Agent分工型多Agent角色定义一个prompt塞所有身份每个Agent一个专属prompt任务执行一次调用全搞定按环节顺序调用错误处理全盘重来可单独重跑某一步上下文管理所有中间结果堆一起每步只传必要输出可扩展性改prompt 推倒重来加一个角色 加一行代码这就是 CrewAI 这些框架的核心思路——用角色定义加任务编排来实现多 Agent 协作。完整代码项目结构Day13_分工型多Agent/ ├── crew_agent.py # 主代码多Agent协作框架 ├── llm_client.py # LLM客户端Day01复用 ├── requirements.txt # 依赖 ├── .env.example # API Key模板 └── .env # 你的实际Key需自建代码代码就三个东西AgentRole 定义角色名字、prompt、擅长领域、可用工具CrewAgent 管协作按顺序分配任务、串联输出角色工厂预设研究员/分析师/写作者三种角色。 crew_agent.py - 分工型多Agent协作框架 多个专业Agent按顺序协作前一个Agent的输出作为后一个的输入 场景研究员 → 分析师 → 写作者 fromllm_clientimportLLMClient# 内置工具 defsearch_web_mock(query):模拟网络搜索内置工具无需外部依赖mock_data{AI Agent市场规模:(根据Gartner报告2026年全球AI Agent市场规模预计达到500亿美元年增长率超过45%。主要驱动力来自企业自动化需求和LLM能力提升。),国产大模型:(截至2026年GLM-5.2、Kimi K3、Qwen3等国产模型在多项基准测试中接近GPT-5水平差距缩小至3个月以内。),Agent框架趋势:(CrewAI、AutoGen、LangGraph等框架已成为主流分工型协作模式在企业落地中占比超过60%。),落地场景:(企业Agent落地TOP3场景客服自动化32%、数据分析24%、内容生成18%。多Agent协作架构在复杂任务中表现优于单Agent。),}# 模糊匹配关键词forkey,valueinmock_data.items():ifkeyinqueryorany(wordinqueryforwordinkey.split()):returnvaluereturnf模拟搜索结果关于「{query}」暂无详细数据建议换关键词重试。defcalculate(expression):计算工具支持基本数学运算try:allowedset(0123456789-*/.() )ifnotall(cinallowedforcinexpression):returnf不支持的运算{expression}resulteval(expression)returnf计算结果{expression}{result}exceptException:returnf无法计算{expression}defwrite_file_tool(filename,content):写文件工具try:withopen(filename,w,encodingutf-8)asf:f.write(content)returnf文件已保存{filename}exceptExceptionase:returnf写入失败{e}defread_file_tool(filename):读文件工具try:withopen(filename,r,encodingutf-8)asf:returnf.read()exceptExceptionase:returnf读取失败{e}# 工具注册表工具名 → 函数TOOL_REGISTRY{search_web:search_web_mock,calculate:calculate,write_file:write_file_tool,read_file:read_file_tool,}# 角色定义 classAgentRole: 定义一个Agent角色 - name: 角色名如研究员 - system_prompt: 系统提示词引导该角色的行为风格 - expertise: 擅长领域描述 - tools: 可用工具名列表 def__init__(self,name,system_prompt,expertise,toolsNone):self.namename# 角色名称self.system_promptsystem_prompt# 系统提示词self.expertiseexpertise# 擅长领域self.toolstoolsor[]# 可用工具列表def__repr__(self):returnfAgentRole(name{self.name}, expertise{self.expertise})# 多Agent协作管理器 classCrewAgent: 分工型多Agent协作管理器 - 管理多个角色Agent - 按顺序分配任务前一个Agent的输出作为后一个的输入 - 最终聚合所有Agent的产出 def__init__(self,llm_clientNone):self.roles[]# 角色列表self.llmllm_clientorLLMClient(providerglm)self.execution_log[]# 执行日志defadd_role(self,role):添加一个角色Agent到团队self.roles.append(role)print(f ✅ 已加入角色{role.name}{role.expertise})returnself# 支持链式调用defrun(self,task): 执行多Agent协作流程 任务依次传递给每个角色前一个的输出作为后一个的输入 参数task - 初始任务描述字符串 返回dict包含 final_output 和 execution_log print(f\n{*60})print(f CrewAgent 启动共{len(self.roles)}个角色)print(f 初始任务{task[:80]}...)print(f{*60}\n)current_inputtask# 前一个Agent的输出 → 后一个Agent的输入fori,roleinenumerate(self.roles,1):print(f--- 步骤{i}/{len(self.roles)}{role.name}工作中 ---)# 构建给当前角色的指令instructionself._build_instruction(role,current_input,is_first(i1))# 调用LLM使用该角色专属的系统提示词responseself.llm.chat(messageinstruction,system_promptrole.system_prompt,temperature0.7,)# 记录执行日志截取前200字避免日志过长log_entry{step:i,role:role.name,input:current_input[:200]...iflen(current_input)200elsecurrent_input,output:response[:200]...iflen(response)200elseresponse,}self.execution_log.append(log_entry)print(f {role.name}产出{response[:100]}...\n)# 当前输出 → 下一个Agent的输入current_inputresponseprint(f{*60})print(f✅ 全部{len(self.roles)}个角色已完成协作)print(f{*60}\n)return{final_output:current_input,# 最终输出execution_log:self.execution_log,}def_build_instruction(self,role,input_data,is_firstFalse):构建给当前角色的指令文本ifis_first:# 第一个角色直接接收原始任务returnf请根据你的专长处理以下任务\n\n{input_data}else:# 后续角色接收前一个角色的产出return(f前一个环节的产出如下请基于此继续你的工作\n\nf{input_data}\n\nf请结合你的专长完成你负责的环节。)defprint_log(self):打印完整执行日志print(f\n 执行日志共{len(self.execution_log)}步)print(-*50)forentryinself.execution_log:print(f 步骤{entry[step]}|{entry[role]})print(f 输入:{entry[input][:80]}...)print(f 输出:{entry[output][:80]}...)print(-*50)# 角色工厂预设三种专业角色 defcreate_researcher():创建研究员角色负责信息调研与数据收集returnAgentRole(name研究员,expertise信息调研与收集,tools[search_web,read_file],system_prompt(你是一名专业研究员擅长信息调研与数据收集。你的任务是根据给定主题进行全面的信息搜集和整理。请输出结构化的调研结果包含关键发现、数据要点和信息来源说明。输出格式用「## 调研结果」开头分点列出关键发现每条附简短说明。),)defcreate_analyst():创建分析师角色负责数据分析与洞察提炼returnAgentRole(name分析师,expertise数据分析与洞察提炼,tools[calculate,search_web],system_prompt(你是一名资深分析师擅长从原始数据中提炼洞察。你的任务是对研究员收集的信息进行深入分析找出趋势、风险和机会给出专业判断。输出格式用「## 分析报告」开头包含核心洞察、趋势分析和行动建议。),)defcreate_writer():创建写作者角色负责报告撰写与内容整合returnAgentRole(name写作者,expertise报告撰写与内容整合,tools[write_file,read_file],system_prompt(你是一名专业写作者擅长将复杂信息转化为清晰易读的报告。你的任务是基于分析师的结论撰写一份面向非技术读者的总结报告。报告应包含背景概述、核心发现、行动建议三部分。输出格式用「# 最终报告」开头结构清晰语言通俗控制在500字以内。),)# 演示入口 defdemo():演示分工型多Agent协作——AI Agent行业调研报告print(*60)print( 分工型多Agent协作 Demo)print( 场景AI Agent行业趋势调研报告)print( 角色研究员 → 分析师 → 写作者)print(*60)# 1. 创建LLM客户端使用GLM-4.7-Flash永久免费print(\n 初始化 LLM 客户端...)llmLLMClient(providerglm)print(f 模型{llm.model})# 2. 创建CrewAgent并添加角色链式调用print(\n 组建团队...)crewCrewAgent(llm_clientllm)crew.add_role(create_researcher())\.add_role(create_analyst())\.add_role(create_writer())# 3. 执行协作任务task(请调研2026年AI Agent行业的发展趋势包括市场规模、技术方向、主流框架和落地场景。)resultcrew.run(task)# 4. 输出最终报告print(*60)print( 最终报告)print(*60)print(result[final_output])# 5. 打印执行日志crew.print_log()returnresultif__name____main__:demo()代码里最核心的就三件事1. 角色定义AgentRole每个角色四个要素名字、系统提示词、擅长领域、可用工具。系统提示词是灵魂——研究员的 prompt 强调搜集整理分析师的强调提炼洞察写作者的强调通俗易读。不同 prompt 让同一个 LLM 在不同环节表现出不同的专业人格。2. 任务分配CrewAgent.run核心逻辑就一个循环遍历所有角色每个角色处理current_input输出赋值回current_input传给下一个。流水线模式简单但有效。3. 结果聚合execution_log每一步的输入输出都记在execution_log里事后审计哪一步出了问题很方便。最终返回final_output最后一个角色的产出和完整执行日志。跑起来看看pipinstall-rrequirements.txtcp.env.example .env# 填入你的 GLM_API_KEYpython crew_agent.py我实际跑了一遍三个角色依次工作前一个的输出自动喂给后一个。中间还碰到了几次 GLM 的 429 限流免费模型访问量大很正常脚本里自带了重试等 1.5 秒自动重试就过了不用管。这是运行过程的截图最终报告长这样能看出来每一步都在做减法——研究员给的是原始素材分析师压缩成洞察结论写作者最终输出通俗简报。原始数据不进分析环节分析过程不进最终报告。这就是上下文隔离的价值。成本3次调用0元项目说明模型GLM-4.7-Flash智谱AI永久免费单次协作调用次数3次每个角色1次LLM调用预估Token消耗约 3000-5000 tokens/次费用0 元多 Agent 比单 Agent 多了 LLM 调用次数本例从 1 次变 3 次但 GLM-4.7-Flash 永久免费调用多少次花费都是零。这也是本系列一直推荐它的原因——免费额度让你可以放心折腾多 Agent 架构不用担心账单。提醒一句如果换成 DeepSeek、Qwen 这类收费模型多 Agent 的调用成本会成倍增加。3 个 Agent 就是 3 倍费用10 个就是 10 倍。学习阶段免费模型是试多 Agent 最划算的选择。可以自己动手改的三个方向1. 加质量投票。现在流水线是单向的写作者产出的报告直接当最终结果。可以加一个审校Agent对报告打分低于阈值退回写作者重写。改run()方法加循环判断和重试逻辑就行。2. 角色动态增减。现在角色在run()之前就固定了。可以改成根据任务复杂度决定——简单任务只用研究员写作者复杂任务再加分析师和审校。让 CrewAgent 先让 LLM 评估任务再决定启用哪些角色。3. 并行调研。现在是纯链式A→B→C但有些环节可以并行。比如研究员同时调研技术方向和市场数据两个子主题最后合并给分析师。用concurrent.futures.ThreadPoolExecutor注意合并结果的逻辑。参考资料资源链接GLM-4.7-Flash 免费申请智谱 AI 开放平台官网注册控制台申请CrewAI 官方文档分工型协作参考搜 “CrewAI” 进官网文档区AutoGen 多Agent框架搜 “微软 AutoGen” 进 GitHub 主页LangGraph 多Agent编排h搜 “LangChain 官方文档” 找 LangGraph本系列 Day 01 Agent骨架从Chatbot到Agent本系列 Day 09 任务规划让Agent学会拆解任务本系列 Day 11 自我反思让Agent学会纠错下一篇Day 14讲对话型多Agent多个 Agent 像开会一样讨论问题互相提问、互相质疑最后达成共识。本篇的分工是写死的流水线下一篇的任务拆解方式就要靠 Agent 自己动态决策了。署名梅雅达编程笔记
返回列表