LangGraph 完全指南:从核心概念到实战应用
前言
当业务需求从"调用模型"升级为"构建智能 Agent"时,条件分支、循环控制、状态记忆等复杂需求接踵而来。LangChain 凭借 100+ LLM 集成和 LCEL(LangChain Expression Language,一种声明式编排语言)组件化为开发者所熟知,但在构建复杂的、有状态的 Agent 系统时,往往力不从心。
LangGraph 正是为填补这一空白而生的------它是 LangChain 生态中专门构建有状态、多智能体应用的低级编排框架,通过图结构为 AI 应用赋予循环、分支和持久化能力。本文将带你系统了解 LangGraph:它是什么、能做什么,以及如何从零开始用它搭建实用的智能体。
一、什么是 LangGraph?
1.1 定义与核心定位
LangGraph 是 LangChain 生态的重要组成部分,专门用于构建基于大语言模型的复杂、有状态、多智能体应用。它的核心思想是将工作流程抽象为一个有向图结构,通过节点(Node)和边(Edge)来定义任务的执行步骤和逻辑流,从而提供远超线性链式调用的灵活性和控制力。
从技术演进来看,LangGraph 经历了三个关键阶段:概念验证阶段(2024Q2)引入有向图结构编排工作流;生态融合阶段(2025Q2)与 LangChain 深度集成,状态管理机制得到优化;企业级成熟阶段(2026Q1)发布 1.0.7 版本,强化持久执行、人在循环(Human-in-the-Loop)等生产级特性。
与 LangChain 的定位差异可以这样理解:LangChain 专注于提供组件和 LCEL 编排能力,适合简单的一次性任务;LangGraph 则是构建有状态 Agent 系统的理想选择,两者相辅相成。LangChain 和 LangGraph 由同一家公司(LangChain Inc.)开发,并非竞争关系,而是同一生态中高低不同的抽象层级。
1.2 核心架构:三层设计
LangGraph 采用三层架构,将复杂流程拆解为清晰可控的结构:
#mermaid-svg-LjFd2e14FWdH7gJl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LjFd2e14FWdH7gJl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LjFd2e14FWdH7gJl .error-icon{fill:#552222;}#mermaid-svg-LjFd2e14FWdH7gJl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LjFd2e14FWdH7gJl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LjFd2e14FWdH7gJl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LjFd2e14FWdH7gJl .marker.cross{stroke:#333333;}#mermaid-svg-LjFd2e14FWdH7gJl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LjFd2e14FWdH7gJl p{margin:0;}#mermaid-svg-LjFd2e14FWdH7gJl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LjFd2e14FWdH7gJl .cluster-label text{fill:#333;}#mermaid-svg-LjFd2e14FWdH7gJl .cluster-label span{color:#333;}#mermaid-svg-LjFd2e14FWdH7gJl .cluster-label span p{background-color:transparent;}#mermaid-svg-LjFd2e14FWdH7gJl .label text,#mermaid-svg-LjFd2e14FWdH7gJl span{fill:#333;color:#333;}#mermaid-svg-LjFd2e14FWdH7gJl .node rect,#mermaid-svg-LjFd2e14FWdH7gJl .node circle,#mermaid-svg-LjFd2e14FWdH7gJl .node ellipse,#mermaid-svg-LjFd2e14FWdH7gJl .node polygon,#mermaid-svg-LjFd2e14FWdH7gJl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LjFd2e14FWdH7gJl .rough-node .label text,#mermaid-svg-LjFd2e14FWdH7gJl .node .label text,#mermaid-svg-LjFd2e14FWdH7gJl .image-shape .label,#mermaid-svg-LjFd2e14FWdH7gJl .icon-shape .label{text-anchor:middle;}#mermaid-svg-LjFd2e14FWdH7gJl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LjFd2e14FWdH7gJl .rough-node .label,#mermaid-svg-LjFd2e14FWdH7gJl .node .label,#mermaid-svg-LjFd2e14FWdH7gJl .image-shape .label,#mermaid-svg-LjFd2e14FWdH7gJl .icon-shape .label{text-align:center;}#mermaid-svg-LjFd2e14FWdH7gJl .node.clickable{cursor:pointer;}#mermaid-svg-LjFd2e14FWdH7gJl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LjFd2e14FWdH7gJl .arrowheadPath{fill:#333333;}#mermaid-svg-LjFd2e14FWdH7gJl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LjFd2e14FWdH7gJl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LjFd2e14FWdH7gJl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LjFd2e14FWdH7gJl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LjFd2e14FWdH7gJl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LjFd2e14FWdH7gJl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LjFd2e14FWdH7gJl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LjFd2e14FWdH7gJl .cluster text{fill:#333;}#mermaid-svg-LjFd2e14FWdH7gJl .cluster span{color:#333;}#mermaid-svg-LjFd2e14FWdH7gJl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LjFd2e14FWdH7gJl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LjFd2e14FWdH7gJl rect.text{fill:none;stroke-width:0;}#mermaid-svg-LjFd2e14FWdH7gJl .icon-shape,#mermaid-svg-LjFd2e14FWdH7gJl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LjFd2e14FWdH7gJl .icon-shape p,#mermaid-svg-LjFd2e14FWdH7gJl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LjFd2e14FWdH7gJl .icon-shape .label rect,#mermaid-svg-LjFd2e14FWdH7gJl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LjFd2e14FWdH7gJl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LjFd2e14FWdH7gJl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LjFd2e14FWdH7gJl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 控制流层
节点执行层
状态管理层
条件满足
条件不满足
工具调用
需要重试
State 全局状态对象
对话历史/处理结果/上下文
节点 A
意图分类
节点 B
LLM 调用
节点 C
工具调用
节点 D
结果处理
条件边
分支逻辑
循环边
迭代处理
静态边
固定流转
- 状态管理层:维护全局状态对象,支持 JSON Schema 定义状态结构,记录对话历史、用户意图、上下文记忆等动态字段。
- 节点执行层:每个节点代表独立功能模块,支持同步/异步执行,涵盖 LLM 调用、规则引擎、外部 API 集成等多种节点类型。
- 控制流层:通过条件边实现分支逻辑,支持复杂业务规则的表达。
二、LangGraph 能做什么?
LangGraph 通过图结构将传统的线性"链"提升为灵活可控的"图",让 AI 应用具备了前所未有的能力。
2.1 核心能力一览
#mermaid-svg-oAGNYQR91C2qOqj3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oAGNYQR91C2qOqj3 .error-icon{fill:#552222;}#mermaid-svg-oAGNYQR91C2qOqj3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oAGNYQR91C2qOqj3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oAGNYQR91C2qOqj3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oAGNYQR91C2qOqj3 .marker.cross{stroke:#333333;}#mermaid-svg-oAGNYQR91C2qOqj3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oAGNYQR91C2qOqj3 p{margin:0;}#mermaid-svg-oAGNYQR91C2qOqj3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster-label text{fill:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster-label span{color:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster-label span p{background-color:transparent;}#mermaid-svg-oAGNYQR91C2qOqj3 .label text,#mermaid-svg-oAGNYQR91C2qOqj3 span{fill:#333;color:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 .node rect,#mermaid-svg-oAGNYQR91C2qOqj3 .node circle,#mermaid-svg-oAGNYQR91C2qOqj3 .node ellipse,#mermaid-svg-oAGNYQR91C2qOqj3 .node polygon,#mermaid-svg-oAGNYQR91C2qOqj3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oAGNYQR91C2qOqj3 .rough-node .label text,#mermaid-svg-oAGNYQR91C2qOqj3 .node .label text,#mermaid-svg-oAGNYQR91C2qOqj3 .image-shape .label,#mermaid-svg-oAGNYQR91C2qOqj3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-oAGNYQR91C2qOqj3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oAGNYQR91C2qOqj3 .rough-node .label,#mermaid-svg-oAGNYQR91C2qOqj3 .node .label,#mermaid-svg-oAGNYQR91C2qOqj3 .image-shape .label,#mermaid-svg-oAGNYQR91C2qOqj3 .icon-shape .label{text-align:center;}#mermaid-svg-oAGNYQR91C2qOqj3 .node.clickable{cursor:pointer;}#mermaid-svg-oAGNYQR91C2qOqj3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oAGNYQR91C2qOqj3 .arrowheadPath{fill:#333333;}#mermaid-svg-oAGNYQR91C2qOqj3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oAGNYQR91C2qOqj3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oAGNYQR91C2qOqj3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oAGNYQR91C2qOqj3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oAGNYQR91C2qOqj3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oAGNYQR91C2qOqj3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster text{fill:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 .cluster span{color:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oAGNYQR91C2qOqj3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oAGNYQR91C2qOqj3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-oAGNYQR91C2qOqj3 .icon-shape,#mermaid-svg-oAGNYQR91C2qOqj3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oAGNYQR91C2qOqj3 .icon-shape p,#mermaid-svg-oAGNYQR91C2qOqj3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oAGNYQR91C2qOqj3 .icon-shape .label rect,#mermaid-svg-oAGNYQR91C2qOqj3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oAGNYQR91C2qOqj3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oAGNYQR91C2qOqj3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oAGNYQR91C2qOqj3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LangGraph 核心能力
条件分支 Conditional
根据状态动态决策
循环控制 Loop
迭代优化/自动重试
状态管理 State
全局上下文保持
持久化 Persistence
断点续传/时间旅行
多智能体 Multi-Agent
协作分工/层级架构
人工干预 HITL
审核/修正/批准
| 能力 | 说明 | 适用场景 |
|---|---|---|
| 条件分支 | 根据状态动态决定下一个节点 | 智能路由、多意图识别 |
| 循环控制 | 支持迭代处理,直到满足条件 | 代码生成自检、翻译优化 |
| 状态管理 | 跨节点共享全局状态 | 多轮对话、复杂任务 |
| 持久化 | 状态快照,支持中断恢复 | 长时间运行任务 |
| 多智能体协作 | 多 Agent 分工协作 | 复杂问题拆解 |
| 人在循环 | 执行关键节点前等待人工审批 | 金融交易、敏感操作 |
| 时间旅行 | 回溯到任意历史状态重新执行 | 调试分析、流程回顾 |
2.2 典型应用场景
LangGraph 在实际应用中已成功落地多个场景:
- 智能客服系统:根据用户情绪评分动态调整回应策略,结合多轮对话状态管理提供连贯服务。在有条件分支的场景中可根据用户情绪评分调整回应策略。
- 代码生成与质量审查:LLM 生成代码后自动进行安全与风格审查,不通过则触发循环修正,直至达标。可设置 max_iterations=5 确保处理时效性。
- 研究 / 文献综述 Agent:设计多步骤流程,包括文献检索、摘要提取、内容总结和综述撰写,每一步可独立优化和调试。
- AI 翻译 + 自检系统:翻译节点产出初稿,检查节点评估质量,不通过则触发循环迭代,直至满足标准。
- 自动化运维与故障诊断:设计联动流程,监控触发检查,调用诊断工具定位问题,并执行相应的修复步骤。
此外,LangGraph 还支持多智能体协作------每个 Agent 可以独立规划、调用工具、访问共享状态,共同完成复杂任务。在实际应用中已成功应用于智能客服、自动化运维等场景。
三、核心三要素:State、Node 与 Edge
构建 LangGraph 的"图"主要涉及三个核心概念:
3.1 State(状态):图的"共享记忆"
State 是在图的各个节点之间传递的"记忆",通常是一个字典,记录了当前的对话历史、处理结果或其他上下文信息。它让不同节点的逻辑能够共享数据,实现跨步骤的上下文连贯性。
python
from typing import TypedDict, List
# 定义状态结构
class GraphState(TypedDict):
messages: List[dict] # 对话消息历史
current_step: str # 当前执行步骤
result: str # 处理结果
retry_count: int # 重试次数
3.2 Node(节点):任务的"执行单元"
Node 是图中的基本执行单元,每个节点都是一个函数,接收当前状态,处理后返回修改后的状态。Node 应保持"单一职责",只完成一个明确的任务:
python
def translator_node(state: GraphState) -> dict:
"""翻译节点:执行文本翻译"""
text = state["text"]
target = state["target_lang"]
feedback = state.get("feedback", "")
if feedback:
prompt = f"请根据意见重新翻译:{feedback}\n原文:{text}"
else:
prompt = f"请将以下文本翻译为{target}:{text}"
# response = model.invoke(prompt)
return {"translation": "翻译结果", "retry_count": state["retry_count"] + 1}
3.3 Edge(边):流程的"导航线"
Edge 决定了数据如何从一个节点流向下一个节点,支持两种类型:
- 静态边(Static Edge) :固定流转路径,适合确定性流程
- 条件边(Conditional Edge) :根据状态动态决策,实现分支/循环逻辑
python
def should_continue(state: GraphState) -> str:
"""条件判断函数:决定下一个节点"""
if state["translation_quality"] < 0.8:
return "retranslate" # 质量不达标,回到翻译节点
else:
return "end" # 通过检查,结束流程
四、LangChain vs LangGraph:框架选型指南
理解两者的关系是合理选型的前提。LangGraph 和 LangChain 由同一家公司开发,并非竞争关系,而是同一系统中高低不同的抽象层级。
4.1 核心理念对比
#mermaid-svg-k4a1egFwSne54r0t{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-k4a1egFwSne54r0t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-k4a1egFwSne54r0t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-k4a1egFwSne54r0t .error-icon{fill:#552222;}#mermaid-svg-k4a1egFwSne54r0t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k4a1egFwSne54r0t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-k4a1egFwSne54r0t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k4a1egFwSne54r0t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k4a1egFwSne54r0t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-k4a1egFwSne54r0t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k4a1egFwSne54r0t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k4a1egFwSne54r0t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k4a1egFwSne54r0t .marker.cross{stroke:#333333;}#mermaid-svg-k4a1egFwSne54r0t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k4a1egFwSne54r0t p{margin:0;}#mermaid-svg-k4a1egFwSne54r0t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-k4a1egFwSne54r0t .cluster-label text{fill:#333;}#mermaid-svg-k4a1egFwSne54r0t .cluster-label span{color:#333;}#mermaid-svg-k4a1egFwSne54r0t .cluster-label span p{background-color:transparent;}#mermaid-svg-k4a1egFwSne54r0t .label text,#mermaid-svg-k4a1egFwSne54r0t span{fill:#333;color:#333;}#mermaid-svg-k4a1egFwSne54r0t .node rect,#mermaid-svg-k4a1egFwSne54r0t .node circle,#mermaid-svg-k4a1egFwSne54r0t .node ellipse,#mermaid-svg-k4a1egFwSne54r0t .node polygon,#mermaid-svg-k4a1egFwSne54r0t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-k4a1egFwSne54r0t .rough-node .label text,#mermaid-svg-k4a1egFwSne54r0t .node .label text,#mermaid-svg-k4a1egFwSne54r0t .image-shape .label,#mermaid-svg-k4a1egFwSne54r0t .icon-shape .label{text-anchor:middle;}#mermaid-svg-k4a1egFwSne54r0t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-k4a1egFwSne54r0t .rough-node .label,#mermaid-svg-k4a1egFwSne54r0t .node .label,#mermaid-svg-k4a1egFwSne54r0t .image-shape .label,#mermaid-svg-k4a1egFwSne54r0t .icon-shape .label{text-align:center;}#mermaid-svg-k4a1egFwSne54r0t .node.clickable{cursor:pointer;}#mermaid-svg-k4a1egFwSne54r0t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-k4a1egFwSne54r0t .arrowheadPath{fill:#333333;}#mermaid-svg-k4a1egFwSne54r0t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-k4a1egFwSne54r0t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-k4a1egFwSne54r0t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k4a1egFwSne54r0t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-k4a1egFwSne54r0t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k4a1egFwSne54r0t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-k4a1egFwSne54r0t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-k4a1egFwSne54r0t .cluster text{fill:#333;}#mermaid-svg-k4a1egFwSne54r0t .cluster span{color:#333;}#mermaid-svg-k4a1egFwSne54r0t div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-k4a1egFwSne54r0t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-k4a1egFwSne54r0t rect.text{fill:none;stroke-width:0;}#mermaid-svg-k4a1egFwSne54r0t .icon-shape,#mermaid-svg-k4a1egFwSne54r0t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-k4a1egFwSne54r0t .icon-shape p,#mermaid-svg-k4a1egFwSne54r0t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-k4a1egFwSne54r0t .icon-shape .label rect,#mermaid-svg-k4a1egFwSne54r0t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-k4a1egFwSne54r0t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-k4a1egFwSne54r0t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-k4a1egFwSne54r0t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LangGraph模式
条件A
条件B
是
否
用户请求
判断节点
节点A
节点B
需要优化?
输出
LangChain模式
用户请求
组件A
组件B
组件C
最终输出
| 维度 | LangChain | LangGraph |
|---|---|---|
| 抽象层级 | 高层抽象,组件化 | 低层编排,图结构 |
| 核心目标 | 快速构建标准 LLM 应用 | 精确控制复杂 Agent 工作流 |
| 设计理念 | 链式调用 + 组件化 | 状态图 + 循环控制 |
| 复杂度 | 简单直观,适合快速开发 | 学习曲线较陡,适合精细控制 |
| 适用场景 | RAG、一次性任务、线性流程 | 多轮对话、复杂决策、多智能体协作 |
4.2 选型建议
- LangChain 优先:构建标准 RAG 应用、文档问答、简单的 LLM 调用链。
- LangGraph 优先:构建有状态 Agent、需要循环重试的流程、多轮复杂对话、多智能体协作系统。
- 最佳实践:两者可以结合使用------用 LangGraph 搭建 Agent 的主流程框架,在节点内部仍可调用 LangChain 的组件和 LCEL 编排。
五、实战:构建"翻译官 + 自检"智能 Agent
让我们用 LangGraph 实际搭建一个带自检功能的翻译 Agent,体验条件边和循环控制的核心能力。
5.1 需求与流程图
我们要实现这样一个流程:翻译节点执行翻译 → 检查节点评估质量 → 不达标则循环回翻译节点重新翻译,直到质量达标为止。
#mermaid-svg-sHdYDvDPYVIIsCeR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sHdYDvDPYVIIsCeR .error-icon{fill:#552222;}#mermaid-svg-sHdYDvDPYVIIsCeR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sHdYDvDPYVIIsCeR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sHdYDvDPYVIIsCeR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sHdYDvDPYVIIsCeR .marker.cross{stroke:#333333;}#mermaid-svg-sHdYDvDPYVIIsCeR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sHdYDvDPYVIIsCeR p{margin:0;}#mermaid-svg-sHdYDvDPYVIIsCeR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster-label text{fill:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster-label span{color:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster-label span p{background-color:transparent;}#mermaid-svg-sHdYDvDPYVIIsCeR .label text,#mermaid-svg-sHdYDvDPYVIIsCeR span{fill:#333;color:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR .node rect,#mermaid-svg-sHdYDvDPYVIIsCeR .node circle,#mermaid-svg-sHdYDvDPYVIIsCeR .node ellipse,#mermaid-svg-sHdYDvDPYVIIsCeR .node polygon,#mermaid-svg-sHdYDvDPYVIIsCeR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sHdYDvDPYVIIsCeR .rough-node .label text,#mermaid-svg-sHdYDvDPYVIIsCeR .node .label text,#mermaid-svg-sHdYDvDPYVIIsCeR .image-shape .label,#mermaid-svg-sHdYDvDPYVIIsCeR .icon-shape .label{text-anchor:middle;}#mermaid-svg-sHdYDvDPYVIIsCeR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sHdYDvDPYVIIsCeR .rough-node .label,#mermaid-svg-sHdYDvDPYVIIsCeR .node .label,#mermaid-svg-sHdYDvDPYVIIsCeR .image-shape .label,#mermaid-svg-sHdYDvDPYVIIsCeR .icon-shape .label{text-align:center;}#mermaid-svg-sHdYDvDPYVIIsCeR .node.clickable{cursor:pointer;}#mermaid-svg-sHdYDvDPYVIIsCeR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sHdYDvDPYVIIsCeR .arrowheadPath{fill:#333333;}#mermaid-svg-sHdYDvDPYVIIsCeR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sHdYDvDPYVIIsCeR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sHdYDvDPYVIIsCeR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sHdYDvDPYVIIsCeR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sHdYDvDPYVIIsCeR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sHdYDvDPYVIIsCeR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster text{fill:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR .cluster span{color:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sHdYDvDPYVIIsCeR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sHdYDvDPYVIIsCeR rect.text{fill:none;stroke-width:0;}#mermaid-svg-sHdYDvDPYVIIsCeR .icon-shape,#mermaid-svg-sHdYDvDPYVIIsCeR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sHdYDvDPYVIIsCeR .icon-shape p,#mermaid-svg-sHdYDvDPYVIIsCeR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sHdYDvDPYVIIsCeR .icon-shape .label rect,#mermaid-svg-sHdYDvDPYVIIsCeR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sHdYDvDPYVIIsCeR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sHdYDvDPYVIIsCeR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sHdYDvDPYVIIsCeR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
用户输入
原文+目标语言
翻译节点
Translator
检查节点
Checker
质量是否达标?
输出结果
带反馈重译
5.2 定义状态
python
from typing import TypedDict
class GraphState(TypedDict):
text: str # 待翻译原文
target_lang: str # 目标语言
translation: str # 翻译结果
feedback: str # 检查反馈意见
is_ok: bool # 是否通过检查
retry_count: int # 重试次数
5.3 实现节点函数
python
def translator_node(state: GraphState) -> dict:
"""翻译节点:执行翻译(无反馈时初译,有反馈时修正)"""
text = state["text"]
target = state["target_lang"]
feedback = state.get("feedback", "")
if feedback:
prompt = f"原译文有问题:{feedback}\n请根据意见重新翻译原文:{text}\n目标语言:{target}"
else:
prompt = f"请将以下文本翻译为{target}:{text}"
# 实际应调用模型,此处为模拟
# response = model.invoke(prompt)
translation = f"翻译结果_{text[:10]}" if not feedback else f"修正版_{text[:10]}"
return {"translation": translation, "retry_count": state.get("retry_count", 0) + 1}
def checker_node(state: GraphState) -> dict:
"""检查节点:评估翻译质量,给出反馈"""
translation = state["translation"]
retry_count = state.get("retry_count", 0)
# 简化判断逻辑:第1次可能不通过,第2次开始通过
if retry_count <= 1:
return {"is_ok": False, "feedback": "译文质量不达标,请优化表达"}
else:
return {"is_ok": True, "feedback": ""}
5.4 条件路由函数
python
def route_after_check(state: GraphState) -> str:
"""路由函数:决定下一步去向"""
if state["is_ok"]:
return "end"
else:
return "retranslate"
5.5 构建并运行图
python
from langgraph.graph import StateGraph
# 创建状态图
builder = StateGraph(GraphState)
# 添加节点
builder.add_node("translator", translator_node)
builder.add_node("checker", checker_node)
# 设置起始节点
builder.set_entry_point("translator")
# 添加边
builder.add_edge("translator", "checker")
builder.add_conditional_edges("checker", route_after_check, {
"retranslate": "translator",
"end": "end"
})
# 编译图
graph = builder.compile()
# 运行测试
initial_state = {
"text": "Hello, how are you today?",
"target_lang": "中文",
"translation": "",
"feedback": "",
"is_ok": False,
"retry_count": 0
}
result = graph.invoke(initial_state)
print(f"最终翻译: {result['translation']}")
print(f"重试次数: {result['retry_count']}")
运行这个 Agent,你会看到:第一次翻译后检查不通过,触发循环回到翻译节点,第二次翻译完成后通过检查,流程结束。
六、进阶能力:记忆、持久化与多智能体
6.1 短期记忆(Checkpointer):断点续传与时间旅行
LangGraph 的 Checkpointer 是最重要的特性之一。它为图配置后,会在每个 Superstep 后自动保存当前状态快照,实现断点续传,甚至可以回溯到任意历史状态。
在生产环境中,应使用数据库支持的 Checkpointer:
python
from langgraph.checkpoint.postgres import PostgresSaver
DB_URI = "postgresql://user:password@localhost:5432/dbname"
checkpointer = PostgresSaver.from_conn_string(DB_URI)
# 编译时启用持久化
graph = builder.compile(checkpointer=checkpointer)
# 通过 thread_id 隔离不同会话
config = {"configurable": {"thread_id": "user_001"}}
graph.invoke(input_data, config=config) # 状态自动保存
6.2 长期记忆(Store):跨会话的知识沉淀
Checkpointer 保存的是单个会话内的短期记忆,服务重启后仍然存在,但跨会话无法共享。Store 是 LangGraph 专门提供的跨会话长期记忆组件,用于存储用户偏好、历史信息、知识库等。
长期记忆的使用场景:
- 记住用户偏好设置
- 存储跨会话的历史信息
- 保存应用级别的知识库
python
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
# 保存用户偏好(跨会话)
await store.aput(["users", "user_123"], {"theme": "dark", "language": "zh-CN"})
# 在任何线程中都可以访问
preferences = await store.aget(["users", "user_123"])
6.3 多智能体协作
在多智能体架构中,每个 Agent 对应图中的一个独立节点,各节点拥有明确边界、隔离状态和执行逻辑,通过共享的全局 State 或消息传递进行交互,共同完成复杂任务。LangGraph 天然支持多智能体协作,包括层级式(一个父 Agent 协调多个子 Agent)和网络式(Agent 之间点对点自由通信)两种架构模式。
七、进阶技巧与最佳实践
| 技巧 | 说明 |
|---|---|
| 状态精简 | State 字段定义清晰,只存必要数据,避免臃肿影响性能 |
| 节点职责单一 | 每个 Node 只做一件事,提高复用性和可测试性 |
| 条件边做边界控制 | 用条件边严格控制流程,配合最大迭代次数防止无限循环 |
| 合理使用 Checkpointer | 生产环境用 PostgreSQL 而非 MemorySaver,大对象(如图片)不要放入 State |
| 使用 LangSmith 调试 | 可视化查看图结构、节点执行轨迹、状态变化,大幅提升开发效率 |
| 混合使用 LangChain 组件 | 在 Node 内部可自由调用 LangChain 的各种组件 |
八、总结
| 核心要点 | 总结 |
|---|---|
| LangGraph 是什么 | 基于有向图的状态化智能体编排框架,LangChain 生态的低层组件 |
| 能做什么 | 条件分支、循环控制、状态管理、持久化、多智能体协作、人在循环 |
| 核心三要素 | State(状态)、Node(节点)、Edge(边) |
| 与 LangChain 的关系 | 互补而非竞争,LangChain 管组件,LangGraph 管流程控制 |
| 关键高级特性 | Checkpointer(短期记忆/断点续传)、Store(长期记忆/跨会话)、Multi-Agent |
| 入门路径 | 从 StateGraph 开始,定义状态、编写节点、添加边、编译运行 |
LangGraph 的出现,标志着 AI Agent 开发从"线性链"迈向了"结构化图"的工程化阶段。通过 State、Node 和 Edge 的组合,它让复杂工作流的组织变得清晰可控。希望本文能帮助你理解 LangGraph 的核心概念,并在实际项目中灵活运用。下一站,不妨从一个简单的 StateGraph 开始动手实践,逐步探索其强大的多智能体编排能力。
参考资料
- LangGraph:基于有向图的智能体编排框架深度解析
- 从 LangChain 到 LangGraph 构建可控 Agent 的工程实践
- LangGraph 快速入门
- 从0到1学LangGraph:解锁核心组件全解析
- Spring AI Alibaba、Dify、LangGraph 与 LangChain 综合对比分析报告
- 全面测评LangChain vs LangGraph:谁是agent落地最优解
- 时间旅行者 (Persistence & Checkpointing)--Langraph
- LangGraph Memory 机制
- Multi-Agent全面爆发!一文详解多智能体核心架构及LangGraph框架