LangGraph进阶指南:为你的AI应用注入“状态”与“智能”
对于刚掌握LangChain的你来说,构建一个简单的问答机器人已不是难事,但当用户中途改变需求,或需要连续多轮对话时,线性链式结构就显得力不从心。LangGraph正是为了解决这些问题而生。你是否曾构建过一个基于LangChain的智能客服,当用户从“查询订单”突然转向“申请退货”时,整个对话逻辑需要重新开始?或者你是否为维护一个包含多步骤、多工具调用的复杂流程而感到头疼?传统的LangChain
目录
对于刚掌握LangChain的你来说,构建一个简单的问答机器人已不是难事,但当用户中途改变需求,或需要连续多轮对话时,线性链式结构就显得力不从心。LangGraph正是为了解决这些问题而生。
你是否曾构建过一个基于LangChain的智能客服,当用户从“查询订单”突然转向“申请退货”时,整个对话逻辑需要重新开始?或者你是否为维护一个包含多步骤、多工具调用的复杂流程而感到头疼?
传统的LangChain链式结构在处理这类有状态、多分支的动态交互时,往往需要大量硬编码的逻辑判断和状态管理代码。
本文将通过一个实际案例,带你深入了解LangGraph如何以图结构重新定义AI应用的构建方式,让你的AI应用从“静态管道”进化为“动态智能体”。
01 LangChain的局限:为何需要升级?
LangChain通过链式结构将大语言模型、工具和记忆机制组合,极大地简化了AI应用开发。但随着场景复杂度提升,其线性设计显露出三大痛点:
-
状态管理僵化:传统链式结构难以处理多分支对话或动态任务切换。
-
工具调用低效:工具调用依赖预设顺序,缺乏动态优先级调整。
-
可扩展性瓶颈:复杂任务需要手动拼接多个链,代码冗余度高。
例如在客服场景中,用户可能中途从查询订单转为退货,线性链通常需要重启或复杂重构。
LangGraph正是为解决这些问题而设计的,它引入有向图结构,将AI Agent的决策流程建模为节点与边的组合,实现了从“链”到“网”的升级。
02 核心概念:认识LangGraph的图结构
LangGraph的核心是基于有向图(Directed Graph) 的计算模型,主要包含三个基本概念:
- State(状态):图的共享内存,可在执行过程中存储和更新数据。状态通常使用TypedDict定义,通过reducer函数控制如何更新。
- Node(节点):代表工作单元,通常是执行特定任务的Python函数。节点接收状态作为输入,返回状态更新。
- Edge(边):定义节点间的流转路径,可以是条件边(根据状态决定下一节点)或固定边(始终流转到特定节点)。
下面的图表直观展示了LangGraph中状态如何在节点间流转:

下面的表格更直观地展示了LangGraph与LangChain在关键特性上的差异:
| 特性维度 | LangChain | LangGraph |
|---|---|---|
| 架构模式 | 线性链式结构 | 有向图结构 |
| 状态管理 | 通过内存组件传递上下文 | 集中式状态系统,支持回滚和详细历史记录 |
| 执行模型 | 线性协调 | 有状态的图执行 |
| 循环支持 | 有限 | 原生支持 |
| 条件分支 | 通过RunnableBranch实现 | 内置支持条件边 |
| 多代理协作 | 需要复杂协调 | 原生支持多代理协调 |
03 快速入门:构建你的第一个LangGraph应用
让我们通过一个实际的例子来理解LangGraph的工作方式。下面是一个基础聊天机器人的实现步骤:
环境搭建
# 安装核心包
pip install -U langchain langchain-ollama langgraph
构建基础聊天机器人
from typing import TypedDict, Annotated, List
from langchain_ollama import ChatOllama
from langgraph.graph import StateGraph, START, END, add_messages
# 定义状态结构
class State(TypedDict):
messages: Annotated[List, add_messages] # 消息列表,使用add_messages reducer
# 初始化LLM
llm = ChatOllama(model="qwen3:8b", temperature=0.7)
# 定义聊天节点
def chatbot_node(state: State):
# 获取最新的用户消息
user_message = state["messages"][-1].content if state["messages"] else ""
# 调用LLM生成响应
response = llm.invoke(user_message)
# 返回状态更新
return {"messages": [response]}
# 构建图
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot_node)
graph_builder.add_edge(START, "chatbot") # 设置入口点
graph_builder.add_edge("chatbot", END) # 设置退出点
# 编译图
graph = graph_builder.compile()
# 运行图
initial_state = {"messages": [{"role": "user", "content": "介绍一下LangGraph"}]}
result = graph.invoke(initial_state)
print(result["messages"][-1].content)
这个简单的例子展示了LangGraph的基本结构:定义状态 → 添加节点 → 连接边 → 编译执行。
04 进阶功能:打造智能客服系统
现在让我们扩展这个基础框架,构建一个更实用的智能客服系统,它能根据用户意图动态选择处理路径:
from typing import Literal, Annotated, List, TypedDict
from langgraph.graph import StateGraph, START, END, add_messages
# 扩展状态定义
class CustomerServiceState(TypedDict):
messages: Annotated[List, add_messages]
query_type: Literal["order", "return", "general", None] # 查询类型
order_status: str # 订单状态
user_id: str # 用户ID
# 定义多个处理节点
def classify_query(state: CustomerServiceState):
"""分类用户查询类型"""
last_message = state["messages"][-1].content.lower()
if "订单" in last_message or "order" in last_message:
return {"query_type": "order"}
elif "退货" in last_message or "return" in last_message:
return {"query_type": "return"}
else:
return {"query_type": "general"}
def handle_order_query(state: CustomerServiceState):
"""处理订单查询"""
# 模拟查询订单状态
order_status = "已发货" # 实际中会从数据库查询
response = f"您的订单状态是:{order_status}"
return {"messages": [{"role": "assistant", "content": response}],
"order_status": order_status}
def handle_return_query(state: CustomerServiceState):
"""处理退货请求"""
# 检查是否满足退货条件
if state.get("order_status") == "已发货":
response = "您的订单已发货,可以申请退货。请提供退货原因。"
else:
response = "您的订单尚未发货,可以直接取消订单。"
return {"messages": [{"role": "assistant", "content": response}]}
# 构建更复杂的图
graph_builder = StateGraph(CustomerServiceState)
# 添加节点
graph_builder.add_node("classify", classify_query)
graph_builder.add_node("order_handler", handle_order_query)
graph_builder.add_node("return_handler", handle_return_query)
# 添加边(包括条件边)
graph_builder.add_edge(START, "classify")
# 根据查询类型动态路由
graph_builder.add_conditional_edges(
"classify",
lambda state: state.get("query_type"),
{
"order": "order_handler",
"return": "return_handler",
"general": END # 简单查询直接结束
}
)
graph_builder.add_edge("order_handler", END)
graph_builder.add_edge("return_handler", END)
# 编译并运行
service_graph = graph_builder.compile()
# 测试不同场景
order_query = {"messages": [{"role": "user", "content": "我的订单状态怎么样?"}]}
return_query = {"messages": [{"role": "user", "content": "我想退货"}]}
print("处理订单查询:")
result1 = service_graph.invoke(order_query)
print(result1["messages"][-1].content)
print("\n处理退货查询:")
# 注意:退货需要知道订单状态,所以需要更完整的初始状态
full_state = {
"messages": [{"role": "user", "content": "我想退货"}],
"order_status": "已发货"
}
result2 = service_graph.invoke(full_state)
print(result2["messages"][-1].content)
这个智能客服系统展示了LangGraph的动态路由能力。下面的执行流程图清晰展示了这个系统如何处理不同类型的用户查询:

05 核心特性:LangGraph的高级功能
除了基础图结构,LangGraph还提供了一系列高级功能,使其更适合构建复杂的AI应用:
状态持久化与记忆
LangGraph通过检查点(Checkpoint) 机制支持状态持久化,允许Agent在长时间运行的对话中保持记忆。
from langgraph.checkpoint import InMemorySaver
# 启用检查点
checkpointer = InMemorySaver()
graph_with_memory = graph_builder.compile(checkpointer=checkpointer)
# 使用thread_id维护对话上下文
config = {"configurable": {"thread_id": "user_123"}}
# 第一次调用
result1 = graph_with_memory.invoke(
{"messages": [{"role": "user", "content": "你好"}]},
config=config
)
# 第二次调用(保持上下文)
result2 = graph_with_memory.invoke(
{"messages": [{"role": "user", "content": "我刚才问了什么?"}]},
config=config
)
# Agent会记得之前的对话
工具调用与集成
LangGraph支持灵活的工具调度,可以为不同工具分配优先级,并设置回退机制。
# 定义工具
def search_web(query: str) -> str:
# 模拟网络搜索
return f"关于'{query}'的搜索结果..."
def calculate(expression: str) -> str:
# 模拟计算
return f"计算结果: {eval(expression)}"
# 工具调用节点
def tool_dispatcher(state: State):
last_message = state["messages"][-1].content
# 根据内容选择工具
if "计算" in last_message or "calculate" in last_message:
# 提取计算表达式
import re
numbers = re.findall(r'\d+', last_message)
if numbers:
result = calculate("+".join(numbers))
return {"messages": [{"role": "assistant", "content": result}]}
# 默认使用搜索
result = search_web(last_message)
return {"messages": [{"role": "assistant", "content": result}]}
子图与模块化
LangGraph支持子图嵌套,允许将复杂任务封装为独立模块,提高代码复用性。
# 创建语音处理子图
voice_subgraph = StateGraph(State)
voice_subgraph.add_node("transcribe", speech_to_text_function)
voice_subgraph.add_node("translate", text_translation_function)
voice_subgraph.add_edge("transcribe", "translate")
# 在主图中嵌入子图
main_graph = StateGraph(State)
main_graph.add_subgraph("voice_processing", voice_subgraph)
main_graph.add_node("llm_response", generate_answer_function)
# 连接子图和主图节点
main_graph.add_edge("voice_processing", "llm_response")
06 实际应用:LangGraph的成功案例
LangGraph已经在多个实际场景中证明了其价值:
- Inconvo的数据分析平台:Inconvo利用LangGraph构建了一个面向非技术用户的对话式数据分析系统。用户可以用自然语言提问,如“过去两周我卖出了多少产品?”,系统通过LangGraph协调多步骤工作流:解析查询 → 映射到数据库表 → 生成SQL → 执行查询 → 返回可视化结果。
- 智能客服流量推荐系统:某方案结合LangGraph和DeepSeek-R1构建了流量包推荐系统。当用户询问“适合出差的流量包”时,系统通过LangGraph构建的动态知识图谱进行多跳推理:出差场景 → 高流量需求 → 5G套餐 → 10GB容量,快速定位推荐目标。
- 多代理协作系统:LangGraph原生支持多代理协作,可用于团队协作模拟、辩论系统或创意合作平台。这种模式在药物发现等研究领域显示出潜力,不同专业领域的代理可以协同工作,产生新的见解。
07 决策指南:何时选择LangGraph?
根据项目需求选择合适的框架至关重要。下面的流程图可以帮你做出决策:

LangGraph与LangChain的架构对比
下图直观展示了两种框架在架构设计上的本质差异:


具体来说:
选择LangChain的场景:
-
简单的文本转换任务(如翻译、摘要)
-
基础的RAG(检索增强生成)应用
-
不需要复杂状态管理的线性工作流
选择LangGraph的场景:
-
需要处理多轮对话的客服系统
-
复杂的代理系统(如GitHub Copilot X)
-
多代理协作的生态
-
需要动态分支和循环逻辑的应用
LangGraph并非要完全替代LangChain,而是其图化升级和补充。很多团队会在同一个项目中同时使用两个框架:用LangChain处理基础任务,用LangGraph构建复杂的工作流。
学习路径建议
-
从简单开始:先掌握LangChain基础,理解链式结构
-
体验图结构:构建一个基础的LangGraph聊天机器人
-
添加复杂度:逐步引入条件分支、工具调用和状态管理
-
探索高级功能:尝试多代理协作、子图嵌套等高级特性
-
实战项目:将LangGraph应用到实际业务场景中
更多推荐



所有评论(0)