LangChain 与 LangGraph
LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其团队推出的有状态 Agent 编排引擎。两者构成了从简单链式调用到复杂多智能体系统的完整开发栈。本章深入讲解两者的核心概念、架构设计和实战用法。
一句话理解
LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其团队推出的有状态 Agent 编排引擎。两者构成了从简单链式调用到复杂多智能体系统的完整开发栈。本章深入讲解两者的核心概念、架构设计和实战用法。
阅读前置
理解单体与多智能体架构
本文关注
LangChain 核心架构、LangGraph 深度解析、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 包结构
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
├── 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
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
LangChain Chain 的局限:
线性链: A → B → C(无法分支、循环)
固定流程: 编译时确定,运行时不能改变2.2 核心概念
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 2. 定义节点(每个节点是一个函数)
def plan_node(state: AgentState) -> dict:
"""规划节点:LLM 制定执行计划"""
plan = llm.generate(f"为以下任务制定计划: {state['messages'][-1]}")
return {"current_plan": parse_plan(plan), "status": "planning"}根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def execute_node(state: AgentState) -> dict:
"""执行节点:执行当前步骤"""
step = state["current_plan"][0]
result = execute_step(step)
return {"results": {step: result}, "status": "executing"}根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def review_node(state: AgentState) -> dict:
"""审查节点:检查结果质量"""
quality = llm.generate(f"评估以下结果的质量: {state['results']}")
return {"status": "reviewing", "review": quality}根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 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 Cloud4.2 LangGraph 与 LangSmith 集成
TEXT
LangSmith 提供:
- Trace 可视化:完整查看每一步的输入输出
- 评估框架:自动化测试 Agent 质量
- 数据集管理:管理测试用例
- 在线监控:实时查看 Agent 性能
- A/B 测试:对比不同版本的 Agent5. 本章小结
| 组件 | 定位 | 核心能力 |
|---|---|---|
| LangChain | LLM 应用开发框架 | 链式调用、工具集成、RAG |
| LangGraph | Agent 编排引擎 | 状态图、循环、检查点、人机协作 |
| LCEL | 编程范式 | Runnable 协议、管道组合 |
| LangSmith | 可观测性平台 | 追踪、评估、监控 |
| LangGraph Platform | 部署平台 | 开发、Docker、云端部署 |
相关章节
- 单智能体架构 — LangChain/LangGraph 实现的正是单体 Agent 的规划-执行-审查循环
- 多智能体系统 — LangGraph 的 Supervisor 图对应多 Agent 编排理论
- CrewAI 与 AutoGen — 同章其他主流 Agent 框架,可对照选型
- MCP 协议详解 — 为 LangGraph Agent 标准化接入外部工具
延伸阅读
- 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"