LangGraph实战:构建多智能体协作系统的图计算框架指南
如果你正在尝试构建一个能够自主协作、完成复杂任务的多智能体系统却发现自己深陷于状态管理混乱、流程编排复杂、智能体间通信困难的泥潭那么这篇文章正是为你准备的。LangGraph 的出现正在彻底改变我们设计和实现多智能体应用的方式。它不是一个简单的库而是一个基于图Graph的编程框架将复杂的多智能体协作逻辑从“面条式”的代码中解放出来变成清晰、可调试、可扩展的声明式蓝图。很多人误以为 LangGraph 只是 LangChain 的一个附属品或者仅仅用于构建简单的聊天机器人。这是一个巨大的误解。LangGraph 的核心价值在于为复杂、有状态、多步骤的智能体工作流提供了标准化的建模和运行范式。它解决了传统多智能体开发中几个最棘手的问题如何优雅地管理智能体间的状态流转如何清晰地定义协作流程如何轻松地实现循环、分支、并行等复杂控制逻辑以及如何让整个系统变得可观测、可调试本文将带你从零开始深入 LangGraph 的核心。我们不会停留在概念层面而是通过一个完整的、可运行的多智能体协作项目实战手把手教你理解 LangGraph 的图计算思想以及它为何比传统脚本式编程更适合多智能体场景。掌握 State、Node、Edge 三大核心组件学会如何用它们定义智能体的记忆、行为和决策路径。构建一个真实的多智能体系统我们将创建一个包含“研究员”、“写手”、“审阅员”的智能写作团队模拟从资料搜集、内容撰写到质量审核的全流程。深入代码细节包括状态设计、工具调用、条件路由以及如何集成不同的 LLM。提供最佳实践和避坑指南帮助你在自己的项目中高效应用 LangGraph。无论你是想探索 AI 智能体前沿的开发者还是正在为业务流程自动化寻找技术方案的工程师这篇文章都将提供一条从理论到实践的清晰路径。建议收藏跟着步骤实操一遍你就能掌握构建下一代多智能体应用的关键技能。1. 为什么你需要关注 LangGraph解决多智能体开发的根本痛点在深入技术细节之前我们必须先回答一个根本问题为什么是 LangGraph现有的 LangChain 和自定义脚本不能实现多智能体吗当然可以但代价很高。传统的实现方式通常面临以下挑战状态管理地狱多个智能体需要共享和修改上下文信息如任务目标、中间结果、历史对话。用普通的字典或类变量来管理随着流程复杂化代码会变得极其混乱且容易出错。谁在什么时候修改了哪个数据很难追踪。流程控制复杂智能体协作往往不是简单的直线流程。它可能包含条件分支如果A结果不好则转向B、循环直到审核通过为止、并行执行多个智能体同时调研。用if-else和while循环硬编码这些逻辑可读性和可维护性会迅速下降。缺乏可视化与可调试性当系统出现预期外的行为时你很难直观地看到“智能体A的输出是如何流到智能体B又触发了哪个条件分支”。调试通常依赖于打印大量日志效率低下。组件复用困难一个好的智能体如一个专业的 SQL 查询器很难被轻松地嵌入到另一个不同的工作流中因为它的输入输出和状态依赖被硬编码在特定的流程里。LangGraph 的解决方案是“图计算”范式。它将整个多智能体系统抽象为一个有向图。节点Node代表一个执行单元可以是一个智能体、一个工具调用或任何函数。边Edge代表节点之间的流转路径决定了执行的下一步是什么。状态State是一个贯穿全图的共享数据结构所有节点都读取和更新它。这种范式带来了几个核心优势声明式编排你用代码“画”出智能体协作的蓝图而不是用指令“写”出执行过程。逻辑一目了然。状态集中管理所有数据流动都通过唯一的State对象来源清晰修改可追溯。内置复杂流控图天然支持循环边指回之前节点、分支根据条件选择不同边、并行多个起始或结束节点实现起来非常优雅。可视化与 introspectionLangGraph 能自动生成你系统的可视化图并且提供了详细的执行追踪Trace调试体验大幅提升。简单来说如果你面对的多智能体任务超过了“一问一答”或“简单链式调用”的范畴涉及到决策、循环、协作那么 LangGraph 就是你该认真考虑的工具。它降低的是构建和维护复杂智能体系统的架构复杂度。2. LangGraph 核心概念用“图”的思维重新理解智能体协作要用好 LangGraph必须准确理解它的几个核心抽象。这些概念是构建一切应用的基础。2.1 状态State系统的共享记忆State是所有节点共享和操作的数据容器。你可以把它想象成一个团队共用的白板每个智能体节点都可以上去查看信息、写下自己的结论。在 LangGraph 中State通常是一个 TypedDict 或 Pydantic Model。它定义了工作流中需要流转的所有数据字段。from typing import TypedDict, List, Annotated from langgraph.graph.message import add_messages import operator class AgentState(TypedDict): # 消息历史通常用于记录智能体与用户或智能体间的对话 messages: Annotated[List, add_messages] # 当前要处理的任务描述 task: str # 研究员智能体搜集到的资料 research_materials: List[str] # 写手智能体生成的草稿 draft: str # 审阅员智能体的反馈 feedback: str # 标记任务是否完成 is_finished: bool关键点Annotated和add_messages是 LangGraph 提供的语法糖用于优雅地追加消息列表而不是直接赋值。这是管理对话历史的推荐方式。你应该根据你的工作流需求来设计 State 的字段。原则是所有节点需要输入或产出的信息都应该在 State 中定义。2.2 节点Node执行具体任务的单元Node是一个函数它接收当前的State执行一些操作如调用 LLM、运行工具、处理数据然后返回一个更新后的State或包含更新的字典。一个节点通常对应一个智能体的“一次行动”。def research_agent_node(state: AgentState) - dict: 研究员节点根据任务搜集资料。 # 1. 从状态中获取任务 task state[“task”] # 2. 构造提示词调用 LLM 或搜索工具这里简化模拟 # 假设我们调用一个工具函数 web_search search_results web_search(querytask, num_results3) # 3. 更新状态返回需要修改的字段 return {“research_materials”: search_results, “messages”: [HumanMessage(contentf“已搜集到资料{search_results}”)]}关键点节点函数必须返回一个字典这个字典中的键值对会被用来更新全局的State。节点是定义智能体行为的地方在这里你可以集成任何逻辑LLM 调用、API 请求、数据库查询等。2.3 边Edge控制流程的逻辑Edge决定了在一个节点执行完毕后下一个该执行哪个节点。这是实现分支、循环的关键。边通常由一个路由函数Router来定义。这个函数接收更新后的State并返回下一个要执行的节点名称字符串或者一个特定的结束标识。from langgraph.graph import END def should_continue(state: AgentState) - str: 决定在写手完成后是进入审阅还是结束。 # 如果已经标记完成则结束 if state.get(“is_finished”): return END # 否则进入审阅节点 return “review_agent”条件边示例更复杂的分支例如根据内容质量决定下一步。def quality_router(state: AgentState) - str: 根据审阅反馈决定下一步通过、重写还是终止。 feedback state.get(“feedback”, “”) if “excellent” in feedback.lower(): return “publish_node” # 进入发布节点 elif “rewrite” in feedback.lower(): return “writer_agent” # 返回写手节点重新写 else: return “human_in_the_loop” # 需要人工介入关键点END是一个特殊的节点名表示图执行结束。路由逻辑可以非常简单固定顺序也可以非常复杂基于 LLM 判断、基于规则等。2.4 图Graph将一切组装起来将定义好的State、Node和Edge组装起来就构成了一个Graph。Graph对象负责管理整个工作流的执行。from langgraph.graph import StateGraph, START # 1. 创建图构建器并指定状态结构 workflow StateGraph(AgentState) # 2. 添加节点 workflow.add_node(“research_agent”, research_agent_node) workflow.add_node(“writer_agent”, writer_agent_node) workflow.add_node(“review_agent”, review_agent_node) # 3. 设置入口点 workflow.set_entry_point(“research_agent”) # 4. 添加边定义节点间的流向 workflow.add_edge(“research_agent”, “writer_agent”) # 研究员完成后总是去写手 workflow.add_conditional_edges( “writer_agent”, # 从哪个节点出发 quality_router, # 使用哪个路由函数做决定 {“review_agent”: “review_agent”, “END”: END} # 路由函数返回值到节点名的映射 ) workflow.add_edge(“review_agent”, “writer_agent”) # 审阅员后返回写手形成循环 # 5. 编译图得到可执行对象 app workflow.compile()核心思想通过add_edge建立固定流向通过add_conditional_edges建立条件分支。这让你能用代码清晰地“绘制”出智能体的协作流程图。3. 环境准备搭建你的第一个 LangGraph 多智能体项目在开始编码前我们需要准备好开发环境。本项目将使用 Python 作为开发语言。3.1 环境与依赖确保你的 Python 版本在 3.8 或以上。我们使用pip进行包管理。核心依赖langgraph: 核心框架。langchain-openai: 为了方便调用 OpenAI 的模型你也可以使用langchain-anthropic,langchain-google-genai等。langchain: 提供一些基础组件和工具虽然 LangGraph 可独立使用但结合 LangChain 生态更方便。python-dotenv: 管理环境变量保护你的 API Key。3.2 安装步骤创建项目目录并进入mkdir langgraph-multi-agent-demo cd langgraph-multi-agent-demo创建虚拟环境强烈推荐python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate安装依赖包pip install langgraph langchain-openai langchain python-dotenv如果你的网络环境导致安装缓慢可以考虑使用国内镜像源例如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple langgraph langchain-openai langchain python-dotenv设置 API Key 在项目根目录创建一个名为.env的文件并填入你的 OpenAI API Key。OPENAI_API_KEYsk-your-actual-api-key-here重要请勿将.env文件提交到 Git 等版本控制系统。确保它在.gitignore中。3.3 验证安装创建一个简单的测试文件test_env.pyimport os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() # 加载 .env 文件中的环境变量 llm ChatOpenAI(model“gpt-3.5-turbo”) try: response llm.invoke(“Hello, world!”) print(“环境配置成功LLM 响应:”, response.content) except Exception as e: print(“环境配置失败错误信息:”, e)运行python test_env.py如果看到成功的 LLM 响应说明环境准备就绪。4. 实战构建一个智能写作团队多智能体工作流现在我们开始构建一个具体的多智能体系统一个由研究员Researcher、写手Writer和审阅员Reviewer组成的智能写作团队。他们的协作流程如下用户提出一个写作主题如“解释神经网络的工作原理”。研究员负责搜集相关的背景资料和关键点。写手根据研究员提供的资料撰写一篇初稿。审阅员对初稿进行审核检查事实准确性、逻辑连贯性和语言质量。如果审阅通过流程结束输出最终稿。如果未通过审阅员提供修改意见流程跳回写手节点进行重写。此循环最多进行3次。我们将分步实现这个工作流。4.1 第一步定义状态State首先在state.py文件中定义我们工作流所需的状态结构。# state.py from typing import TypedDict, List, Optional from langchain_core.messages import BaseMessage import operator class WritingTeamState(TypedDict): 智能写作团队的状态定义 # 输入用户的任务描述 task: str # 消息历史记录整个团队的对话 messages: List[BaseMessage] # 研究员搜集的资料列表 research_data: List[str] # 写手生成的草稿 draft: str # 审阅员的反馈 review_feedback: str # 当前迭代次数用于限制重写循环 rewrite_count: int # 最终输出当流程成功结束时填充 final_output: Optional[str]4.2 第二步实现研究员智能体Node在agents.py中实现各个智能体节点。我们先实现研究员。# agents.py from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage from .state import WritingTeamState # 初始化 LLM我们使用 GPT-3.5-turbo 以控制成本 llm ChatOpenAI(model“gpt-3.5-turbo”, temperature0.7) def research_agent(state: WritingTeamState) - dict: 研究员智能体根据任务进行资料搜集。 task state[“task”] # 构建系统提示词定义研究员角色和能力 system_prompt “””你是一个专业的研究员。你的任务是根据用户给出的主题快速、准确地搜集核心知识点和事实。 请以清晰、有条理的列表形式返回你的发现。每个点应简洁明了。不要生成完整的文章只提供要点。””” # 调用 LLM research_response llm.invoke([ SystemMessage(contentsystem_prompt), HumanMessage(contentf“请为以下主题搜集关键资料{task}”) ]) # 假设 LLM 返回的是文本我们按行分割成列表实际可根据响应格式调整 research_points [point.strip() for point in research_response.content.split(‘\n’) if point.strip()] # 更新状态 new_messages state[“messages”] [HumanMessage(contentf“用户任务{task}”), research_response] return { “research_data”: research_points, “messages”: new_messages }关键点研究员节点不生成文章只产出结构化或半结构化的“资料点”供写手使用。4.3 第三步实现写手智能体Node继续在agents.py中添加写手智能体。# agents.py (续) def writer_agent(state: WritingTeamState) - dict: 写手智能体根据研究资料撰写文章草稿。 task state[“task”] research_data state[“research_data”] # 将研究资料整理成上下文 research_context “\n”.join([f”- {point}” for point in research_data]) system_prompt “””你是一位技术文章写手。你的风格清晰、易懂、逻辑性强。 请根据研究员提供的关键点撰写一篇关于给定主题的完整技术文章草稿。 文章应包含引言、主体分点论述和简要总结。 确保文章流畅并准确涵盖所有提供的要点。””” writer_response llm.invoke([ SystemMessage(contentsystem_prompt), HumanMessage(contentf“写作主题{task}\n\n研究员提供的资料\n{research_context}\n\n请开始撰写文章草稿”) ]) new_messages state[“messages”] [writer_response] return { “draft”: writer_response.content, “messages”: new_messages }4.4 第四步实现审阅员智能体与条件路由Node Edge审阅员需要评估草稿并做出决策通过、需要修改并提供反馈、或严重不合格。# agents.py (续) def review_agent(state: WritingTeamState) - dict: 审阅员智能体审核文章草稿并提供反馈。 draft state[“draft”] rewrite_count state.get(“rewrite_count”, 0) system_prompt “””你是一位严格的技术内容审阅员。请评估以下文章草稿 1. **事实准确性**内容是否与主题相关且信息准确 2. **逻辑结构**文章结构是否清晰论点是否连贯 3. **语言质量**表达是否清晰、专业、无语法错误 请给出你的总体评价‘excellent‘, ‘need_rewrite‘, ‘poor‘并附上具体的反馈意见。 如果评价是 ‘need_rewrite‘请明确指出需要修改的部分和建议。 格式第一行必须是 ‘评价[excellent|need_rewrite|poor]‘后面跟反馈内容。””” review_response llm.invoke([ SystemMessage(contentsystem_prompt), HumanMessage(contentf“请审阅以下文章草稿\n\n{draft}”) ]) response_text review_response.content new_messages state[“messages”] [review_response] # 解析评价 feedback response_text decision “need_rewrite” # 默认 if “评价excellent” in response_text: decision “excellent” elif “评价poor” in response_text: decision “poor” # 否则保持 need_rewrite return { “review_feedback”: feedback, “messages”: new_messages, “_review_decision”: decision # 这是一个临时字段用于路由不保存在最终状态 }接下来定义路由逻辑。这个函数将根据审阅员的决策_review_decision决定下一步。# graph.py from langgraph.graph import END from .state import WritingTeamState def route_after_review(state: WritingTeamState) - str: 审阅后的路由逻辑。 decision state.get(“_review_decision”, “need_rewrite”) rewrite_count state.get(“rewrite_count”, 0) if decision “excellent”: # 审核优秀进入最终处理节点 return “finalize” elif decision “poor” and rewrite_count 2: # 质量太差且已重写多次终止流程 return “terminate” elif decision “poor”: # 质量太差但还有机会返回写手重写 return “rewrite” else: # need_rewrite 返回写手重写 return “rewrite”我们还需要两个额外的节点来处理“最终化”和“终止”逻辑。# agents.py (续) def finalize_agent(state: WritingTeamState) - dict: 最终处理节点整理输出标记完成。 final_output f“# 最终文章\n\n{state[‘draft’]}\n\n---\n*基于研究资料生成并经过审核。*” return {“final_output”: final_output, “is_finished”: True} def terminate_agent(state: WritingTeamState) - dict: 终止节点处理失败情况。 failure_note f“# 任务失败\n\n经过{state[‘rewrite_count’]}次尝试未能生成合格文章。最后反馈{state[‘review_feedback’]}” return {“final_output”: failure_note, “is_finished”: True}4.5 第五步组装图Graph现在在main.py或graph.py中将所有组件组装起来。# main.py import os from dotenv import load_dotenv from langgraph.graph import StateGraph, START from state import WritingTeamState from agents import research_agent, writer_agent, review_agent, finalize_agent, terminate_agent from graph import route_after_review load_dotenv() # 1. 创建图 workflow StateGraph(WritingTeamState) # 2. 添加所有节点 workflow.add_node(“researcher”, research_agent) workflow.add_node(“writer”, writer_agent) workflow.add_node(“reviewer”, review_agent) workflow.add_node(“finalize”, finalize_agent) workflow.add_node(“terminate”, terminate_agent) # 3. 设置入口点 workflow.set_entry_point(“researcher”) # 4. 添加边和条件边 workflow.add_edge(“researcher”, “writer”) # 研究员完成后 - 写手 workflow.add_edge(“writer”, “reviewer”) # 写手完成后 - 审阅员 # 关键从审阅员出发的条件边 workflow.add_conditional_edges( “reviewer”, route_after_review, # 路由函数 { “finalize”: “finalize”, # 路由函数返回 “finalize” 时跳转到 finalize 节点 “rewrite”: “writer”, # 返回 “rewrite” 时跳回 writer 节点 “terminate”: “terminate” # 返回 “terminate” 时跳转到 terminate 节点 } ) # 从 finalize 和 terminate 节点都指向 END workflow.add_edge(“finalize”, END) workflow.add_edge(“terminate”, END) # 5. 编译图 app workflow.compile() # 6. 可视化图可选需要安装 pygraphviz try: from langgraph.graph import draw_mermaid mermaid_svg draw_mermaid(app) # 可以将 mermaid_svg 保存为文件或在 Notebook 中显示 print(“Graph compiled successfully. Mermaid diagram generated.”) except: print(“Graph compiled successfully. (Install ‘pygraphviz‘ for visualization)”) # 保存编译好的图方便后续使用 if __name__ “__main__”: # 示例运行图 initial_state {“task”: “请解释 Transformer 模型在自然语言处理中的核心机制” “messages”: [], “research_data”: [], “draft”: “”, “review_feedback”: “”, “rewrite_count”: 0, “final_output”: None} print(“开始执行多智能体写作流程...\n”) final_state app.invoke(initial_state) print(“\n” “”*50) print(“流程执行完毕”) print(f“最终状态 keys: {final_state.keys()}”) if final_state.get(“final_output”): print(“\n最终输出”) print(final_state[“final_output”]) else: print(“未生成最终输出。”)4.6 第六步运行与验证在终端运行你的主程序python main.py你应该能看到类似以下的输出具体内容因 LLM 生成结果而异开始执行多智能体写作流程... 流程执行完毕 最终状态 keys: dict_keys([‘task‘, ‘messages‘, ‘research_data‘, ‘draft‘, ‘review_feedback‘, ‘rewrite_count‘, ‘final_output‘, ‘is_finished‘]) 最终输出 # 最终文章 这里会是模型生成的关于 Transformer 的文章 --- *基于研究资料生成并经过审核。*恭喜你已经成功运行了一个具备循环和条件分支的多智能体 LangGraph 应用。你可以通过修改initial_state中的task来测试不同的主题。5. 深入核心LangGraph 高级特性与最佳实践上面的例子展示了基础用法。要构建生产级应用还需要了解以下高级特性和最佳实践。5.1 状态State的设计哲学最小化与模块化State 应只包含工作流真正需要共享的数据。不要将所有可能用到的字段都塞进去。可以考虑使用嵌套的 TypedDict 或 Pydantic 模型来组织复杂状态。使用注解Annotation对于列表追加等常见操作使用Annotated如消息列表可以让代码更简洁、高效。LangGraph 内部会优化这些操作。不可变与快照理解 LangGraph 在处理 State 时倾向于函数式风格。节点函数接收状态返回更新部分而不是原地修改。这有利于调试和创建检查点。5.2 工具Tools的集成智能体的能力很大程度上取决于它能使用的工具。LangGraph 与 LangChain 的工具生态无缝集成。from langchain.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import create_tool_calling_agent, AgentExecutor from langgraph.prebuilt import ToolExecutor, ToolInvocation # 1. 定义工具 tool def search_web(query: str) - str: “”“在互联网上搜索信息。”“” # 这里可以集成 SerpAPI、Google Search API 等 return f“关于 ‘{query}‘ 的模拟搜索结果...” tool def calculator(expression: str) - str: “”“计算数学表达式。”“” try: result eval(expression) # 注意生产环境请使用更安全的评估方法 return str(result) except: return “计算错误” # 2. 创建智能体节点 llm ChatOpenAI(model“gpt-4”, temperature0) tools [search_web, calculator] tool_executor ToolExecutor(tools) def agent_node(state): messages state[“messages”] # 根据最新消息让LLM决定是否调用工具、调用哪个工具 # 这里简化实际需使用 create_tool_calling_agent 构建 agent_runnable # 假设 ai_message 是 LLM 返回的包含工具调用请求的消息 # ... # 执行工具调用 # tool_invocation ... # output tool_executor.invoke(tool_invocation) # ... # 将工具输出作为新消息追加 # new_messages messages [AIMessage(contentoutput)] # return {“messages”: new_messages} pass最佳实践为不同的智能体节点配备不同的工具集。研究员节点可能需要搜索和摘要工具而写手节点可能只需要文本处理工具。5.3 持久化与检查点Persistence CheckpointsLangGraph 支持将图的状态持久化到数据库如 SQLite、PostgreSQL并创建检查点。这对于长时运行、需要中断恢复的工作流至关重要。from langgraph.checkpoint import MemorySaver from langgraph.graph import StateGraph # 使用内存检查点生产环境建议使用数据库 memory MemorySaver() workflow StateGraph(..., checkpointermemory) # 在调用时传入 config包含 thread_id 来标识不同的会话流 config {“configurable”: {“thread_id”: “user_session_123”}} final_state app.invoke(initial_state, configconfig) # 后续可以从检查点恢复 # loaded_state app.get_state(config)5.4 并行与分支Parallel Branchingadd_conditional_edges实现了条件分支。对于需要并行执行多个节点的情况可以使用langgraph.graph中的Pregel底层 API 或通过设计多个起始节点来实现更复杂的模式。对于大多数多智能体场景顺序执行与条件循环已足够。5.5 调试与可视化LangGraph Studio这是一个强大的 Web 界面可以可视化你的图结构并逐步调试工作流的执行过程查看每个节点的输入输出。对于复杂流程的调试不可或缺。Trace在代码中可以通过设置环境变量LANGRAPH_TRACINGtrue来启用详细的执行追踪日志。6. 常见问题与排查指南在开发 LangGraph 应用时你可能会遇到以下典型问题问题现象可能原因排查步骤解决方案KeyError当访问 State 字段1. 在TypedDict中未定义该字段。2. 前序节点未返回该字段进行更新。1. 检查State类的定义。2. 检查前序节点的返回值字典是否包含该键。1. 在State类中添加缺失的字段并指定类型如Optional[str]。2. 确保每个节点都返回它承诺更新的所有字段。图编译失败提示节点/边未定义1. 添加边时引用了未添加的节点名。2. 节点名拼写错误。1. 检查add_edge和add_conditional_edges调用中的节点名字符串。2. 与add_node时使用的名字仔细比对。1. 确保所有被边引用的节点都已通过add_node添加。2. 使用常量或枚举来管理节点名避免硬编码字符串。工作流陷入无限循环1. 条件路由逻辑有误始终返回同一个非END节点。2. 缺少循环终止条件如重试次数限制。1. 在路由函数中打印state和决策逻辑。2. 检查 State 中是否有用于计数的字段如rewrite_count。1. 仔细检查路由函数的条件分支确保有通往END的路径。2. 在 State 中引入iteration或retry_count字段并在路由逻辑中判断是否超过上限。LLM 调用超时或报错1. API Key 错误或额度不足。2. 网络问题。3. 提示词导致模型响应过长。1. 检查.env文件和环境变量。2. 单独测试 LLM 调用。3. 检查提示词是否明确要求了简洁回复。1. 确认 API Key 有效且有余量。2. 为 LLM 调用添加超时和重试机制。3. 优化提示词设置max_tokens参数。状态更新不符合预期1. 对Annotated字段如messages使用了错误的更新方式直接赋值。2. 多个节点并发更新同一字段产生冲突在复杂图中。1. 阅读官方文档中关于add_messages等 reducer 的用法。2. 分析图结构确认是否存在真正的并发节点。1. 对于messages字段始终通过返回{“messages”: [new_message]}来追加LangGraph 会自动合并。2. 对于需要原子操作的复杂更新考虑设计专门的节点来处理。可视化图无法生成未安装pygraphviz库或其系统依赖如 Graphviz。按照 LangGraph 文档安装pygraphviz。在 Ubuntu 上可能需要sudo apt-get install graphviz graphviz-dev。安装系统级的 Graphviz 和 Python 的pygraphviz包。如果安装困难可以手动绘制 Mermaid 图或直接使用 LangGraph Studio。7. 生产环境最佳实践当你准备将 LangGraph 应用部署到生产环境时请考虑以下几点状态持久化不要使用MemorySaver。根据你的基础设施选择SqliteSaver、PostgresSaver或自定义的检查点存储以确保工作流状态在应用重启后不丢失。错误处理与重试在节点函数内部实现健壮的错误处理。对于网络调用如 LLM API、外部工具务必添加重试逻辑和断路器模式。超时控制为整个图或单个节点的执行设置超时防止某个环节卡死导致资源耗尽。可观测性集成日志记录如structlog和监控如 OpenTelemetry。记录每个节点的开始、结束、输入、输出和错误。这对于调试和性能分析至关重要。配置化管理将图的结构、节点提示词、模型参数等抽取为配置文件如 YAML避免硬编码便于不同环境开发、测试、生产的切换。安全性工具调用严格校验和净化传递给外部工具的参数防止注入攻击。LLM 输出对 LLM 生成的内容进行后处理或过滤避免输出有害或不适当信息。权限控制如果工作流涉及敏感操作如数据库写、发送邮件必须在节点逻辑中加入权限校验。测试单元测试单独测试每个节点函数。集成测试测试整个图对于特定输入是否能产生预期输出。模拟Mocking在测试中模拟 LLM 和外部工具的响应使测试快速、稳定且不消耗 API 额度。8. 总结与进阶方向通过本文的实战你已经掌握了使用 LangGraph 构建多智能体系统的核心流程从状态设计、节点实现、条件路由到图组装。我们构建的“智能写作团队”虽然简化但完整展示了多智能体协作、循环、条件判断等关键模式。LangGraph 的真正威力在于它将复杂的、动态的智能体交互编码成了一个静态的、可审查的、可调试的图结构。这带来了工程上的巨大优势团队可以共同讨论和评审这个“协作蓝图”而不是深究一堆混乱的回调函数和状态标志。你的下一步扩展智能体能力为你项目中的智能体集成更强大的工具如代码执行器、数据库查询器、文件操作工具等。探索更复杂的图模式研究官方文档中的StateGraph高级用法如子图Subgraph、并行分支、人工审批节点Human-in-the-loop等。集成到现有系统思考如何将 LangGraph 工作流作为后端服务暴露出来例如使用 FastAPI供前端或其他系统调用。性能优化对于耗时长的节点如 LLM 调用考虑异步执行。对于可以并行的分支探索并发执行的可能性。加入社区关注 LangGraph 的 GitHub 仓库和官方文档其生态正在快速发展新的特性和最佳实践不断涌现。多智能体系统是 AI 应用走向复杂和自主的关键一步。而 LangGraph 提供了实现这一愿景目前最优雅、最强大的工程框架之一。希望本教程能成为你探索这一领域的坚实起点。建议将代码示例保存并动手改造在实践中遇到的具体问题才是你深入理解它的最佳路径。

相关新闻

基于SpringBoot+Vue的在线招投标系统毕业设计部署与实战指南

基于SpringBoot+Vue的在线招投标系统毕业设计部署与实战指南

这次我们来看一个开源的在线招投标系统,这是一个典型的Java全栈毕业设计项目。对于计算机相关专业的同学来说,毕业设计既要体现技术栈的完整性,又要保证项目的可运行和可演示。这个项目基于SpringBoot后端、Vue前端和MySQL数据库,…

2026/8/21 23:27:46 阅读更多 →
AI编程工程化:从Prompt到Loop的四层协作框架实战

AI编程工程化:从Prompt到Loop的四层协作框架实战

这次我们来看一个关于 AI 编程核心方法论的话题: Loop Engineering 。这不是一个具体的软件或模型,而是一个将 AI 编程实践系统化、工程化的思维框架。它试图回答一个关键问题:当 AI 成为编程的核心参与者时,我们如何构建稳定、…

2026/8/21 23:27:46 阅读更多 →
谷歌HEIR项目:用编译器技术降低同态加密AI推理门槛

谷歌HEIR项目:用编译器技术降低同态加密AI推理门槛

在 AI 应用大规模部署的今天,数据隐私和安全已成为无法回避的核心挑战。传统的 AI 服务模式要求用户将原始数据上传至云端服务器进行推理,这带来了巨大的隐私泄露风险。为了解决这一矛盾,隐私计算技术应运而生,而同态加密作为其中…

2026/8/21 23:26:45 阅读更多 →

最新新闻

如何快速把网页小说变成电子书:小说下载器 10 分钟新手完整指南

如何快速把网页小说变成电子书:小说下载器 10 分钟新手完整指南

如何快速把网页小说变成电子书:小说下载器 10 分钟新手完整指南 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 出差没网,电纸书里的书单却空着。**novel-dow…

2026/8/22 0:19:18 阅读更多 →
Wand 免费版 2 小时限时?用 Wand-Enhancer 免费解锁完整专业版能力

Wand 免费版 2 小时限时?用 Wand-Enhancer 免费解锁完整专业版能力

Wand 免费版 2 小时限时?用 Wand-Enhancer 免费解锁完整专业版能力 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand(原…

2026/8/22 0:19:18 阅读更多 →
把微信聊天记录一键导出成文档:WeChatMsg 完整上手指南

把微信聊天记录一键导出成文档:WeChatMsg 完整上手指南

把微信聊天记录一键导出成文档:WeChatMsg 完整上手指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…

2026/8/22 0:19:18 阅读更多 →
League Akari 使用指南:用自动选将与战绩查询接管英雄联盟的重复操作

League Akari 使用指南:用自动选将与战绩查询接管英雄联盟的重复操作

League Akari 使用指南:用自动选将与战绩查询接管英雄联盟的重复操作 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 排位选人阶段…

2026/8/22 0:19:18 阅读更多 →
WeChatMsg 快速入门:如何把微信聊天记录导出成 HTML、Word 和年度聊天报告

WeChatMsg 快速入门:如何把微信聊天记录导出成 HTML、Word 和年度聊天报告

WeChatMsg 快速入门:如何把微信聊天记录导出成 HTML、Word 和年度聊天报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHu…

2026/8/22 0:19:17 阅读更多 →
NeuroRebuild动态增量重建赋能武警营区穿透式透明指挥底座技术白皮书

NeuroRebuild动态增量重建赋能武警营区穿透式透明指挥底座技术白皮书

前言新时代武警部队智慧军营、智能执勤、科技强军建设持续深化,以智慧磐石工程体系为核心的信息化、立体化安防防控体系已实现营区感知设备全域覆盖、技防系统全面部署。当前武警营区建设已完成视频监控、周界防范、哨位执勤、门禁管控、环境感知、兵器值守等多系统…

2026/8/22 0:18:17 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →