概述
LangGraph 和 LangChain 都属于 LangChain 生态系统,但它们的定位和使用场景有明显区别。本文档详细阐述两者的关系、差异和选择建议。
一、核心定位
LangGraph:底层编排框架
LangGraph 是非常底层 的框架,完全专注于代理编排(Agent Orchestration)。
特点:
- 🔧 提供基础构建块,而非完整解决方案
- 🎯 完全控制工作流的每个细节
- 🏗️ 需要手动定义节点、边和状态
类比:
ini
LangGraph = 建筑材料和工具(需要自己搭建)
LangChain Agents:高级抽象框架
LangChain Agents 提供预构建的架构,为常见的 LLM 和工具调用循环提供开箱即用的解决方案。
特点:
- 🚀 快速上手,几行代码即可创建代理
- 📦 预构建的标准代理模式(ReAct、OpenAI Functions 等)
- 🎁 开箱即用的解决方案
类比:
ini
LangChain Agents = 预制房屋(拎包入住)
二、代码示例对比
LangChain Agents(高级抽象)
typescript
import { createReactAgent } from 'langchain/agents';
// 3 行代码创建一个代理
const agent = await createReactAgent({
llm,
tools,
prompt,
});
// ✓ 简单快速
// ✗ 定制化有限
LangGraph(底层控制)
typescript
import { StateGraph } from '@langchain/langgraph';
// 需要手动定义每个节点和边
const workflow = new StateGraph(stateSchema)
.addNode('analyze', analyzeFunction)
.addNode('retrieve', retrieveFunction)
.addNode('decide', decideFunction)
.addConditionalEdges('decide', shouldContinue)
.addEdge('analyze', 'retrieve')
.addEdge('retrieve', 'decide')
.compile();
// ✓ 完全控制
// ✗ 需要更多代码
三、代理编排(Agent Orchestration)
什么是代理编排?
管理多个步骤、决策和工具调用的复杂流程。
典型的代理流程
css
用户问题
↓
[规划] 分解任务
↓
[执行步骤 1] 调用工具 A
↓
[评估] 是否需要更多信息?
├─ 是 → [执行步骤 2] 调用工具 B
└─ 否 → [生成] 返回最终答案
LangGraph 的优势: 让你可以精确控制每一步的逻辑和状态。
四、LangGraph 的核心能力
1. 持久化执行(Durable Execution)
解决的问题: 长时间运行的代理可能中断,需要保存和恢复状态。
typescript
// 保存状态到数据库
const checkpointer = new PostgresSaver(connectionString);
const app = workflow.compile({ checkpointer });
// 执行可以暂停和恢复
const result = await app.invoke(input, {
configurable: { thread_id: 'user-123' },
});
// 如果中断,可以从检查点恢复
const resumed = await app.invoke(null, {
configurable: { thread_id: 'user-123' },
});
应用场景:
- 长时间运行的任务
- 需要跨会话保持状态
- 防止意外中断导致进度丢失
2. 流式处理(Streaming)
实时输出每个步骤的结果
typescript
for await (const chunk of await app.stream(input, {
streamMode: 'updates',
})) {
console.log('当前步骤:', chunk);
// 实时显示进度给用户
}
应用场景:
- 提升用户体验(显示进度)
- 调试和监控
- 实时 UI 更新
3. 人机协同(Human-in-the-Loop)
在关键决策点暂停,等待人类输入
typescript
const workflow = new StateGraph(State)
.addNode('analyze', analyzeNode)
.addNode('human_approval', humanApprovalNode) // 人工审批节点
.addNode('execute', executeNode)
.addEdge('analyze', 'human_approval')
.addEdge('human_approval', 'execute')
.compile();
// 执行会在 human_approval 节点暂停
const state = await app.invoke(input);
// 人工审批后继续
const finalState = await app.invoke({
...state,
approved: true, // 人类的输入
});
应用场景:
- 敏感操作需要人工确认(如删除数据)
- 不确定的决策需要人类判断
- 质量控制和审核流程
4. 复杂的状态管理
typescript
const AgentState = Annotation.Root({
messages: Annotation<Message[]>({
reducer: (current, update) => current.concat(update),
}),
documents: Annotation<Document[]>,
currentStep: Annotation<string>,
retryCount: Annotation<number>,
metadata: Annotation<Record<string, any>>,
});
能力:
- 细粒度控制状态如何更新
- 支持复杂的状态合并逻辑
- 跨节点共享状态
5. 条件分支和循环
typescript
workflow
.addConditionalEdges('decide', state => {
if (state.confidence > 0.9) return 'finish';
if (state.retryCount < 3) return 'retry';
return 'human_review';
})
.addEdge('retry', 'analyze'); // 循环回去
能力:
- 动态决定下一步
- 实现循环和重试逻辑
- 根据状态灵活路由
五、使用建议
选择 LangChain Agents 如果:
- ✅ 刚开始学习代理
- ✅ 需要快速原型
- ✅ 使用标准的代理模式(如 ReAct、OpenAI Functions)
- ✅ 不需要复杂的自定义流程
示例:
typescript
import { createOpenAIFunctionsAgent } from 'langchain/agents';
// 标准代理,几行代码搞定
const agent = await createOpenAIFunctionsAgent({
llm,
tools: [searchTool, calculatorTool],
prompt,
});
选择 LangGraph 如果:
- ✅ 需要完全自定义工作流
- ✅ 需要复杂的条件分支
- ✅ 需要人机协同(human-in-the-loop)
- ✅ 需要持久化和恢复执行
- ✅ 需要精细的状态管理
示例:
typescript
import { StateGraph } from '@langchain/langgraph';
// 完全自定义的复杂流程
const workflow = new StateGraph(AgentState)
.addNode('researcher', researchNode)
.addNode('analyst', analysisNode)
.addNode('human_review', humanReviewNode)
.addConditionalEdges('analyst', state => {
if (state.confidence < 0.8) return 'human_review';
return 'finish';
})
.compile();
六、使用场景对比表
| 场景 | 推荐框架 | 原因 |
|---|---|---|
| 简单的问答机器人 | LangChain Agents | 标准模式即可 |
| 带工具调用的助手 | LangChain Agents | 预构建架构 |
| 多步骤研究助手 | LangGraph | 需要自定义流程 |
| 需要人工审批的自动化 | LangGraph | Human-in-the-loop |
| 长时间运行的工作流 | LangGraph | 持久化执行 |
| 复杂的多代理协作 | LangGraph | 完全控制编排 |
| 快速原型验证 | LangChain Agents | 快速上手 |
| 生产级复杂系统 | LangGraph | 灵活性和可靠性 |
七、关系与独立性
关系图示
scss
┌─────────────────────────────────────┐
│ LangChain 生态系统 │
├─────────────────────────────────────┤
│ │
│ 基础组件(Models, Tools, etc) │
│ ↑ ↑ │
│ │ │ │
│ ┌──────┴────┐ ┌────┴─────┐ │
│ │ LangChain │ │ LangGraph│ │
│ │ Agents │ │ │ │
│ │ │ │ │ │
│ │ (高级抽象) │ │ (底层控制)│ │
│ │ 预构建架构 │ │ 自定义编排 │ │
│ └───────────┘ └──────────┘ │
│ │
└─────────────────────────────────────┘
独立性说明
- LangGraph 可以独立使用:不依赖 LangChain
- 文档中常用 LangChain 组件:为了方便集成模型和工具
- 灵活组合:可以混合使用两者的优势
八、学习路径
推荐学习顺序
markdown
1. 学习基础组件
├─ Models(LLM 的基本使用)
├─ Tools(定义和调用工具)
└─ Prompts(提示工程)
2. 尝试 LangChain Agents
├─ 快速上手
├─ 理解标准模式
└─ 探索预构建架构
3. 识别限制和需求
├─ 评估现有方案是否满足需求
└─ 识别需要自定义的场景
4. 学习 LangGraph
├─ 状态管理
├─ 图的构建
├─ 复杂编排
└─ 企业级特性
为什么这个顺序?
- 基础组件是构建代理的基石
- LangChain Agents 让你快速理解代理的工作方式
- 识别限制帮助你判断是否需要 LangGraph
- LangGraph 在理解基础后更容易掌握
九、实际案例对比
案例 1:简单问答机器人
需求: 回答用户问题,可以调用搜索和计算器工具
推荐: LangChain Agents
typescript
import { createReactAgent } from 'langchain/agents';
const agent = await createReactAgent({
llm: new ChatOpenAI(),
tools: [searchTool, calculatorTool],
prompt: 'You are a helpful assistant',
});
const result = await agent.invoke({
input: 'What is the weather in Beijing?',
});
原因: 标准的 ReAct 模式完全满足需求,无需复杂定制。
案例 2:多步骤研究助手
需求:
- 分析用户问题
- 制定研究计划
- 执行多个搜索
- 综合信息
- 生成报告
- 需要人工审核
推荐: LangGraph
typescript
import { StateGraph } from '@langchain/langgraph';
const ResearchState = Annotation.Root({
question: Annotation<string>,
plan: Annotation<string[]>,
searches: Annotation<SearchResult[]>,
report: Annotation<string>,
approved: Annotation<boolean>,
});
const workflow = new StateGraph(ResearchState)
.addNode('analyze', analyzeQuestion)
.addNode('plan', createResearchPlan)
.addNode('search', executeSearches)
.addNode('synthesize', synthesizeInfo)
.addNode('human_review', humanReview)
.addNode('generate_report', generateReport)
.addEdge('analyze', 'plan')
.addEdge('plan', 'search')
.addEdge('search', 'synthesize')
.addEdge('synthesize', 'human_review')
.addConditionalEdges('human_review', state => {
return state.approved ? 'generate_report' : 'search';
})
.compile();
原因: 需要复杂的多步骤流程、人工审核和条件分支,LangGraph 提供更好的控制。
十、关键概念总结
LangGraph 的核心特点
| 特点 | 说明 |
|---|---|
| 底层 | 提供构建块而非完整解决方案 |
| 灵活 | 完全控制代理的执行流程 |
| 强大 | 持久化、流式、人机协同等企业级功能 |
| 独立 | 可以独立使用,不依赖 LangChain |
| 专注 | 专注于代理编排的底层能力 |
LangChain Agents 的核心特点
| 特点 | 说明 |
|---|---|
| 高级 | 提供预构建的完整解决方案 |
| 快速 | 几行代码即可创建代理 |
| 标准 | 实现常见的代理模式 |
| 易用 | 适合初学者和快速原型 |
| 集成 | 深度集成 LangChain 生态 |
十一、最佳实践
1. 从简单开始
- 先使用 LangChain Agents 验证想法
- 确认需求后再考虑 LangGraph
2. 渐进式迁移
typescript
// 阶段 1: LangChain Agent
const simpleAgent = createReactAgent({...});
// 阶段 2: 发现限制,部分使用 LangGraph
const hybridWorkflow = new StateGraph(...)
.addNode("agent", () => simpleAgent.invoke(...))
.addNode("custom_logic", customFunction)
...
// 阶段 3: 完全迁移到 LangGraph
const fullCustomWorkflow = new StateGraph(...)
.addNode(...)
...
3. 选择合适的抽象层次
- 不要过度工程化:如果 LangChain Agents 够用,就不要用 LangGraph
- 不要限制自己:如果需要复杂定制,不要勉强使用 LangChain Agents
4. 利用两者的优势
typescript
// 在 LangGraph 中使用 LangChain 组件
import { ChatOpenAI } from "langchain/chat_models/openai";
import { DuckDuckGoSearch } from "langchain/tools";
import { StateGraph } from "@langchain/langgraph";
// LangChain 提供模型和工具
const llm = new ChatOpenAI();
const searchTool = new DuckDuckGoSearch();
// LangGraph 提供编排
const workflow = new StateGraph(...)
.addNode("search", async (state) => {
const result = await searchTool.invoke(state.query);
return { searchResults: result };
})
.addNode("analyze", async (state) => {
const response = await llm.invoke(state.messages);
return { analysis: response.content };
})
...
十二、常见问题
Q: 我必须使用 LangChain 才能使用 LangGraph 吗?
A: 不需要。LangGraph 可以独立使用,但文档中常用 LangChain 组件是为了方便。你可以使用任何模型和工具。
Q: LangGraph 是 LangChain 的升级版吗?
A: 不是。它们解决不同的问题:
- LangChain Agents:快速构建标准代理
- LangGraph:深度定制复杂工作流
Q: 我应该从哪个开始学习?
A: 建议顺序:
- 学习基础组件(Models, Tools)
- 尝试 LangChain Agents(快速上手)
- 根据需求决定是否学习 LangGraph
Q: 可以同时使用两者吗?
A: 可以!你可以在 LangGraph 的节点中调用 LangChain Agents,或使用 LangChain 的组件。
十三、总结
核心要点
-
LangGraph = 底层 + 灵活 + 强大
- 完全控制工作流
- 企业级功能(持久化、流式、人机协同)
- 需要更多代码
-
LangChain Agents = 高级 + 快速 + 易用
- 预构建架构
- 快速原型
- 标准模式
-
选择依据
- 简单场景 → LangChain Agents
- 复杂定制 → LangGraph
- 不确定 → 先用 LangChain Agents
-
学习路径
- 基础组件 → LangChain Agents → LangGraph
-
可以组合使用
- 利用两者的优势
- 渐进式迁移