如果你正在学习 LangGraph,想要构建功能强大的 LLM 应用,但面对众多教程不知道从哪里开始,那么这篇文章就是为你准备的。我们将深入解析 LangGraph 官方提供的 7 个核心教程,帮助你理解每个教程的价值、适用场景和学习顺序。
什么是编排(Orchestration)?
在深入教程之前,我们先理解一下"编排"这个概念。
**编排(Orchestration)**是指将多个独立的组件组织成一个协调工作的系统。在 LangGraph 的语境下,编排意味着:
- 🎯 定义工作流:将应用分解为清晰的步骤
- 🔄 管理状态:在工作流中维护和传递状态
- 🎛️ 控制执行:决定每个步骤的执行顺序和条件
- 🧩 组合组件:将 LangChain 的各种组件组合成完整应用
想象一下,编排就像指挥一支交响乐团。每个乐器(组件)都有自己的作用,但需要一个指挥(LangGraph)来协调它们,让它们和谐地演奏出美妙的音乐(完整的应用)。
LangGraph 提供了强大的编排能力,让你能够构建从简单的聊天机器人到复杂的多步骤检索系统等各种应用。
教程概览
LangGraph 官方提供了 7 个核心教程,每个教程都专注于一个特定的应用场景:
- 聊天机器人 - 构建带记忆功能的对话系统
- 代理 - 构建能使用工具的智能代理
- 检索增强生成(RAG)第一部分 - 基础的文档问答系统
- 检索增强生成(RAG)第二部分 - 增强的 RAG 系统(带记忆和多步骤检索)
- 基于 SQL 的问答 - 能理解和执行数据库查询的系统
- 摘要生成 - 长文本摘要生成系统
- 基于图数据库的问答 - 使用图数据库的问答系统
让我们逐一深入解析每个教程。
教程一:聊天机器人(Chatbots)
核心目标
构建一个包含记忆功能的聊天机器人,能够记住对话历史并在多轮对话中维持上下文。
为什么重要?
传统的聊天机器人往往是无状态的,每次对话都是独立的。但在实际应用中,我们经常需要:
- 记住用户之前说过什么
- 理解上下文引用("它"、"那个"等代词)
- 在对话中积累信息
- 提供个性化的响应
核心能力
typescript
// 示例:带记忆的聊天机器人
const chatbot = new StateGraph(ChatState)
.addNode('memory', updateMemory) // 更新记忆
.addNode('respond', generateResponse) // 生成响应
.addEdge('memory', 'respond')
.compile();
关键能力:
- ✅ 对话历史管理:保存和检索之前的对话
- ✅ 上下文理解:基于历史理解当前问题
- ✅ 状态持久化:支持跨会话的状态保存
- ✅ 流式响应:实时输出生成的内容
适用场景
| 场景 | 说明 |
|---|---|
| 客服机器人 | 记住用户的问题历史,提供更好的服务 |
| 个人助手 | 了解用户的偏好和习惯 |
| 教育辅导 | 跟踪学习进度和对话历史 |
| 对话式应用 | 任何需要多轮交互的应用 |
学习要点
- 状态管理:理解如何在 LangGraph 中定义和管理状态
- 记忆组件:学习使用 LangChain 的记忆组件(BufferMemory、ConversationSummaryMemory 等)
- 图构建:掌握如何构建简单的线性工作流
难度评估
⭐⭐☆☆☆(2/5)
适合初学者,是理解 LangGraph 基础概念的最佳起点。
教程二:代理(Agents)
核心目标
使用 LangGraph.js 构建一个能够与外部工具交互的智能代理,能够自主决策何时使用哪个工具。
为什么重要?
纯粹的 LLM 只能生成文本,但在实际应用中,我们需要:
- 搜索网络获取最新信息
- 执行计算和数据分析
- 调用外部 API
- 操作文件系统
- 执行复杂的多步骤任务
代理让 LLM 从"只能说话"变成"能做事"。
核心能力
typescript
// 示例:带工具调用的代理
const agent = new StateGraph(AgentState)
.addNode('think', analyzeTask) // 分析任务
.addNode('execute', executeTool) // 执行工具
.addNode('decide', decideNextStep) // 决定下一步
.addConditionalEdges('decide', routeDecision)
.compile();
关键能力:
- ✅ 工具选择:根据任务自动选择合适的工具
- ✅ 工具执行:调用外部工具并获取结果
- ✅ 决策循环:根据结果决定是否需要更多步骤
- ✅ 错误处理:处理工具调用失败的情况
适用场景
| 场景 | 说明 |
|---|---|
| 信息查询助手 | 搜索网络、查询数据库、调用 API |
| 自动化任务 | 执行文件操作、数据处理、报告生成 |
| 智能工作流 | 复杂的多步骤自动化流程 |
| 工具集成平台 | 将多个工具整合到一个智能接口 |
学习要点
- 工具定义:学习如何定义和使用工具
- 条件分支:掌握如何在图中添加条件逻辑
- 循环控制:理解如何实现代理的思考-行动循环
- 错误恢复:学习处理工具调用失败的情况
难度评估
⭐⭐⭐☆☆(3/5)
需要理解工具调用和决策逻辑,适合有基础的开发者。
教程三:检索增强生成(RAG)第一部分
核心目标
构建一个使用你自己的文档来指导回答的应用,实现基础的检索增强生成系统。
为什么重要?
LLM 的知识有截止日期,而且可能不了解你的特定领域知识。RAG 解决了这个问题:
- 使用你自己的文档作为知识源
- 实时检索相关信息
- 基于检索结果生成准确的答案
- 可以随时更新知识库
核心能力
typescript
// 示例:基础 RAG 系统
const ragApp = new StateGraph(RAGState)
.addNode('retrieve', retrieveDocuments) // 检索相关文档
.addNode('generate', generateAnswer) // 生成答案
.addEdge('retrieve', 'generate')
.compile();
关键能力:
- ✅ 文档加载:从各种来源加载文档
- ✅ 文档分块:将长文档切分成可检索的块
- ✅ 向量存储:使用向量数据库存储文档
- ✅ 相似度检索:基于语义相似度检索相关文档
- ✅ 上下文增强:将检索结果作为上下文生成答案
工作流程
用户问题
↓
向量检索(找到相关文档块)
↓
组合上下文(检索结果 + 用户问题)
↓
LLM 生成答案(基于上下文)
↓
返回答案
适用场景
| 场景 | 说明 |
|---|---|
| 企业内部知识库 | 基于公司文档回答问题 |
| 文档助手 | 帮助用户理解和使用文档 |
| 技术支持系统 | 基于产品文档提供技术支持 |
| 法律文档助手 | 基于法律文档回答问题 |
学习要点
- 向量存储:理解向量数据库的工作原理
- 文档处理:学习文档加载、分块和处理
- 检索策略:掌握相似度检索的基本方法
- 提示工程:学会如何构造有效的提示词
难度评估
⭐⭐⭐☆☆(3/5)
需要理解向量检索和 RAG 的基本概念,是构建知识库应用的基础。
教程四:检索增强生成(RAG)第二部分
核心目标
构建一个包含用户交互记忆和多步骤检索的增强型 RAG 应用。
为什么重要?
基础的 RAG 系统存在一些局限性:
- 每次问答都是独立的,无法利用之前的对话
- 单次检索可能不够,需要多步骤检索
- 无法处理复杂的、需要多次检索的问题
RAG 第二部分解决了这些问题,让系统更加智能和实用。
核心能力
typescript
// 示例:增强的 RAG 系统
const enhancedRAG = new StateGraph(EnhancedRAGState)
.addNode('analyze', analyzeQuery) // 分析查询
.addNode('retrieve', retrieveDocs) // 检索文档
.addNode('evaluate', evaluateResults) // 评估结果
.addNode('refine', refineQuery) // 精炼查询
.addNode('generate', generateAnswer) // 生成答案
.addConditionalEdges('evaluate', routeByQuality)
.compile();
新增能力:
- ✅ 对话记忆:记住用户之前的对话和问题
- ✅ 查询重写:基于对话历史重写查询
- ✅ 多步骤检索:如果第一次检索不够,进行多次检索
- ✅ 结果评估:评估检索结果的质量
- ✅ 迭代改进:基于评估结果改进检索策略
工作流程
用户问题(带历史上下文)
↓
查询分析(理解意图,提取关键信息)
↓
初始检索(第一次检索相关文档)
↓
结果评估(评估检索质量)
├─ 质量足够 → 生成答案
└─ 质量不足 → 精炼查询 → 再次检索
↓
生成答案(基于所有检索结果)
↓
保存对话历史
适用场景
| 场景 | 说明 |
|---|---|
| 复杂研究助手 | 需要多次检索和多轮对话的复杂查询 |
| 上下文相关问答 | 问题依赖之前对话的上下文 |
| 深度文档分析 | 需要深入挖掘文档内容 |
| 个性化知识助手 | 根据用户历史提供个性化回答 |
与第一部分的对比
| 特性 | RAG 第一部分 | RAG 第二部分 |
|---|---|---|
| 记忆 | ❌ 无状态 | ✅ 有状态,记住对话历史 |
| 检索策略 | 单次检索 | 多步骤检索 |
| 查询处理 | 直接使用用户问题 | 查询分析和重写 |
| 结果评估 | ❌ 无评估 | ✅ 评估检索质量 |
| 复杂度 | 简单 | 复杂 |
学习要点
- 状态管理:在 RAG 系统中集成记忆功能
- 查询分析:使用结构化输出分析用户查询
- 元数据过滤:基于元数据精准检索文档
- 多步骤工作流:构建复杂的条件分支流程
- 自我评估:让系统评估自己的检索质量
难度评估
⭐⭐⭐⭐☆(4/5)
需要理解复杂的多步骤流程和状态管理,适合有一定经验的开发者。
教程五:基于 SQL 的问答
核心目标
构建一个能够理解和执行 SQL 查询的问答系统,让用户用自然语言查询数据库。
为什么重要?
数据库包含了大量有价值的信息,但 SQL 查询语言对非技术用户来说太难了。这个系统让任何人都能用自然语言查询数据库:
- 理解自然语言问题
- 自动生成 SQL 查询
- 执行查询并获取结果
- 用自然语言解释结果
核心能力
typescript
// 示例:SQL 问答系统
const sqlQA = new StateGraph(SQLState)
.addNode('analyze', analyzeQuestion) // 分析问题
.addNode('generate', generateSQL) // 生成 SQL
.addNode('validate', validateSQL) // 验证 SQL
.addNode('execute', executeQuery) // 执行查询
.addNode('explain', explainResults) // 解释结果
.addEdge('analyze', 'generate')
.addEdge('generate', 'validate')
.addConditionalEdges('validate', routeByValidation)
.compile();
关键能力:
- ✅ 模式理解:理解数据库的结构和表关系
- ✅ SQL 生成:将自然语言转换为 SQL 查询
- ✅ SQL 验证:验证 SQL 的正确性和安全性
- ✅ 查询执行:安全地执行 SQL 查询
- ✅ 结果解释:用自然语言解释查询结果
工作流程
sql
用户问题:"2023年销售额最高的产品是什么?"
↓
分析问题(提取实体、意图、条件)
↓
理解数据库模式(表结构、字段、关系)
↓
生成 SQL(SELECT product FROM sales WHERE year=2023 ORDER BY revenue DESC LIMIT 1)
↓
验证 SQL(检查语法、安全性)
↓
执行查询(获取结果)
↓
解释结果(用自然语言解释数据)
适用场景
| 场景 | 说明 |
|---|---|
| 数据分析助手 | 让业务人员用自然语言查询数据 |
| 商业智能工具 | 自助式数据查询和分析 |
| 数据库接口 | 为非技术用户提供数据库访问接口 |
| 报表生成 | 自动生成数据报表 |
安全考虑
⚠️ 重要: SQL 生成系统必须考虑安全性:
- SQL 注入防护:防止恶意 SQL 注入
- 查询限制:限制查询的复杂度和资源消耗
- 权限控制:确保用户只能访问授权的数据
- 查询审核:记录和审核所有查询
学习要点
- 文本到 SQL:学习如何将自然语言转换为 SQL
- 数据库模式理解:理解如何让 LLM 理解数据库结构
- 错误处理:处理 SQL 生成和执行错误
- 安全性:实现安全的 SQL 执行机制
难度评估
⭐⭐⭐☆☆(3/5)
需要理解 SQL 和数据库概念,以及文本到 SQL 的转换技术。
教程六:摘要生成(Summarization)
核心目标
构建一个能够生成(可能很长的)文本摘要的系统,提取关键信息并生成简洁的摘要。
为什么重要?
我们每天面对大量信息:
- 长文档需要快速理解
- 会议记录需要总结
- 新闻文章需要摘要
- 学术论文需要概述
摘要生成系统帮助我们快速获取关键信息,节省时间。
核心能力
typescript
// 示例:摘要生成系统
const summarizer = new StateGraph(SummaryState)
.addNode('chunk', chunkDocument) // 分块处理
.addNode('summarize', summarizeChunk) // 生成摘要
.addNode('merge', mergeSummaries) // 合并摘要
.addNode('refine', refineSummary) // 精炼摘要
.addEdge('chunk', 'summarize')
.addEdge('summarize', 'merge')
.addEdge('merge', 'refine')
.compile();
关键能力:
- ✅ 长文本处理:处理超出模型上下文长度的文档
- ✅ 分块摘要:将长文档分块后分别摘要
- ✅ 摘要合并:将多个块摘要合并成整体摘要
- ✅ 摘要精炼:生成最终的、精简的摘要
- ✅ 多种摘要类型:支持提取式、生成式、混合式摘要
工作流程
长文档(超过模型上下文)
↓
文档分块(将文档分成多个块)
↓
并行摘要(为每个块生成摘要)
↓
合并摘要(将多个块摘要合并)
↓
精炼摘要(生成最终的简洁摘要)
↓
返回摘要
摘要类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 提取式摘要 | 直接提取原文中的句子 | 新闻摘要、关键信息提取 |
| 生成式摘要 | 重新组织语言生成摘要 | 抽象总结、个性化摘要 |
| 混合式摘要 | 结合提取和生成 | 平衡准确性和流畅性 |
适用场景
| 场景 | 说明 |
|---|---|
| 文档摘要 | 长文档、报告、论文的摘要 |
| 会议记录 | 会议讨论的要点总结 |
| 新闻摘要 | 新闻文章的快速浏览 |
| 邮件摘要 | 长邮件的关键信息提取 |
| 阅读助手 | 帮助用户快速理解长文 |
学习要点
- 文档分块:学习如何处理超长文档
- 提示工程:掌握摘要生成的提示词技巧
- 摘要质量:理解如何评估和提升摘要质量
- 并行处理:学习如何并行处理多个块
难度评估
⭐⭐☆☆☆(2/5)
相对简单,主要关注文档处理和提示词设计。
教程七:基于图数据库的问答
核心目标
构建一个使用图数据库来回答问题的系统,能够查询和推理复杂的关系网络。
为什么重要?
关系型数据库擅长存储结构化数据,但在处理复杂关系时受限。图数据库专门为关系数据设计:
- 查询复杂的多跳关系
- 发现隐藏的连接模式
- 推理实体之间的关系
- 处理知识图谱数据
核心能力
typescript
// 示例:图数据库问答系统
const graphQA = new StateGraph(GraphState)
.addNode('analyze', analyzeQuestion) // 分析问题
.addNode('generate', generateCypher) // 生成 Cypher 查询
.addNode('execute', executeQuery) // 执行图查询
.addNode('reason', reasonAboutResults) // 推理结果
.addNode('explain', explainAnswer) // 解释答案
.addEdge('analyze', 'generate')
.addEdge('generate', 'execute')
.addEdge('execute', 'reason')
.addEdge('reason', 'explain')
.compile();
关键能力:
- ✅ 图结构理解:理解图数据库的节点和边结构
- ✅ Cypher 生成:将自然语言转换为图查询语言(如 Cypher)
- ✅ 关系查询:查询多跳关系网络
- ✅ 关系推理:基于图结构进行推理
- ✅ 结果解释:用自然语言解释图查询结果
工作流程
css
用户问题:"找到与 Alice 有共同朋友的所有人"
↓
分析问题(提取实体、关系、查询意图)
↓
理解图结构(节点类型、关系类型、属性)
↓
生成 Cypher 查询
MATCH (alice:Person {name: 'Alice'})-[:FRIEND]->(friend)-[:FRIEND]->(other)
RETURN DISTINCT other
↓
执行查询(获取结果节点)
↓
推理关系(分析结果之间的关系)
↓
生成答案(用自然语言解释结果)
适用场景
| 场景 | 说明 |
|---|---|
| 知识图谱问答 | 基于知识图谱回答问题 |
| 社交网络分析 | 查询社交关系网络 |
| 推荐系统 | 基于关系网络进行推荐 |
| 企业知识管理 | 查询组织内的知识关系 |
| 药物发现 | 查询分子和蛋白质的关系网络 |
图数据库的优势
| 优势 | 说明 |
|---|---|
| 关系查询 | 轻松查询多跳关系 |
| 模式发现 | 发现隐藏的关系模式 |
| 灵活结构 | 动态添加新节点和关系 |
| 高性能 | 关系查询性能优于关系型数据库 |
学习要点
- 图数据库概念:理解节点、边、属性的概念
- Cypher 查询语言:学习图查询语言的基本语法
- 文本到 Cypher:掌握如何将自然语言转换为图查询
- 关系推理:理解如何在图结构上进行推理
难度评估
⭐⭐⭐⭐☆(4/5)
需要理解图数据库和图查询语言,适合有数据库基础的开发者。
学习路径建议
现在你已经了解了所有 7 个教程,如何选择学习顺序?这里提供几种学习路径:
路径一:循序渐进(推荐初学者)
markdown
1. 聊天机器人 ⭐⭐
↓ 理解基础概念
2. RAG 第一部分 ⭐⭐⭐
↓ 理解检索和生成
3. 代理 ⭐⭐⭐
↓ 理解工具使用
4. RAG 第二部分 ⭐⭐⭐⭐
↓ 理解复杂工作流
5. 其他教程(根据需求选择)
优势: 由浅入深,逐步建立知识体系
路径二:应用导向(推荐有明确目标的开发者)
如果你要构建文档问答系统:
markdown
1. RAG 第一部分 → 2. RAG 第二部分
如果你要构建数据分析工具:
markdown
1. SQL 问答 → 2. 代理(集成更多工具)
如果你要构建知识图谱应用:
markdown
1. 图数据库问答 → 2. RAG 第二部分(结合文档和图数据)
优势: 直接针对需求,快速上手
路径三:技能导向(推荐想全面掌握的开发者)
理解状态管理:
markdown
1. 聊天机器人 → 2. RAG 第二部分
理解工具集成:
markdown
1. 代理 → 2. SQL 问答 → 3. 图数据库问答
理解文本处理:
markdown
1. RAG 第一部分 → 2. 摘要生成
优势: 深入学习特定技能
路径四:快速实践(推荐快速上手的开发者)
markdown
1. 聊天机器人(最快上手)
↓
2. RAG 第一部分(最实用)
↓
3. 根据实际需求选择其他教程
优势: 快速构建可用应用
教程难度对比
| 教程 | 难度 | 所需前置知识 | 预计学习时间 |
|---|---|---|---|
| 聊天机器人 | ⭐⭐ | LangGraph 基础 | 2-3 小时 |
| RAG 第一部分 | ⭐⭐⭐ | 向量检索基础 | 3-4 小时 |
| 代理 | ⭐⭐⭐ | 工具调用概念 | 3-4 小时 |
| 摘要生成 | ⭐⭐ | 文本处理基础 | 2-3 小时 |
| SQL 问答 | ⭐⭐⭐ | SQL 基础 | 4-5 小时 |
| RAG 第二部分 | ⭐⭐⭐⭐ | RAG 第一部分 + 状态管理 | 5-6 小时 |
| 图数据库问答 | ⭐⭐⭐⭐ | 图数据库基础 | 5-6 小时 |
技术要点总结
核心概念
通过学习这些教程,你将掌握:
- 状态管理:如何在 LangGraph 中定义和管理状态
- 图构建:如何构建节点和边的工作流
- 条件分支:如何实现动态的执行路径
- 工具集成:如何集成外部工具和 API
- 记忆机制:如何实现对话记忆和上下文管理
- 检索策略:如何实现高效的文档检索
- 错误处理:如何处理异常和错误情况
最佳实践
- 从简单开始:先完成聊天机器人教程,理解基础
- 逐步深入:按照难度顺序学习,不要跳跃
- 动手实践:每学完一个教程,自己实现一个变体
- 理解原理:不仅要会用,还要理解为什么这样设计
- 组合应用:尝试将多个教程的技术组合使用
常见问题
Q1: 我应该按什么顺序学习?
A: 建议从"聊天机器人"开始,然后学习"RAG 第一部分",这两个教程涵盖了 LangGraph 的核心概念。之后可以根据你的具体需求选择其他教程。
Q2: 需要哪些前置知识?
A:
- 基础的 JavaScript/TypeScript 知识
- 对 LLM 的基本理解
- 对 LangChain 基础组件的了解(Models, Prompts, Chains)
Q3: 每个教程需要多长时间?
A: 根据难度不同,大约 2-6 小时。简单教程(如聊天机器人)2-3 小时,复杂教程(如 RAG 第二部分)5-6 小时。
Q4: 我应该全部学习吗?
A: 不一定。建议先学习与你的应用场景相关的教程。如果你要构建文档问答系统,重点学习 RAG 教程;如果要构建数据分析工具,重点学习 SQL 问答教程。
Q5: 学习完这些教程后能做什么?
A: 你将能够:
- 构建复杂的 LLM 应用
- 理解 LangGraph 的工作机制
- 根据需求定制自己的工作流
- 解决实际的业务问题
下一步行动
现在你已经了解了所有教程,建议你:
- 选择一个教程开始:根据你的需求和兴趣选择一个教程
- 完成官方教程:按照 LangGraph 官方文档完成教程
- 实践和扩展:尝试修改教程,添加自己的功能
- 分享和交流:在社区中分享你的学习经验和问题
记住,学习编程最重要的是动手实践。不要只是阅读,要真正去写代码、运行、调试、改进。
总结
LangGraph 的 7 个核心教程覆盖了 LLM 应用开发的主要场景:
- 💬 对话系统:聊天机器人、RAG 第二部分
- 🤖 智能代理:自主决策和工具使用
- 📚 知识检索:RAG、SQL 问答、图数据库问答
- 📝 文本处理:摘要生成
每个教程都有其独特的价值和应用场景。通过系统学习这些教程,你将掌握使用 LangGraph 构建复杂 LLM 应用的完整技能。
无论你是初学者还是有经验的开发者,都可以从这些教程中受益。关键是选择适合你的学习路径,并持续实践和改进。
开始你的 LangGraph 学习之旅吧! 🚀
参考资源: