智能体框架与平台 / LangChain 与 LangGraph
CHAPTER 07 · TOPIC 01

LangChain 与 LangGraph

LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其团队推出的有状态 Agent 编排引擎。两者构成了从简单链式调用到复杂多智能体系统的完整开发栈。本章深入讲解两者的核心概念、架构设计和实战用法。

一句话理解

LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其团队推出的有状态 Agent 编排引擎。两者构成了从简单链式调用到复杂多智能体系统的完整开发栈。本章深入讲解两者的核心概念、架构设计和实战用法。

阅读前置

理解单体与多智能体架构

本文关注

LangChain 核心架构、LangGraph 深度解析、LangGraph 高级功能

所在知识层

工程框架 · 智能体框架与平台

文章导航
主教学视觉LangChain 与 LangGraph · 知识结构

点击图中节点可定位到对应正文。

核心主题关系与流向

引言

LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其团队推出的有状态 Agent 编排引擎。两者构成了从简单链式调用到复杂多智能体系统的完整开发栈。本章深入讲解两者的核心概念、架构设计和实战用法。


1. LangChain 核心架构

1.1 发展历程

TEXT
2022.10  LangChain 发布,聚焦 LLM 链式调用
2023.03  加入 Agent 和工具能力
2023.08  引入 LCEL(LangChain Expression Language)
2023.11  拆分为 langchain-core / langchain-community / 合作伙伴包
2024.01  LangGraph 成为官方 Agent 编排方案
2024.06  LangChain v0.2 稳定版发布
2025     LangGraph Platform 上线

1.2 包结构

语义 SVG 重绘LangChain 与 LangGraph

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

输入与上下文langchain-core 核心抽象(无外部依赖…系统核心语言模型接口(BaseChatModel)工具接口(BaseTool输出解析器(BaseOutputParser)工具、结果与反馈Runnable 协议(可组合的单元)回调系统
查看原文结构
├── langchain-core       # 核心抽象(无外部依赖)
│   ├── 语言模型接口(BaseChatModel)
│   ├── 工具接口(BaseTool)
│   ├── 输出解析器(BaseOutputParser)
│   ├── Runnable 协议(可组合的单元)
│   └── 回调系统
│
├── langchain            # 高层组件(链、Agent、检索器)
├── langchain-community  # 社区集成(150+ 第三方集成)
├── langchain-openai     # OpenAI 官方集成
├── langchain-anthropic  # Anthropic 官方集成
├── langchain-google     # Google 官方集成
└── langgraph            # 有状态 Agent 编排引擎

1.3 LCEL(LangChain Expression Language)

LCEL 是 LangChain 的核心编程范式,用 | 管道符组合组件:

PYTHON
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 每个组件都是一个 Runnable
prompt = ChatPromptTemplate.from_template("用一句话解释什么是 {topic}")
model = ChatOpenAI(model="gpt-4o")
parser = StrOutputParser()

# 用 | 组合成链
chain = prompt | model | parser

# 同步调用
result = chain.invoke({"topic": "量子计算"})

# 异步调用
result = await chain.ainvoke({"topic": "量子计算"})

# 流式输出
for chunk in chain.stream({"topic": "量子计算"}):
    print(chunk, end="", flush=True)

# 批量调用
results = chain.batch([
    {"topic": "量子计算"},
    {"topic": "区块链"},
    {"topic": "神经网络"}
])

2. LangGraph 深度解析

2.1 为什么需要 LangGraph

语义 SVG 重绘LangChain 与 LangGraph

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

查看原文结构
LangChain Chain 的局限:
  线性链: A → B → C(无法分支、循环)
  固定流程: 编译时确定,运行时不能改变

2.2 核心概念

语义 SVG 重绘LangChain 与 LangGraph · 结构 1

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

2. 定义节点(每个节点是一个函数)def plannode(state:…dict:"""规划节点:LLM 制定执行计划"…plan = llm.generate…return "currentplan…
查看原文结构
# 2. 定义节点(每个节点是一个函数)
def plan_node(state: AgentState) -> dict:
    """规划节点:LLM 制定执行计划"""
    plan = llm.generate(f"为以下任务制定计划: {state['messages'][-1]}")
    return {"current_plan": parse_plan(plan), "status": "planning"}
语义 SVG 重绘LangChain 与 LangGraph · 结构 2

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

def executenode(sta…dict:"""执行节点:执行当前步骤"""step = state "curre…result = executeste…return "results": s…
查看原文结构
def execute_node(state: AgentState) -> dict:
    """执行节点:执行当前步骤"""
    step = state["current_plan"][0]
    result = execute_step(step)
    return {"results": {step: result}, "status": "executing"}
语义 SVG 重绘LangChain 与 LangGraph · 结构 3

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

def reviewnode(stat…dict:"""审查节点:检查结果质量"""quality = llm.gener…return "status": "r…
查看原文结构
def review_node(state: AgentState) -> dict:
    """审查节点:检查结果质量"""
    quality = llm.generate(f"评估以下结果的质量: {state['results']}")
    return {"status": "reviewing", "review": quality}
语义 SVG 重绘LangChain 与 LangGraph · 结构 4

根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。

3. 定义条件路由def shouldcontinue(…str:"""根据审查结果决定下一步"""if state "status" =…return "end"
查看原文结构
# 3. 定义条件路由
def should_continue(state: AgentState) -> str:
    """根据审查结果决定下一步"""
    if state["status"] == "approved":
        return "end"
    elif state["status"] == "needs_revision":
        return "plan"
    return "execute"

2.3 检查点与持久化

PYTHON
from langgraph.checkpoint.memory import MemorySaver
from langgraph.checkpoint.sqlite import SqliteSaver

# 内存检查点(开发用)
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

# SQLite 检查点(生产用)
with SqliteSaver.from_conn_string("checkpoints.db") as checkpointer:
    app = graph.compile(checkpointer=checkpointer)

# 运行时指定 thread_id,支持断点续传
config = {"configurable": {"thread_id": "user-123"}}

# 第一次运行
result = app.invoke({"messages": ["你好"]}, config)

# 后续运行自动恢复上下文
result = app.invoke({"messages": ["继续刚才的话题"]}, config)

# 时间旅行:回溯到历史状态
history = app.get_state_history(config)
past_state = app.get_state(config, history[-2].config)  # 上一步的状态

# 从历史状态分叉
app.update_state(past_state.config, {"messages": ["换一种方法试试"]})

2.4 人机协作(Human-in-the-Loop)

PYTHON
from langgraph.types import interrupt, Command

def sensitive_action_node(state: AgentState):
    """需要人类确认的敏感操作"""
    action = state["pending_action"]
    
    # 中断执行,等待人类确认
    human_response = interrupt({
        "question": f"确认执行以下操作?\n{action}",
        "options": ["确认", "修改", "取消"]
    })
    
    if human_response["choice"] == "确认":
        result = execute_action(action)
        return {"results": result, "status": "completed"}
    elif human_response["choice"] == "修改":
        return {"status": "needs_revision", "feedback": human_response["feedback"]}
    else:
        return {"status": "cancelled"}

# 编译时指定中断点
app = graph.compile(
    checkpointer=checkpointer,
    interrupt_before=["sensitive_action"]  # 在执行此节点前暂停
)

# 运行到中断点
result = app.invoke(initial_state, config)

# 人类确认后继续
app.invoke(Command(resume={"choice": "确认"}), config)

3. LangGraph 高级功能

3.1 子图(Subgraph)

PYTHON
# 将复杂逻辑封装为子图
def create_research_subgraph():
    """创建一个研究子图"""
    sub = StateGraph(ResearchState)
    sub.add_node("search", search_node)
    sub.add_node("analyze", analyze_node)
    sub.add_node("summarize", summarize_node)
    
    sub.add_edge(START, "search")
    sub.add_edge("search", "analyze")
    sub.add_edge("analyze", "summarize")
    sub.add_edge("summarize", END)
    
    return sub.compile()

# 在父图中使用子图
research = create_research_subgraph()

parent = StateGraph(MainState)
parent.add_node("research", research)  # 子图作为节点
parent.add_node("write", writing_node)
parent.add_edge(START, "research")
parent.add_edge("research", "write")
parent.add_edge("write", END)

3.2 多 Agent 图

PYTHON
# 多 Agent 协作图
graph = StateGraph(TeamState)

graph.add_node("researcher", researcher_agent)
graph.add_node("writer", writer_agent)
graph.add_node("reviewer", reviewer_agent)
graph.add_node("supervisor", supervisor_agent)

# Supervisor 决定下一个执行的 Agent
graph.add_conditional_edges("supervisor", route_to_agent, {
    "researcher": "researcher",
    "writer": "writer",
    "reviewer": "reviewer",
    "done": END
})

graph.add_edge(START, "supervisor")
graph.add_edge("researcher", "supervisor")
graph.add_edge("writer", "supervisor")
graph.add_edge("reviewer", "supervisor")

3.3 流式输出

PYTHON
# 流式获取每个节点的输出
for event in app.stream({"messages": ["分析数据"]}, config, stream_mode="updates"):
    node_name = list(event.keys())[0]
    node_output = event[node_name]
    print(f"[{node_name}] {node_output}")

# 流式获取 LLM 输出(token by token)
for event in app.stream({"messages": ["分析数据"]}, config, stream_mode="messages"):
    if hasattr(event, "content"):
        print(event.content, end="", flush=True)

4. LangGraph Platform

4.1 部署方式

PYTHON
# langgraph.json - 项目配置
{
    "dependencies": ["."],
    "graphs": {
        "agent": "./graph.py:make_graph"
    },
    "env": ".env"
}

# 本地开发
langgraph dev          # 启动开发服务器
langgraph up           # Docker 部署

# 云端部署
langgraph deploy       # 部署到 LangGraph Cloud

4.2 LangGraph 与 LangSmith 集成

TEXT
LangSmith 提供:
- Trace 可视化:完整查看每一步的输入输出
- 评估框架:自动化测试 Agent 质量
- 数据集管理:管理测试用例
- 在线监控:实时查看 Agent 性能
- A/B 测试:对比不同版本的 Agent

5. 本章小结

组件定位核心能力
LangChainLLM 应用开发框架链式调用、工具集成、RAG
LangGraphAgent 编排引擎状态图、循环、检查点、人机协作
LCEL编程范式Runnable 协议、管道组合
LangSmith可观测性平台追踪、评估、监控
LangGraph Platform部署平台开发、Docker、云端部署

相关章节


延伸阅读

  • LangChain Documentation: python.langchain.com/docs
  • LangGraph Documentation: langchain-ai.github.io/langgraph
  • LangSmith: smith.langchain.com
  • Harrison Chase (2024). "LangGraph: Building Stateful Multi-Agent Applications"