LangChain · v1.0
LangChain:一个 Runnable 接口撑起的一切
这份教程把 LangChain 看成一件事:一个统一接口 Runnable,把 prompt、模型、解析器拉到同一种调用形状,于是它们能用 | 串成链。基于 LangChain v1.0 / LangGraph v1.0(2025-10-22 发布),写于 2026-06。读完约 2 小时。下文所有代码用来演示分界判断,均未在本机执行(标 2026-06)。
·适合谁
- 能读写 Python、用过至少一个 LLM SDK(OpenAI、Anthropic 之类),知道一次 chat completion 调用长什么样。
- 用 LangChain 跑通过 demo,但说不清
prompt | model | parser这条管道里|到底做了什么。 - 正在做框架选型或代码评审,需要判断一段 LangChain 代码是否还停在被取代的旧写法上。
·不适合谁
- 还没调用过任何 LLM API:先去 OpenAI 文本生成指南 或 Anthropic 快速开始 跑通一次裸调用,再回来。
- 只想抄一段能跑的 RAG 脚手架、不关心为什么这么设计:官方 quickstart 更快。
- 已经在生产里深用 LangGraph 写多智能体编排:这份是回到 Runnable / LCEL 分界的概念课,对你偏浅,直接看 LangGraph 文档。
·读完之后你能做到什么
看到任意一段 LangChain 代码,你能立刻判断它该停在 LCEL 链、还是已经必须下沉到 LangGraph——这是文档不会直接告诉你的分界。
更具体地,读完后你能:
- 认出一段
a | b | c里|把哪些对象串成了什么形状的 Runnable,并说出数据从左到右每一步变成了什么类型。 - 讲清
.stream()、.batch()、重试与 fallback 为什么是"串好链就默认拥有",而不是每个组件各写一遍。 - 说清 Agent API 三次迁移(AgentExecutor → create_react_agent → create_agent)各自为什么被取代、各停在哪个时间点。
- 给一段 2023 年的
LLMChain老代码,开出一份到 v1.0 的迁移方案:哪些换成 LCEL、哪些要下沉到 LangGraph。
一句话本质
LangChain 本质是一个统一接口 Runnable 撑起来的——所有 prompt / 模型 / 解析器都实现它,于是能用 | 串成链;串好后 .stream() / .batch() / 重试 / fallback 默认就有;需要分支、循环、人工中断时就从 LCEL 下沉到 LangGraph。
·现状速览(截至 2026-06)
LangChain 是一个仍在快速演进的框架,分清哪些是定论、哪些还在动,比记住任何单个 API 都重要。下表把当前状态切成三层。
| 层 | 内容 | 为什么这样判定 |
|---|---|---|
| 稳定(可放心建心智模型) | Runnable 接口 + LCEL 的 | 组合 + 串好后默认拥有的 stream / batch / retry / fallback。这是几年没动的地基。 |
v1.0 把它定为正式 API;组合语义自 LCEL 引入以来保持一致。 |
| 在变(盯紧版本) | LangChain 与 LangGraph 都已 v1.0;2025-10 起 LangChain 的 agent 直接跑在 LangGraph 执行引擎上(互补,不是二选一);create_agent 是当前推荐的 agent 入口。见 02 章 §2.4 与 §2.3。 |
v1.0 发布于 2025-10-22;agent 底层换成 LangGraph runtime 是这一代最大结构变化。 |
| 已过时(别当默认) | AgentExecutor(维护到 2026-12)、create_react_agent(已弃用)、LLMChain、把老 langchain-classic 当默认依赖。 |
遗留功能已迁入 langchain-classic 仅供向后兼容;新代码不应从这里起步。 |
来源:LangChain v1.0 发布博客(2025-10-22)、官方 agents 文档。
这一页读起来会很顺,正因为顺,三种假象最容易出现:
「我读得很顺」——顺只证明句子通顺,不证明你能在陌生代码上复用这条分界。
「我做题很快」——题做得快,常常是答案就在上一段,换个场景就卡住。
「我没卡壳」——没卡壳意味着没触到边界;真正的理解发生在被迫做判别、而不是被讲解抚平的时刻。
下面这道题用来戳破假象:(prompt | model).batch([...]) 里,.batch() 是 prompt 的方法、model 的方法,还是别的什么的方法?先在心里答,再展开。
展开答案(先答再展开)
都不是。prompt | model 先组合出一个新的 Runnable(一条 RunnableSequence),.batch() 是这个组合结果的方法——因为 Runnable 接口本身就带 batch。这正是"串好链就默认拥有 batch"的含义:能力来自接口,不来自任何单个组件。这一点在 02 章 §2.2 展开。
·概念地图
create_agent 与右下 LangGraph 之间的箭头,正是"何时该下沉"那条分界落到地面的地方。·学习路径建议
这是一份概念向教程(不含动手章),按目的挑路径:
- 只想理解原理:先读 02 原理 的 Runnable 组合机制与默认能力来源,再回 01 概念 补术语。原理章是这条线的重心。
- 做框架选型:先看本页"现状速览"三层表,再直接跳 02 章的"备选方案对比"与"带来的代价"段,对照 LCEL 与 LangGraph 的边界判断是否符合你的场景。
- 带读他人 LangChain 代码:从 01 概念逐节走,重点记每个概念的"逐行 → 概念"映射;之后用 03 自测 的应用判别题练"这段该停在哪一层"。
·目录
·学完之后
- LangGraph 深入(状态、节点、边、检查点)——在你心智模型上,把"下沉 LangGraph"那个箭头展开成一套可编程的状态机,而不再是一个模糊的去处。
- RAG 管道(检索器、向量库、上下文拼装)——把检索器也看成一个 Runnable,于是 RAG 就是在已有的
|链上多接一段,心智模型不必另起炉灶。 - 评估与可观测(LangSmith、trace、评测集)——给"串好的链"加上一层观测,让你看见每一步 Runnable 的输入输出,把抽象的链变成可量化的对象。
- 结构化输出与工具调用——把模型节点从"出文本"升级到"出受 JSON Schema 约束的结构",这是 agent 循环里工具决策的地基。