我最早用 LangChain 只记住了链式调用,碰到分支和暂停恢复,才转向 LangGraph 的图结构。线性链和有状态图的分界,比背 API 重要。
Q1: LangChain 和 LangGraph 有什么区别?
2022年: LLM API 的原始形态
致命痛点: 复杂工作流难以编排
LangChain 的引入: 链式调用
RunnableSequence 串联成 Pipeline。每个步骤的输出是下一个步骤的输入,像管道一样流动。LangGraph 的引入: 图结构编排
StateGraph 定义有向图,节点是函数,边是条件跳转,支持任意复杂的拓扑结构。关键设计哲学: 从一次性请求到有状态工作流
🚫 没有 LangChain/LangGraph
✅ 引入 LangChain/LangGraph
Q2: LangGraph 的核心组件有哪些?
LangGraph 的本质是有状态的有向图,核心逻辑只有 4 个组件:LangChain 的历史演进
LangChain 由 Harrison Chase 于 2022 年 10 月开源,最初是一个 Python 库,用于简化 LLM 应用的开发。2023 年发布了 TypeScript 版本(LangChain.js)。2024 年,团队意识到链式调用的局限性(不支持循环、分支、状态管理),推出了 LangGraph 作为图结构编排层。现在 LangChain 定位为”LLM 应用的基础组件库”,LangGraph 定位为”有状态的 Agent 编排框架”。Annotation 和 Reducer 的类型系统
LangGraph 的Annotation 不只是定义字段——它定义了完整的类型系统。每个字段可以指定类型、默认值、合并策略(Reducer)。这让图的执行引擎在运行时知道怎么处理并行节点的状态冲突。
Q3: Send API 和 Conditional Edges 有什么区别?
基础梳理
专家视角深度剖析
很多人能说出”Send 用于并行”,但实际更在意的是:为什么不用Promise.all 手动并行?LangGraph 的 Send 比手动并行好在哪里?
- 状态自动管理:不用手动传参和合并,Reducer 自动处理
- 条件分支:可以根据结果决定下一步(
addConditionalEdges) - 可中断可恢复:可以加
interrupt节点等待人类审批 - 图结构可可视化:LangGraph Studio 可以看到图的执行过程
- 错误处理:节点失败可以重试或走备选路径(
addConditionalEdges根据错误状态路由)
Q4: RAG 是什么?怎么实现?
RAG(Retrieval-Augmented Generation):检索增强生成。 先检索相关文档,再把文档作为上下文给 LLM 回答。向量数据库的选择
向量数据库是 RAG 的基础设施。主流选择包括:RAG 的高级优化策略
基础 RAG 只做”检索 → 生成”,高级 RAG 会加入多个优化环节:Q5: LangChain 的核心概念有哪些?
LangChain 的设计哲学: 把 LLM 调用组件化
Chain: 串联多个步骤
Agent: 让 LLM 自主决策
Tool 和 Memory: 扩展 Agent 的能力
Runnable 抽象与 LCEL
LangChain 的核心抽象是Runnable——所有组件(Prompt、LLM、Parser、Tool)都实现了 Runnable 接口,可以用 | 管道操作符串联。这就是 LCEL(LangChain Expression Language)。
ReAct 模式的工作原理
Agent 的核心是 ReAct(Reasoning + Acting)模式。LLM 先推理(Reasoning)应该调用什么工具,再行动(Action)调用工具,观察结果后继续推理,直到得出最终答案。Q6: LangGraph 的核心概念有哪些?
基础梳理
专家视角深度剖析
很多人能说出”StateGraph 是图结构”,但实际更在意的是:StateGraph 和普通的 DAG(有向无环图)有什么区别?为什么不用 Airflow 之类的 DAG 引擎?StateGraph 与 Airflow DAG 的对比
Q7: RAG 的核心原理是什么?为什么需要它?
LLM 的知识截止问题
致命痛点: LLM 无法访问私有数据
RAG 的引入: 检索 + 生成
核心流程: 切片 → 向量化 → 检索 → 生成
Embedding 模型的选择
Embedding 模型把文本转为向量,决定了检索的语义理解能力。选择时需要在效果、成本、延迟之间做权衡:RAG 与 Fine-tuning 的选择
RAG 和微调(Fine-tuning)都是让 LLM 适应特定领域的手段,但适用场景不同:Q8: RAG 的原理深度解析——从索引到生成的完整流程
RAG 的三个阶段
RAG 的完整流程分为三个阶段:索引(Indexing)→ 检索(Retrieval)→ 生成(Generation)。每个阶段的质量都直接影响最终结果,但检索阶段是最关键的瓶颈——检索不到正确的文档,LLM 再强也答不对。向量化原理(Embedding 模型)
向量化是把文本转为高维向量的过程。核心思想:语义相似的文本,向量距离相近。Embedding 模型通过大规模语料训练,学会了”理解”文本的语义,把语义信息压缩到一个固定维度的向量中。检索策略:向量检索 vs BM25 vs 混合检索
切片策略详解
切片是把长文档拆成小块的过程。切片质量直接决定检索质量——切片太大,包含太多无关信息;切片太小,语义不完整。重排序(Reranking)原理
重排序是 RAG 的关键优化环节。流程:先粗检索 Top-K 个候选(如 20 个),再用 Reranker 模型精排,取 Top-N(如 3 个)给 LLM。Q9: 如何自主搭建企业级 RAG
企业级 RAG 的完整架构
向量数据库选型
Embedding 模型选型
质量优化:查询改写、HyDE、多路召回
1. 查询改写(Query Rewriting) 用 LLM 改写用户问题,提高检索命中率。例如用户问”怎么让页面快一点”,改写为”前端性能优化策略:减少 FCP、LCP、CLS”。Q10: LangChain + RAG 集成——Chain 设计与 Retriever 原理
LangChain RAG Chain 设计
LangChain 的 RAG Chain 本质是一个RunnableSequence:检索器(Retriever)+ 提示词模板(Prompt)+ LLM + 输出解析器(Parser)。
Retriever 原理
Retriever 是 LangChain 的检索抽象。核心接口只有一个方法:invoke(query) → Document[]。所有检索器(向量检索、BM25、混合检索、Reranker)都实现这个接口,可以自由组合。
Chain 类型:Stuff vs MapReduce vs Refine vs Map-Rerank
当检索到的文档太多,超出 LLM 上下文窗口时,需要用不同的 Chain 策略处理:自定义 RAG Pipeline
实际项目中,基础的 RAG Chain 往往不够用。你需要自定义 Pipeline,加入查询改写、混合检索、Reranker、答案验证等环节。| 管道操作符自由串联。实际项目中,不要用默认的 Stuff Chain,而是根据文档量和质量需求选择合适的 Chain 类型,再加入查询改写和 Reranker 等优化环节。Q11: LangGraph 编排详解——从 StateGraph 到人机协作
StateGraph 原理
StateGraph 是 LangGraph 的核心数据结构。它不是一个普通的 DAG(有向无环图),而是一个有状态的有向图——节点之间不直接传参,而是通过共享的 State 对象交互。节点(Node)与边(Edge)
条件路由(Conditional Routing)
条件路由是 LangGraph 区别于线性 Chain 的核心能力。它允许图根据运行时的状态动态决定下一步走向。人机协作(Human-in-the-Loop)
人机协作是 LangGraph 的杀手级特性。通过interrupt 机制,图可以在关键节点暂停,等待人类审批后再继续。
检查点(Checkpoint)与状态恢复
Checkpoint 是 LangGraph 的状态持久化机制。每个节点执行后,自动保存状态快照,支持暂停/恢复、错误重试、时间旅行。Q12: Agent Skills 与 RAG 的区别
核心区别
RAG 和 Skills 是 Agent 的两种核心能力,解决的是完全不同的问题:适用场景对比
Q13: Vercel AI SDK 是什么?和 LangChain 有什么区别?
基础梳理
专家视角深度剖析
很多人只知道 LangChain,但实际更在意的是:为什么 Vercel AI SDK 在前端场景下比 LangChain 更合适? Vercel AI SDK 由 Vercel 团队(Guillermo Rauch、Jared Palmer 等)开发,设计哲学是前端优先——把 AI 能力以 React hooks 的形式暴露给前端开发者,不需要理解后端的链式编排和 Agent 概念。 核心差异在于抽象层级不同:后端 API 路由的实现
Vercel AI SDK 的前端 hooks 需要配合后端 API 路由使用。后端用streamText 或 streamObject 生成流式响应:
工具调用(Tool Calling)
Vercel AI SDK 也支持工具调用,但实现方式比 LangChain 更轻量:useChat、useCompletion、useObject)把 AI 能力直接暴露给前端,内置流式响应和类型安全。LangChain 是后端优先的 AI 工作流框架——用链式编排和图结构处理复杂的多步骤推理。选择标准:前端 UI 集成用 Vercel AI SDK,后端复杂工作流用 LangChain。Vercel AI SDK 的适用场景
AI SDK Provider 的统一抽象
Vercel AI SDK 的核心设计之一是 Provider 抽象——用统一的接口对接不同的 LLM 提供商:ChatOpenAI / ChatAnthropic 抽象类似,但更轻量。
🔍 底层源码:LangGraph 的 interrupt 机制
interrupt(value) 在节点内部暂停图执行,把 value 返回给人类,等待 Command(resume=...) 恢复(详见 LangGraph 源码:libs/langgraph/langgraph/types.py):
Q14: 及格回答 vs 满分回答
问题:“说说 LangChain 和 LangGraph 的区别”
及格回答(60-70分):“LangChain 是 LLM 应用框架,LangGraph 是多 Agent 编排框架。LangGraph 用图结构定义 Agent 之间的流转。”问题出在:知道名字但不理解设计。 满分回答(90-100分):
“LangChain 的核心是链式调用——把 LLM、工具、提示词抽象为 Runnable,用 RunnableSequence 串联成 Pipeline。每个步骤的输出是下一个步骤的输入。适合简单的线性流程(如 RAG:检索 → 增强 → 生成)。[1]”
“LangGraph 的核心是有状态的图结构——用StateGraph定义节点(函数)和边(条件跳转)。支持循环、分支、并行(Send API)、暂停/恢复(interrupt + Command + Checkpoint)。Annotation和Reducer定义状态结构和合并规则,解决并行节点的状态冲突问题。[2]”
“选择标准:简单的 RAG/Chain 用 LangChain,复杂的多 Agent 用 LangGraph。LangGraph 的核心价值不是’图结构’本身,而是把 LLM 调用从’一次性请求’变成’有状态的工作流’——支持暂停/恢复(人机协作)、错误重试(从 checkpoint 恢复)、状态持久化(时间旅行)。[3]“
常见追问
LangGraph 的 Send API 是什么?和 Promise.all 有什么区别?
LangGraph 的 Send API 是什么?和 Promise.all 有什么区别?
RAG 的切片策略怎么选?
RAG 的切片策略怎么选?
- 按字符切(RecursiveCharacterTextSplitter):最通用,先按段落切,再按句子切,最后按字符切。chunkSize 推荐 500-1500 字符,overlap 10-20%。
- 按语义切(SemanticChunker):用 Embedding 计算相邻句子的相似度,在相似度低的地方切分。效果最好,但最慢(需要调用 Embedding API)。
- 按段落切:适合 Markdown 文档,保留文档结构。
Function Calling 的参数是怎么生成的?
Function Calling 的参数是怎么生成的?
get_weather(city: string)。LLM 理解了’北京’是城市名,生成 { city: '北京' }。关键:schema 的 description 写得越精确,LLM 的参数生成越准确。”LangChain 的 Chain 和 Agent 该怎么选?
LangChain 的 Chain 和 Agent 该怎么选?
- 用 Chain:流程固定、步骤明确、不需要动态决策。例如 RAG(检索 → 增强 → 生成)、数据提取(输入 → 解析 → 格式化)。Chain 的行为可预测,容易调试。
- 用 Agent:流程不确定、需要根据中间结果动态决策。例如多工具协作(搜索 → 分析 → 决定是否再搜索)、复杂推理(需要多步思考)。Agent 更灵活但也更不可控。
RAG 的检索质量怎么优化?
RAG 的检索质量怎么优化?
- 切片策略:按语义切 > 按段落切 > 按字符切。推荐 RecursiveCharacterTextSplitter,chunkSize 500-1500 字符,overlap 10-20%。关键是每个切片应该是一个完整的语义单元,能独立回答一个问题。
- Embedding 模型:OpenAI 的 text-embedding-3-large 效果最好但成本高,开源模型(如 BGE、E5)性价比更高。选择时看 MTEB 排行榜。
-
检索策略:纯向量检索(语义相似)+ BM25(关键词匹配)的混合检索效果最好。LangChain 的
EnsembleRetriever可以组合两种检索器。还可以加 Reranker(重排序)——先粗检索 20 个候选,再用 Cross-Encoder 精排取 Top 3。”
Memory 在 LangChain 中有哪些类型?
Memory 在 LangChain 中有哪些类型?
- 短期记忆(对话历史):BufferMemory 保存完整对话历史,BufferWindowMemory 只保留最近 N 轮。适合聊天场景。问题是上下文窗口有限,对话太长会溢出。
- 摘要记忆:ConversationSummaryMemory 用 LLM 把对话历史压缩成摘要。适合长对话——保留关键信息,丢弃细节。
- 长期记忆(向量数据库):VectorStoreRetrieverMemory 把对话存入向量数据库,需要时检索相关历史。适合需要记住大量历史信息的场景(如个人助手)。
LangGraph 的 Checkpoint 机制有什么用?
LangGraph 的 Checkpoint 机制有什么用?
- 暂停/恢复:interrupt + Command 实现人机协作。图执行到 interrupt() 时保存 checkpoint,暂停执行。人类审批后,从 checkpoint 恢复继续执行。
-
错误重试:节点失败后,从最近成功的 checkpoint 恢复,而不是从头开始。LangGraph 的
retry_policy可以配置重试次数和退避策略。 - 时间旅行:可以回到任意 checkpoint 查看历史状态,重放执行过程。LangGraph Studio 支持可视化查看每个 checkpoint 的状态和图的执行流。
🔥 RAG 和 Fine-tuning 该怎么选?
🔥 RAG 和 Fine-tuning 该怎么选?
- 知识更新频率:如果知识经常变化(如产品文档、API 文档),选 RAG——换文档就行,不需要重新训练。如果知识相对稳定(如行业术语、写作风格),Fine-tuning 更合适。
- 成本:RAG 的成本低(只需向量数据库 + Embedding API),Fine-tuning 的成本高(需要 GPU、训练数据、标注成本)。
- 幻觉控制:RAG 天然控制幻觉——AI 只能基于检索到的文档回答。Fine-tuning 仍然可能幻觉(模型可能’记住’错误的信息)。
🔥 Reranking 的原理是什么?为什么需要两阶段检索?
🔥 Reranking 的原理是什么?为什么需要两阶段检索?
CohereRerank 或 ContextualCompressionRetriever 可以实现这个流程。”如何搭建一个生产级的 RAG 系统?
如何搭建一个生产级的 RAG 系统?
- 文档层:支持多种格式(PDF、Word、网页、数据库),用 Unstructured 或 LlamaParse 解析。关键是处理好表格、图片、代码块等复杂格式。
- 切片层:推荐递归切片(chunkSize 500-1500,overlap 10-20%)。Markdown 文档用 MarkdownHeaderTextSplitter 保留结构。高质量场景用 SemanticChunker。
- 存储层:小项目用 Chroma(零配置),中等项目用 Pinecone(全托管),大规模生产用 Milvus 或 Qdrant(高性能)。已有 PostgreSQL 的团队用 pgvector。
- 检索层:混合检索(向量 + BM25,权重 0.6:0.4)+ Reranker 精排。加入查询改写(Query Rewriting)和多路召回(Multi-Query Retrieval)。
- 评估层:用 RAGAS 框架评估忠实度(Faithfulness)、相关性(Relevancy)、准确性(Accuracy)。建立自动化评估流水线,每次优化后回归测试。”
LangChain 的 Chain 类型该怎么选?
LangChain 的 Chain 类型该怎么选?
- Stuff:把所有文档拼接成一个 Prompt。最简单,一次 LLM 调用。但文档太多会超出上下文窗口。适合文档少(< 5 个)的场景。
- MapReduce:每个文档单独生成摘要(Map),再合并摘要生成最终答案(Reduce)。支持大量文档,但需要多次 LLM 调用,成本高。适合需要全局视角的场景。
- Refine:先用第一个文档生成答案,再用后续文档逐个修正。答案逐步精炼,但后续文档的影响递减。适合需要逐步深入的场景。
- Map-Rerank:每个文档单独评分,选最高分的答案。忽略无关文档,但可能丢失跨文档信息。适合有明确答案的场景。
LangGraph 的 Human-in-the-Loop 怎么实现?
LangGraph 的 Human-in-the-Loop 怎么实现?
interrupt(value) 时,把当前状态保存到 Checkpoint,抛出 GraphInterrupt 异常暂停图执行;2) 外部代码拿到 value(如审批请求),展示给人类;3) 人类审批后,调用 Command(resume=reply) 恢复执行;4) 图从 Checkpoint 恢复状态,interrupt() 返回人类的回复。关键设计:Checkpoint 是基础——没有 Checkpoint,就无法暂停和恢复。Checkpoint 的存储后端可以是 MemorySaver(开发用)、SQLite、PostgreSQL(生产用)。实际应用场景:代码部署审批(Agent 生成部署方案 → interrupt 暂停 → 人类审批 → 继续执行)、内容审核(Agent 生成文章 → interrupt 暂停 → 人类审核 → 发布或修改)。”RAG 和 Skills 的区别是什么?什么时候用哪个?
RAG 和 Skills 的区别是什么?什么时候用哪个?
🔥 HyDE 是什么?为什么假设性答案能提升检索效果?
🔥 HyDE 是什么?为什么假设性答案能提升检索效果?
📚 延伸阅读与引用参考
- 🔗 LangChain 官方文档:LangChain 的完整文档,包含 Runnable、Chain、Tool 的 API 说明。 [1]
- 📖 LangGraph 官方文档:LangGraph 的完整文档,包含 StateGraph、Send、interrupt 的详细说明。 [2]
- 🟢 LangGraph 源码:LangGraph 的完整源码,理解 Checkpoint、interrupt、Reducer 的底层实现。 [3]
- 📖 RAG 论文原文:Meta AI 的 RAG 原始论文,理解检索增强生成的理论基础。 [4]
- 📖 Lilian Weng - LLM Powered Autonomous Agents:Lilian Weng 对 LLM 驱动的 Agent 体系的系统梳理,包含规划、记忆、工具使用等环节的理论分析。 [5]
- 🔗 MTEB Leaderboard:Embedding 模型的权威评测排行榜,选型时的参考标准。 [6]
- 🔗 LangChain RAG 教程:LangChain 官方的 RAG 实战教程,包含从文档加载到检索生成的完整流程。 [7]
- 🔗 LangGraph Human-in-the-Loop:LangGraph 人机协作的官方文档,理解 interrupt + Command + Checkpoint 的协作机制。 [8]
- 📖 Harrison Chase Blog:LangChain 创始人 Harrison Chase 的博客,包含 RAG 架构设计、Agent 编排等前沿实践。 [9]
- 🔗 Vercel AI SDK 官方文档:Vercel AI SDK 的完整文档,包含 useChat、useCompletion、useObject 的 API 说明和示例。 [10]
- 🔗 Vercel AI SDK GitHub:Vercel AI SDK 的源码仓库,理解流式响应、Provider 抽象、工具调用的底层实现。 [11]
- 📖 Guillermo Rauch Blog:Vercel CEO Guillermo Rauch 的博客,包含 AI 前端架构、流式 UI 设计等前沿思考。 [12]
