LangGraph 完全指南:从核心概念到实战应用

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 开始动手实践,逐步探索其强大的多智能体编排能力。

参考资料

  1. LangGraph:基于有向图的智能体编排框架深度解析
  2. 从 LangChain 到 LangGraph 构建可控 Agent 的工程实践
  3. LangGraph 快速入门
  4. 从0到1学LangGraph:解锁核心组件全解析
  5. Spring AI Alibaba、Dify、LangGraph 与 LangChain 综合对比分析报告
  6. 全面测评LangChain vs LangGraph:谁是agent落地最优解
  7. 时间旅行者 (Persistence & Checkpointing)--Langraph
  8. LangGraph Memory 机制
  9. Multi-Agent全面爆发!一文详解多智能体核心架构及LangGraph框架
相关推荐
ANnianStriver2 小时前
PetLumina 09 — 全局日期格式化与通知详情完善
ai·ai编程·路由·日期格式化
todoitbo2 小时前
Agent_Swarm_分布式协作的通信编排与节点发现机制分析
人工智能·分布式·ai·jiuwenswarm
Artech2 小时前
[MAF预定义ChatClient中间件-05]动态修改ChatOptions和请求消息
ai·agent·maf·agent管道
Z-D-K2 小时前
考验AI的“自我和意识“-AI对《红楼梦》后40回的改写(19)
人工智能·ai·aigc·交互·agi
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月7日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
FII工业富联科技服务2 小时前
智慧园区统一运营平台技术架构解析:全景3D世界模型+视频AI+物联网闭环实践
大数据·人工智能·物联网·3d·ai·制造
xixixi777772 小时前
英伟达 Cosmos3 开源物理世界模型、国内具身智能评测标准落地、宇树冲刺人形机器人第一股|具身智能进入技术、标准、商业化三重爆发期
大数据·人工智能·ai·机器人·开源·英伟达·人形机器人
Geek_Vison2 小时前
政务一网通APP如何引入AI能力,通过一个AI助手就能够调用所有的功能,实现对话即办事
人工智能·ai·小程序·uni-app·小程序容器