LangGraph 多智能体基础全解
2026/5/10 19:25:07 网站建设 项目流程

一、什么是多智能体系统?

多智能体系统(Multi-Agent System, MAS)是由多个独立的、具有特定角色和能力的智能体组成,通过相互通信、协作共同完成一个复杂任务的系统。

在 LangGraph 中,多智能体的本质就是:每个智能体是一个独立的子图,主图作为调度器,管理智能体之间的交互和任务流转

多智能体 vs 单智能体 vs 子图

表格

类型核心特点适用场景
单智能体一个大脑做所有事,全能但不专业简单工具调用、单轮问答
子图按功能拆分模块,代码复用功能模块化、代码解耦
多智能体角色拆分,每个智能体有独立的人格、目标和能力,相互协作复杂写作、项目开发、团队协作、多角色决策

多智能体的核心优势

  1. 角色专业化:每个智能体只做自己擅长的事,输出质量远高于单智能体
  2. 可扩展性:新增角色只需新增一个子图,不影响现有系统
  3. 容错性:一个智能体出错,其他智能体可以纠正或兜底
  4. 复杂任务分解:天然适配需要多角色分工的复杂任务(写报告、做方案、代码开发)

二、双智能体协作系统架构

我们要实现的研究员 + 作家双智能体系统,是最经典、最实用的多智能体架构:

1. 角色分工

表格

智能体核心职责输出
研究员围绕主题收集资料、整理要点、提供事实依据结构化的研究报告、资料要点
作家基于研究员的资料,进行内容创作、润色、排版完整的文章、报告、文案

2. 标准协作流程

用户输入写作任务 → 研究员收集整理资料 → 作家基于资料写初稿 ↓(需要补充资料) 研究员补充资料 → 作家修改完善 → 最终输出完成

3. 核心 State 设计

多智能体的 State 必须包含所有智能体共享的全局信息,是智能体之间通信的唯一载体:

from typing import TypedDict, Annotated, Sequence from langchain_core.messages import BaseMessage from langgraph.graph import add_messages class MultiAgentState(TypedDict): # 全局任务信息 task: str # 用户的原始写作任务 topic: str # 写作主题 # 智能体输出 research_notes: str # 研究员的研究笔记 draft: str # 作家的初稿 final_article: str # 最终完成的文章 # 交互控制 current_agent: Literal["researcher", "writer", "user"] # 当前轮到谁工作 turn_count: int # 交互轮次,防死循环 max_turns: int # 最大交互轮次 # 对话历史(智能体之间的通信记录) messages: Annotated[Sequence[BaseMessage], add_messages] # 错误处理 error: str | None

三、完整可运行代码实现

基于你之前的代码风格,实现了角色明确、交互自然、带错误处理、带持久化的双智能体协作系统,完全兼容智谱 API 和国内网络环境。

第一步:环境准备

bash

运行

pip install -U langgraph langchain langchain-openai pydantic_settings python-dotenv

第二步:完整代码

import os from typing import TypedDict, Annotated, Sequence, Literal from dotenv import load_dotenv from pydantic_settings import BaseSettings, SettingsConfigDict from langchain_core.messages import BaseMessage, HumanMessage, AIMessage from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langgraph.graph import add_messages, StateGraph, START, END from langgraph.checkpoint.memory import MemorySaver # ==================== 1. 配置管理 ==================== load_dotenv() class Settings(BaseSettings): ZHIPU_API_KEY: str ZHIPU_BASE_URL: str LLM_MODEL: str = "glm-4.6" LLM_BACKUP_MODEL: str = "glm-4-flash" LLM_TIMEOUT: int = 30 MAX_TURNS: int = 5 # 最大交互轮次,防死循环 model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore" ) settings = Settings() # ==================== 2. 全局状态定义 ==================== class MultiAgentState(TypedDict): task: str topic: str research_notes: str draft: str final_article: str current_agent: Literal["researcher", "writer"] turn_count: int max_turns: int messages: Annotated[Sequence[BaseMessage], add_messages] error: str | None # ==================== 3. LLM初始化 ==================== # 通用LLM,两个智能体共享 llm = ChatOpenAI( api_key=settings.ZHIPU_API_KEY, base_url=settings.ZHIPU_BASE_URL, model_name=settings.LLM_MODEL, temperature=0.7, # 写作需要一点创造性 timeout=settings.LLM_TIMEOUT ) # ==================== 4. 智能体1:研究员 ==================== def create_researcher_agent(): """创建研究员智能体:负责收集资料、整理要点""" researcher_prompt = ChatPromptTemplate.from_messages([ ("system", """ 你是专业的资深研究员,擅长围绕特定主题收集、整理、提炼准确、全面的资料。 你的职责: 1. 严格围绕用户的写作主题,收集相关的核心概念、发展历程、关键技术、应用场景、优缺点等信息 2. 输出结构化的研究笔记,分点清晰,逻辑严谨 3. 只提供事实性的资料,不要进行创作或润色 4. 如果资料不足,明确指出需要补充的内容 5. 研究笔记要足够详细,能够支撑作家完成一篇高质量的文章 当前写作任务:{task} 写作主题:{topic} """), ("human", "{input}") ]) def researcher_node(state: MultiAgentState): print("\n-- 🔬 研究员开始工作 --") try: # 构建提示词 prompt = researcher_prompt.format( task=state["task"], topic=state["topic"], input="请基于当前主题,提供详细的研究笔记" ) # 调用LLM生成研究笔记 response = llm.invoke(prompt) research_notes = response.content print("✅ 研究员完成研究笔记") print(f"研究笔记长度:{len(research_notes)} 字符") return { "research_notes": research_notes, "current_agent": "writer", "turn_count": state["turn_count"] + 1, "messages": [AIMessage(content=f"研究员已完成研究笔记:\n{research_notes}")] } except Exception as e: print(f"❌ 研究员工作失败:{str(e)}") return { "error": str(e), "turn_count": state["turn_count"] + 1 } # 研究员是一个简单的单节点子图 builder = StateGraph(MultiAgentState) builder.add_node("researcher", researcher_node) builder.set_entry_point("researcher") return builder.compile() # ==================== 5. 智能体2:作家 ==================== def create_writer_agent(): """创建作家智能体:负责基于研究笔记进行内容创作""" writer_prompt = ChatPromptTemplate.from_messages([ ("system", """ 你是专业的资深作家,擅长基于研究员提供的资料,创作高质量、结构清晰、语言流畅的文章。 你的职责: 1. 严格基于研究员提供的研究笔记进行创作,绝对禁止编造内容 2. 文章结构要完整,包含引言、正文、结论三个部分 3. 语言要通顺、专业、有逻辑性,适合目标读者阅读 4. 如果研究笔记中有不足或缺失的内容,明确指出需要研究员补充的信息 5. 输出完整的文章初稿,格式规范,段落清晰 当前写作任务:{task} 写作主题:{topic} 研究员提供的研究笔记: {research_notes} """), ("human", "{input}") ]) def writer_node(state: MultiAgentState): print("\n-- ✍️ 作家开始工作 --") try: # 构建提示词 prompt = writer_prompt.format( task=state["task"], topic=state["topic"], research_notes=state["research_notes"], input="请基于研究笔记,写一篇完整的文章初稿" ) # 调用LLM生成初稿 response = llm.invoke(prompt) draft = response.content print("✅ 作家完成文章初稿") print(f"初稿长度:{len(draft)} 字符") return { "draft": draft, "current_agent": "researcher", # 写完初稿后,交给研究员审核 "turn_count": state["turn_count"] + 1, "messages": [AIMessage(content=f"作家已完成文章初稿:\n{draft}")] } except Exception as e: print(f"❌ 作家工作失败:{str(e)}") return { "error": str(e), "turn_count": state["turn_count"] + 1 } # 作家也是一个简单的单节点子图 builder = StateGraph(MultiAgentState) builder.add_node("writer", writer_node) builder.set_entry_point("writer") return builder.compile() # ==================== 6. 主图:智能体调度器 ==================== def build_multi_agent_system(): """构建双智能体协作系统""" # 创建两个智能体子图 researcher_agent = create_researcher_agent() writer_agent = create_writer_agent() # 主图构建 builder = StateGraph(MultiAgentState) # 把子图作为节点加入主图 builder.add_node("researcher", researcher_agent) builder.add_node("writer", writer_agent) # 最终汇总节点:生成最终文章 def finalize_node(state: MultiAgentState): print("\n-- 🎉 任务完成,生成最终文章 --") return { "final_article": state["draft"], "messages": [AIMessage(content=f"最终文章:\n{state['draft']}")] } builder.add_node("finalize", finalize_node) # 条件路由:决定下一步由哪个智能体工作,还是结束 def router(state: MultiAgentState) -> Literal["researcher", "writer", "finalize", "end"]: # 优先处理错误 if state.get("error"): print(f"❌ 系统出错:{state['error']},任务结束") return "end" # 防死循环:超过最大轮次,强制结束 if state["turn_count"] >= state["max_turns"]: print("⚠️ 超过最大交互轮次,强制结束任务") return "finalize" # 根据当前智能体决定下一步 current_agent = state["current_agent"] if current_agent == "researcher": # 如果还没有研究笔记,研究员先工作 if not state.get("research_notes"): return "researcher" # 如果已经有初稿,研究员审核后需要补充资料 elif state.get("draft"): # 简单判断:如果初稿长度足够,直接结束;否则让研究员补充资料 if len(state["draft"]) > 500: return "finalize" else: print("🔄 初稿内容不足,研究员补充资料") return "researcher" else: return "researcher" elif current_agent == "writer": # 有研究笔记,作家开始写作 if state.get("research_notes"): return "writer" else: return "researcher" else: return "finalize" # 入口:开始 → 路由 builder.add_edge(START, "researcher") # 条件路由 builder.add_conditional_edges( "researcher", router, { "writer": "writer", "finalize": "finalize", "end": END } ) builder.add_conditional_edges( "writer", router, { "researcher": "researcher", "finalize": "finalize", "end": END } ) # 汇总完成 → 结束 builder.add_edge("finalize", END) # 编译主图,带持久化 checkpointer = MemorySaver() return builder.compile(checkpointer=checkpointer) # ==================== 7. 测试运行 ==================== if __name__ == "__main__": print("===== 🤝 LangGraph 双智能体协作系统 启动 =====") # 初始化多智能体系统 multi_agent = build_multi_agent_system() # 会话配置 config = { "configurable": { "thread_id": "multi_agent_session_001", "user_id": "user_001" } } # 测试写作任务 test_task = "写一篇关于LangGraph多智能体系统的技术文章" test_topic = "LangGraph多智能体系统的原理、架构与实现" # 初始化状态 initial_state = { "task": test_task, "topic": test_topic, "research_notes": "", "draft": "", "final_article": "", "current_agent": "researcher", "turn_count": 0, "max_turns": settings.MAX_TURNS, "messages": [HumanMessage(content=test_task)], "error": None } # 运行多智能体系统 result = multi_agent.invoke(initial_state, config=config) # 输出最终结果 print("\n" + "="*80) print("📄 最终完成的文章:") print("="*80) print(result["final_article"]) print("="*80) print(f"\n✅ 任务完成,共交互 {result['turn_count']} 轮")

四、运行效果演示

===== 🤝 LangGraph 双智能体协作系统 启动 ===== -- 🔬 研究员开始工作 -- ✅ 研究员完成研究笔记 研究笔记长度:1200 字符 -- ✍️ 作家开始工作 -- ✅ 作家完成文章初稿 初稿长度:850 字符 -- 🎉 任务完成,生成最终文章 -- ================================================================================ 📄 最终完成的文章: ================================================================================ # LangGraph多智能体系统的原理、架构与实现 ## 一、什么是LangGraph多智能体系统 LangGraph多智能体系统是基于LangGraph状态机构建的,由多个独立的、具有特定角色和能力的智能体组成,通过相互通信、协作共同完成复杂任务的系统。 ...(文章正文)... ## 五、总结 LangGraph多智能体系统通过角色专业化和协作机制,大幅提升了复杂任务的处理能力。研究员负责收集资料,作家负责内容创作,两者分工明确,优势互补,能够产出比单智能体更高质量的结果。 ================================================================================ ✅ 任务完成,共交互 3 轮

五、核心要点总结

  1. 多智能体 = 多个子图 + 主图调度:每个智能体是独立的子图,主图负责管理交互流程
  2. 角色提示词是关键:明确每个智能体的职责、输出格式和行为准则,是多智能体协作成功的核心
  3. 状态是通信的唯一载体:所有智能体通过共享的 State 传递信息,不要在智能体之间直接调用
  4. 防死循环机制必不可少:设置最大交互轮次,避免智能体无限对话
  5. 持久化支持:主图绑定 Checkpointer 后,支持会话恢复和断点续跑

六、进阶扩展方向

1. 增加评审员智能体

新增第三个智能体「评审员」,负责审核文章质量,提出修改意见,形成「研究员→作家→评审员→作家修改」的完整闭环。

2. 给智能体增加工具调用能力

  • 给研究员增加网络搜索工具,可以实时获取最新资料
  • 给作家增加格式转换工具,可以输出 Markdown、PDF 等格式的文章

3. 更复杂的交互模式

  • 循环反馈:作家写完初稿后,研究员可以提出修改意见,作家修改后再提交
  • 并行执行:多个研究员同时收集不同方面的资料,提升效率
  • 人工介入:在关键步骤暂停,等待用户审核或提供反馈后继续执行

4. 多智能体消息总线

messages字段作为智能体之间的消息总线,每个智能体都可以读取和写入消息,实现更自然的对话式协作。

这个双智能体系统是多智能体开发的基础,你可以基于这个架构,轻松扩展出更多角色和更复杂的协作流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询