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 代码是否还停在被取代的旧写法上。

·不适合谁

·读完之后你能做到什么

看到任意一段 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 都重要。下表把当前状态切成三层。

表 0.1 · LangChain 现状三层(截至 2026-06,基于 v1.0)
层内容为什么这样判定
稳定(可放心建心智模型) 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 展开。

·概念地图

Runnable 统一接口 prompt·model·parser 都实现它 | 操作符 (LCEL) .stream / .batch 重试 / fallback 默认就有 分支 / 循环 / HITL → 下沉 LangGraph create_agent (当前 agent 入口) 实现 串成链 不够用时 跑在其上 构建于
图 0.1读这张图盯三件事: 一,箭头几乎都从 Runnable 这一个框发散——LangChain 的统一性来自这一个接口,不是来自零散组件。 二,右侧那条"默认就有"是组合的副产品,不需要逐组件实现。 三,左下 create_agent 与右下 LangGraph 之间的箭头,正是"何时该下沉"那条分界落到地面的地方。

·学习路径建议

这是一份概念向教程(不含动手章),按目的挑路径:

  • 只想理解原理:先读 02 原理 的 Runnable 组合机制与默认能力来源,再回 01 概念 补术语。原理章是这条线的重心。
  • 做框架选型:先看本页"现状速览"三层表,再直接跳 02 章的"备选方案对比"与"带来的代价"段,对照 LCEL 与 LangGraph 的边界判断是否符合你的场景。
  • 带读他人 LangChain 代码:从 01 概念逐节走,重点记每个概念的"逐行 → 概念"映射;之后用 03 自测 的应用判别题练"这段该停在哪一层"。

·目录

·学完之后

  • LangGraph 深入(状态、节点、边、检查点)——在你心智模型上,把"下沉 LangGraph"那个箭头展开成一套可编程的状态机,而不再是一个模糊的去处。
  • RAG 管道(检索器、向量库、上下文拼装)——把检索器也看成一个 Runnable,于是 RAG 就是在已有的 | 链上多接一段,心智模型不必另起炉灶。
  • 评估与可观测(LangSmith、trace、评测集)——给"串好的链"加上一层观测,让你看见每一步 Runnable 的输入输出,把抽象的链变成可量化的对象。
  • 结构化输出与工具调用——把模型节点从"出文本"升级到"出受 JSON Schema 约束的结构",这是 agent 循环里工具决策的地基。