上一篇铺开了三层地图:core 提供积木,LangGraph 编排,langchain 包 Agent。地图最底下那块最关键的积木,叫 Runnable。
这一篇就讲透它。Runnable 不是某个具体功能,而是一个协议——它规定了「一个组件要怎样才算合格积木」。理解了这个协议,你就理解了 LangChain 的一切组合能力从哪来。
先看问题:为什么需要统一协议
假设没有 Runnable,你想把「prompt 模板 + 模型 + 解析器」串起来,会遇到什么?
prompt 模板有 .format(),模型有 .chat.completions.create(),解析器有 .parse()——每个组件的方法名、参数、返回值都不一样。要把它们连成一条链,你得为每两个组件之间写一段「胶水代码」做适配。
组件一多,胶水代码呈组合爆炸:5 个组件两两连接,可能要写 N×N 段适配。而且换一个组件,所有跟它相连的胶水都得重写。
Runnable 要解决的就是这个问题:给所有组件定一个统一的「输入→输出」契约,让任何两个组件都能直接对接,零胶水。
Runnable 协议:四个标准方法
Runnable 规定,一个合格积木必须实现这四个方法:
| 方法 | 做什么 | 什么时候用 |
|---|---|---|
invoke |
处理单个输入,返回单个输出 | 最基础,一次调用 |
batch |
批量处理多个输入 | 想并发提吞吐 |
stream |
流式返回输出 | 想边生成边给用户看 |
async 系列(ainvoke 等) |
异步版本 | 不阻塞主线程 |
关键在于:这四个方法不是每个组件各自实现的。一个组件声明自己是 Runnable 后,batch/stream/async 这些能力很大程度上是协议帮你兜底的。你写一个 prompt 模板,它自动就有了流式、批处理、异步能力——这些不是免费送的,而是协议层统一实现的。
这是 Runnable 最容易被低估的价值:统一协议把「异步、流式、批处理」从「每个组件要单独实现」变成「协议层一次给齐」。
一个组件,就是一个函数
换个角度理解:Runnable 本质上把每个组件都规约成一个「输入→输出」的函数。
- prompt 模板 = 输入变量 → 输出一段消息
- 模型 = 输入消息 → 输出回答
- 解析器 = 输入回答文本 → 输出结构化对象
- 检索器 = 输入查询 → 输出一组文档
它们的输入输出类型不同,但形状一样:都是「给我一个东西,我还你一个东西」。Runnable 抓住的就是这个共性。
一旦所有组件形状一致,组合就成了顺理成章的事——把上一个的输出,喂给下一个的输入。这就是下一篇 LCEL(管道符)能成立的基础。
一个具体例子
光说协议抽象,不如看个最小例子。假设你想定义一个自己的组件:把输入字符串反转。只要让它实现 Runnable 协议,它就能和所有官方组件混用:
from langchain_core.runnables import RunnableLambda
# 一个普通函数,包成 Runnable
reverse = RunnableLambda(lambda x: x[::-1])
# 它现在有了全部标准方法
reverse.invoke("hello") # -> "olleh"
reverse.batch(["hi", "yo"]) # -> ["ih", "oy"]
你写的是一个普通函数,RunnableLambda 帮你包成 Runnable。从此它就能用 invoke/batch/stream,能被管道符串联,能被 LangSmith 追踪——协议带的所有能力,一步到位。
这就是 Runnable 的「免费午餐」:你只关心业务逻辑(输入输出),工程能力(并发、流式、追踪)协议给你。
Runnable 的统一,换来什么
把所有组件统一成 Runnable,带来的收益很具体:
- 可组合:任意两个组件能直接对接,零胶水(下一篇 LCEL 展开)
- 可替换:换模型、换检索器、换解析器,接口一致,业务代码不动
- 能力一致:流式、批处理、异步、追踪、重试、fallback,所有组件都有,不用单独实现
- 可测试:每个组件都是
invoke(输入) → 输出,单测直接调 invoke 就行
这四项收益里,「能力一致」最容易被忽略却最值钱。传统做法里,想让一个检索器支持流式,得自己实现;想让一个工具支持异步,得自己改。Runnable 之后,这些是协议层标配。
收束:积木的契约
这一篇讲透了 LangChain 地基里那块最关键的积木:
- Runnable 是个协议,规定合格积木要有
invoke/batch/stream/async四个方法 - 它把所有异构组件规约成同一种「输入→输出」形状
- 换来的是可组合、可替换、能力一致、可测试
下一篇会顺着这个基础,讲 LCEL(LangChain Expression Language)——当所有组件都是同一种形状,就能用管道符 | 把它们优雅地串成链。LCEL 就是 Runnable 协议的「组合语法」。
关于十三Tech
我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。
如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

