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

资讯详情

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

多智能体 Multi-Agent 全解析:从原理到代码实战

多智能体 Multi-Agent 全解析:从原理到代码实战 1. 引言随着大语言模型LLM能力的爆发式增长单一大模型已经难以满足复杂任务的需求。一个模型再强也难以同时胜任「规划、执行、审查、反思」等角色。多智能体Multi-Agent系统应运而生——它将复杂任务拆解给多个由 LLM 驱动的智能体让它们分工协作、彼此对话、互相校验最终产出远超单体模型的质量。本文将从零开始系统讲解多智能体的核心概念并通过LangGraph、AutoGen、CrewAI三大主流框架的完整代码实战带你真正跑通多智能体应用。所有代码均可复制运行建议读者跟随实操一遍。2. 什么是 Multi-Agent2.1 核心定义**Multi-Agent SystemMAS多智能体系统**是指由多个具备自主决策能力的智能体Agent组成的系统。每个智能体通常由「LLM 角色设定 工具 记忆」构成它们之间通过消息传递、任务委派、结果审查等方式协同共同完成一个复杂目标。2.2 单体 Agent vs 多 Agent维度单体 Agent多 Agent角色一个模型包办所有每个 Agent 专注单一角色上下文单一提示词易超长分布式上下文各自聚焦纠错能力依赖自我反思Agent 之间交叉审查任务适配适合简单线性任务适合复杂、多阶段任务成本与延迟较低更高但产出质量更优2.3 多智能体协作的三种典型拓扑动态对话Agent AAgent BAgent C并行分工任务拆解者Agent AAgent BAgent C汇总者串行流水线需求分析师架构师编码者审查者3. 主流框架对比在 20252026 年的工程实践中三个框架占据了主流地位3.1 LangGraph定位图结构编排引擎基于 LangChain 生态。核心思想把多智能体协作建模为「状态图StateGraph」节点是 Agent 或工具边是控制流。优势可控性极强支持人机协同Human-in-the-Loop、断点恢复、流式输出。适用场景需要精细控制流程、生产级部署、复杂状态管理的场景。3.2 AutoGen微软定位对话驱动的多智能体框架。核心思想多个 AgentAssistantAgent、UserProxyAgent 等通过多轮对话协同人类可随时介入。优势上手极快天然支持「人类审批」模式适合快速原型与代码生成协作。适用场景代码生成与调试、对话式协作、需要人类在环的场景。3.3 CrewAI定位角色驱动的团队协作框架。核心思想像组建公司团队一样定义「角色、目标、背景故事」通过 Task 串联流程。优势抽象最优雅、代码最直观学习成本低。适用场景内容生产流水线、研究分析、多角色任务编排。4. 环境准备建议使用 Python 3.10并准备一个可用的 LLM API Key本文以 OpenAI 兼容接口为例。先创建虚拟环境并安装依赖python-mvenv venv# Windowsvenv\Scripts\activate# macOS / Linuxsourcevenv/bin/activate pipinstalllanggraph langchain-openai autogen-agentchat autogen-ext[openai]crewai pipinstallpython-dotenv在项目根目录创建.env文件OPENAI_API_KEYsk-xxxxOPENAI_BASE_URLhttps://api.openai.com/v1编写统一的模型配置模块config.py三个框架共用importosfromdotenvimportload_dotenv load_dotenv()LLM_CONFIG{api_key:os.getenv(OPENAI_API_KEY),base_url:os.getenv(OPENAI_BASE_URL,https://api.openai.com/v1),model:gpt-4o-mini,temperature:0.2,}5. 代码实战一LangGraph 实现「需求分析 → 方案设计 → 代码生成 → 代码审查」流水线本实战将构建一条四节点流水线让四个角色各司其职状态在图中流转最终产出高质量代码。5.1 完整代码新建langgraph_multi_agent.pyfromtypingimportAnnotated,TypedDictfromlanggraph.graphimportStateGraph,ENDfromlangchain_openaiimportChatOpenAIfromconfigimportLLM_CONFIG# ---------- 1. 定义全局状态 ----------classPipelineState(TypedDict):task:str# 用户原始任务requirement:str# 需求分析结果design:str# 方案设计结果code:str# 代码生成结果review:str# 代码审查结果final_code:str# 最终交付代码# ---------- 2. 初始化 LLM ----------llmChatOpenAI(modelLLM_CONFIG[model],api_keyLLM_CONFIG[api_key],base_urlLLM_CONFIG[base_url],temperatureLLM_CONFIG[temperature],)# ---------- 3. 四个 Agent 节点 ----------defrequirement_agent(state:PipelineState)-dict:需求分析师把模糊任务转成精确需求promptf你是一名资深需求分析师。 请把下面的用户任务拆解成清晰、可执行的需求清单 包括功能点、输入输出、边界条件。 用户任务{state[task]}respllm.invoke(prompt)return{requirement:resp.content}defdesign_agent(state:PipelineState)-dict:架构师基于需求设计技术方案promptf你是一名软件架构师。 请基于需求分析给出技术方案设计 - 选择技术栈并说明理由 - 模块划分与职责 - 关键接口设计函数签名 - 数据结构设计 需求分析{state[requirement]}respllm.invoke(prompt)return{design:resp.content}defcoding_agent(state:PipelineState)-dict:编码者按方案编写完整代码promptf你是一名严谨的软件工程师。 请严格按照技术方案编写完整、可运行、带注释的代码。 只输出代码不要多余解释。 技术方案{state[design]}respllm.invoke(prompt)return{code:resp.content}defreview_agent(state:PipelineState)-dict:审查者审查代码并给出修改后的最终版本promptf你是一名严格的代码审查专家。 请审查下面的代码指出问题并直接输出修复后的最终完整代码。 只输出最终代码。 代码{state[code]}respllm.invoke(prompt)return{review:resp.content,final_code:resp.content}# ---------- 4. 构建图 ----------graphStateGraph(PipelineState)graph.add_node(requirement_agent,requirement_agent)graph.add_node(design_agent,design_agent)graph.add_node(coding_agent,coding_agent)graph.add_node(review_agent,review_agent)# 串联边形成流水线graph.set_entry_point(requirement_agent)graph.add_edge(requirement_agent,design_agent)graph.add_edge(design_agent,coding_agent)graph.add_edge(coding_agent,review_agent)graph.add_edge(review_agent,END)appgraph.compile()# ---------- 5. 运行 ----------if__name____main__:user_task用 Python 实现一个带缓存的日志分析工具支持按关键字过滤并统计出现次数resultapp.invoke({task:user_task})print( 需求分析 )print(result[requirement])print(\n 技术方案 )print(result[design])print(\n 审查后最终代码 )print(result[final_code])5.2 运行与解读python langgraph_multi_agent.py运行后可以看到四个阶段的输出依次打印。关键点状态在节点间自动传递并累积每个 Agent 只关注自己的输入输出无需关心上下游细节。这正是 StateGraph 的核心价值——把「协作流程」显式建模为图天然支持调试、断点与可视化。5.3 进阶加入条件路由当编码结果需要「审查通过才结束、否则打回重写」时只需改造图结构defroute_after_review(state:PipelineState)-str:根据审查结果决定是否打回重写if问题instate[review]or错误instate[review]:returncoding_agent# 打回重写returnENDgraph.add_conditional_edges(review_agent,route_after_review,{coding_agent:coding_agent,END:END},)这样便实现了带反馈循环的多智能体而不是单向流水线。6. 代码实战二AutoGen 实现「程序员 审查员」双向对话AutoGen 的核心是「对话即协作」。本实战中程序员写代码审查员提意见两者多轮对话直到审查通过。新建autogen_multi_agent.pyimportasynciofromautogen_agentchat.agentsimportAssistantAgentfromautogen_agentchat.teamsimportRoundRobinGroupChatfromautogen_agentchat.conditionsimportTextMentionTerminationfromautogen_ext.models.openaiimportOpenAIChatCompletionClientfromconfigimportLLM_CONFIGasyncdefmain():# ---------- 1. 统一模型客户端 ----------model_clientOpenAIChatCompletionClient(modelLLM_CONFIG[model],api_keyLLM_CONFIG[api_key],base_urlLLM_CONFIG[base_url],)# ---------- 2. 两个智能体 ----------coderAssistantAgent(namecoder,system_message(你是一名资深 Python 工程师。根据用户需求编写完整、可运行的代码。收到审查意见后必须认真修改并重新输出完整代码。),model_clientmodel_client,)reviewerAssistantAgent(namereviewer,system_message(你是一名严格但友善的代码审查员。审查 coder 的代码指出可读性、性能、边界处理问题。如果代码已足够好只回复APPROVE),model_clientmodel_client,)# ---------- 3. 终止条件审查员说出 APPROVE 即停止 ----------terminationTextMentionTermination(APPROVE)# ---------- 4. 组建对话团队 ----------teamRoundRobinGroupChat(participants[coder,reviewer],termination_conditiontermination,max_turns10,)# ---------- 5. 启动任务 ----------task编写一个 Python 装饰器用于统计函数执行耗时要求线程安全并支持自定义日志级别。print( 任务开始,task)asyncformessageinteam.run_stream(tasktask):ifhasattr(message,source)andhasattr(message,content):print(f\n[{message.source}]:\n{message.content}\n{-*60})awaitmodel_client.close()if__name____main__:asyncio.run(main())6.1 运行与解读python autogen_multi_agent.py你会看到 coder 先输出代码reviewer 提出意见coder 修改reviewer 再审查……直到 reviewer 输出APPROVE对话自动终止。TextMentionTermination是 AutoGen 的灵魂之一用自然语言文本作为终止信号比硬编码轮数更贴近真实协作。7. 代码实战三CrewAI 组建「市场研究团队」CrewAI 以「角色 目标 背景故事」的抽象著称。本实战组建三人小队完成一份竞品调研报告。新建crewai_multi_agent.pyfromcrewaiimportAgent,Task,Crew,Processfromlangchain_openaiimportChatOpenAIfromconfigimportLLM_CONFIG# ---------- 1. 统一 LLM ----------llmChatOpenAI(modelLLM_CONFIG[model],api_keyLLM_CONFIG[api_key],base_urlLLM_CONFIG[base_url],temperature0.3,)# ---------- 2. 定义三个角色 ----------researcherAgent(role市场研究员,goal收集目标产品的竞品情报功能、定价、用户口碑、市场定位,backstory(你在市场调研领域深耕十年擅长从公开信息中提炼关键竞争要素和数据支撑的结论。),llmllm,verboseTrue,)analystAgent(role战略分析师,goal基于调研数据产出 SWOT 分析和差异化机会点建议,backstory(你是顶级咨询公司出身擅长把杂乱数据转化为可执行的商业洞察。),llmllm,verboseTrue,)writerAgent(role报告撰写人,goal将分析与建议整合成结构清晰、结论明确的调研报告,backstory(你文笔简洁有力擅长用 Markdown 结构表达复杂观点让决策者一目了然。),llmllm,verboseTrue,)# ---------- 3. 定义任务 ----------task_researchTask(description(调研「Notion」的三大竞品如飞书文档、语雀、Confluence输出功能对比表与核心差异分析。),agentresearcher,expected_output一份包含功能对比表的调研数据摘要,)task_analysisTask(description基于调研数据为 Notion 提出 SWOT 分析与 3 条差异化机会建议。,agentanalyst,expected_outputSWOT 分析与机会建议,context[task_research],# 关键依赖上一个任务输出)task_writingTask(description把分析与建议整合为 Markdown 格式的完整调研报告。,agentwriter,expected_output完整 Markdown 调研报告,context[task_research,task_analysis],)# ---------- 4. 组建团队并执行 ----------crewCrew(agents[researcher,analyst,writer],tasks[task_research,task_analysis,task_writing],processProcess.sequential,# 顺序执行verboseTrue,)if__name____main__:resultcrew.kickoff()print(\n 最终报告 \n)print(result)7.1 运行与解读python crewai_multi_agent.pyCrewAI 的context[task_research]是任务间依赖的关键analyst 的输入自动带上 upstream 任务的输出避免了手工拼接上下文的繁琐。Process.sequential表示顺序流程也可改为Process.hierarchical让一个「管理者 Agent」自动拆解和分派任务。8. 多智能体设计的 6 个关键模式8.1 流水线Pipeline任务线性传递每个 Agent 只做一件事后再交给下一个。优点简单可控缺点上游错误无法及时纠正。8.2 辩论Debate多个 Agent 就同一问题给出方案互相质疑最终由裁判 Agent 或投票得出结果。适合决策质量要求极高的场景如代码评审、方案选型。8.3 层级管理Hierarchical一个管理者 Agent 负责拆解任务、分派给执行 Agent、审查结果。类似现实中的团队管理适合任务不确定、需动态拆解的场景。8.4 轮转对话Round-Robin所有 Agent 围坐一圈按顺序发言或按规则响应直到满足终止条件。AutoGen 的 RoundRobinGroupChat 即此模式。8.5 反馈循环Feedback Loop审查节点发现问题时把任务打回上游重做形成闭环。LangGraph 的条件路由可以优雅实现。8.6 并行分工Map-Reduce管理者把任务拆成多个子任务并行派发给多个 Agent最后汇总。适合大文本处理、多维调研等可分解任务。9. 工程化最佳实践9.1 状态管理让每个 Agent 无状态把共享状态外置如 LangGraph 的 State、数据库、RedisAgent 只从状态读取输入、写回输出避免在提示词中堆砌历史对话导致上下文爆炸。9.2 工具增强给 Agent 装上手脚多智能体的强大不仅来自对话更来自「工具调用」。让编码 Agent 能执行代码、让研究员能搜索网页、让分析师能读数据库才能真正落地。以 LangGraph 为例fromlanggraph.prebuiltimportcreate_react_agent tools[search_tool,calculator_tool]researcher_graphcreate_react_agent(llm,tools)9.3 上下文隔离按角色裁剪信息不要让每个 Agent 都看到全量数据。需求分析师看用户原始需求编码者只看技术方案审查者只看代码——按需传递既省 Token 又减少幻觉。9.4 人机协同Human-in-the-Loop关键节点引入人工确认。例如 AutoGen 的UserProxyAgent可以在执行前征求人类同意LangGraph 的interrupt可以在节点执行前暂停并等待人工操作。这在生产环境是安全底线。9.5 成本控制不同角色用不同模型简单任务用gpt-4o-mini级别的模型复杂推理用更强模型。设置max_turns/max_iterations防止死循环。对无需实时响应的环节使用批处理或缓存结果。9.6 可观测性多智能体系统的调试难度远高于单 Agent。建议每个 Agent 输出都打印[agent_name]前缀并落盘日志记录每次状态变更便于回放定位LangGraph 可用app.get_graph().draw_mermaid()导出流程图辅助理解。10. 常见问题与避坑指南10.1 Agent 之间「自说自话」某些框架中 Agent 会陷入重复输出的循环。解法明确设置终止条件如TextMentionTermination在系统提示词中强调「收到满足条件的回复后停止」设定硬性max_turns兜底。10.2 上下文越滚越长对话轮次多了历史消息会拖垮推理并推高成本。解法每轮只传递「结论 关键信息」而非完整历史用记忆组件做摘要压缩采用无状态 Agent 外置状态的设计。10.3 多智能体打架结果不稳定多名 Agent 各持己见导致最终输出抖动。解法引入明确的「裁判」或「汇总」Agent 作为最终出口控制温度参数降低随机性关键决策点引入人工确认。10.4 部署复杂排障困难多智能体涉及多节点编排线上问题定位成本高。解法从最简单的流水线开始逐步增加复杂度保留每个节点的输入输出快照优先选择 LangGraph 这类有成熟调试与可视化能力的框架。11. 总结多智能体系统不是「让多个模型聊天」这么简单它的本质是把复杂任务建模为角色、流程与状态的组织问题。本文带你走通了三个主流框架的完整实战LangGraph用「图」精确控制流程适合生产级、需要条件路由的场景AutoGen用「对话」驱动协作适合代码生成、快速原型与人类在环的场景CrewAI用「角色」组织团队适合内容生产、调研分析等业务型场景。选型时记住一句话流程确定选 LangGraph对话协作选 AutoGen角色分工选 CrewAI。下一步建议读者在本文代码基础上做三个延伸练习给 Agent 接入真实工具搜索、代码执行加入人工审批节点把多智能体服务用 FastAPI 包装成 HTTP 接口。当你真正把「Agent 组织」当成一种软件架构来设计多智能体的威力才会完全释放。
返回列表