LangChain Runnable 完整深度解读
LangChain Runnable 完整深度解读适配LangChain 0.1.x/ 0.2.x 新版体系LCELLangChain Expression Language的底层基石前置认知所有你写的prompt | llm | parser | retriever每一环都是Runnable一、核心定义1. 什么是 RunnableRunnable是一个统一接口规范Protocol / 抽象基类Runnable[Input, Output]任意实现该接口的对象都支持管道运算符|串联并行执行RunnableParallel同步 / 异步调用、流式输出、批处理绑定参数、重试、回调、日志、可观测性泛型定义python运行from langchain_core.runnables import Runnable # Runnable[输入类型, 输出类型] class Runnable[Input, Output]: def invoke(self, input: Input, config: Optional[RunnableConfig]) - Output: ... async def ainvoke(self, input: Input, config: Optional[RunnableConfig]) - Output: ... def stream(self, input: Input, config: Optional[RunnableConfig]) - Iterator[Output]: ... async def astream(self, input: Input, config: Optional[RunnableConfig]) - AsyncIterator[Output]: ... def batch(self, inputs: List[Input], configs: ...) - List[Output]: ... async def abatch(self, inputs: List[Input], configs: ...) - List[Output]: ...所有 LangChain 核心组件都实现 RunnableChatPromptTemplate、ChatOpenAI、StrOutputParser、BaseRetriever、DocumentTransformer、自定义函数链等2. 四大标准执行方法重中之重表格方法作用使用场景.invoke(input)单次同步调用完整输入→完整输出常规问答获取完整结果.ainvoke(input)异步单次调用FastAPI、异步服务高并发.stream(input)同步流式迭代逐块返回输出前端打字机流式输出.astream(input)异步流式迭代异步服务流式返回.batch(inputs)批量执行一组输入批量问答、数据处理⚠️ 重要约束Runnable 管道中数据会沿着链路流转前一个的输出 后一个的输入。二、LCEL 管道|原理__or__运算符python运行chain r1 | r2 | r3等价于python运行from langchain_core.runnables import RunnableSequence chain RunnableSequence(r1, r2, r3)执行逻辑输入传入r1.invoke(input)r1 的输出 → 作为 r2 的输入r2 的输出 → 作为 r3 的输入类型流转示例经典 RAG 链plaintextstr(query) → RunnablePassthrough retriever → Dict[str, str | List[Document]] → ChatPromptTemplate → PromptValue → ChatOpenAI → AIMessage → StrOutputParser → str三、内置核心 Runnable 组件详解1.RunnablePassthrough透传器作用原样把输入往下传递不做修改。 最常见场景拆分字典字段供给 prompt。python运行from langchain_core.runnables import RunnablePassthrough # 输入字符串问题 { question: RunnablePassthrough(), context: retriever }流程 输入什么是Runnablequestion直接透传原字符串context原字符串送入 retriever 得到文档列表如果你不写RunnablePassthrough()无法把原始输入保留到下游。2.RunnableParallel并行执行别名RunnableMap接收字典并发执行每一条 value 对应的 Runnable最后合并字典输出。{...}语法糖本质就是RunnableParallel。python运行# 两种写法完全等价 chain RunnableParallel({ summary: llm1, key_points: llm2 }) # 语法糖写法 chain {summary: llm1, key_points: llm2}典型场景一条问题同时调用多条检索器同一个输入让 LLM 同时生成摘要 关键点RAG 中同时输出 answer 和 source_documents示例带来源文档的 RAG 链python运行rag_with_source RunnableParallel({ context: retriever, question: RunnablePassthrough() }).assign( answer (lambda x: { context: format_docs(x[context]), question: x[question] }) | prompt | llm | StrOutputParser() ).assign()在现有输出字典上新增字段非常常用。3.RunnableLambda封装普通函数把任意 Python 函数包装成 Runnable接入管道。python运行from langchain_core.runnables import RunnableLambda def format_docs(docs): return \n\n.join(d.page_content for d in docs) format_docs_runnable RunnableLambda(format_docs) # 直接放进管道 retriever | format_docs_runnable支持异步函数RunnableLambda(async_func)绝大多数数据预处理、结果格式化都靠它。4.RunnableBind—.bind()绑定固定参数对下游 Runnable 绑定静态参数最常用于 LLM 参数绑定。python运行base_llm ChatOpenAI(modelgpt-3.5-turbo) creative_llm base_llm.bind(temperature0.9) strict_llm base_llm.bind(temperature0.0)底层llm.bind(...)返回一个新 Runnable调用时自动带上参数。5.RunnableBranch分支路由条件判断类似if/else根据上游输出选择不同链路执行。python运行from langchain_core.runnables import RunnableBranch branch RunnableBranch( (lambda x: len(x[question]) 100, long_chain), (lambda x: 代码 in x[question], code_chain), default_chain # 默认分支 )适用路由到不同知识库、区分普通问答 / 代码问答。四、RunnableConfig全局配置对象所有invoke/stream都可以传入config用于控制链路行为python运行from langchain_core.runnables import RunnableConfig config { callbacks: [...], # 回调函数日志、追踪 tags: [rag-demo], # 链路标签用于LangSmith观测 metadata: {user_id: 123}, recursion_limit: 10 # 防止递归链无限循环 } chain.invoke(query, configconfig)LangSmith 追踪、限流、权限、用户身份都通过 config 传递。五、流式在 Runnable 中的传播机制容易踩坑一个关键规则管道中只要某一环支持 stream整条链支持.stream()数据以增量块chunk向下传递python运行chain prompt | llm | StrOutputParser() for chunk in chain.stream(你好): print(chunk, end)坑点RunnableLambda默认不支持流式会收集全部输入再处理如果需要自定义流式处理需要实现transform()。六、自定义 Runnable进阶当RunnableLambda不够用时可以继承Runnable实现完整接口python运行from langchain_core.runnables import Runnable from typing import Iterator class MyTransformRunnable(Runnable[str, str]): def invoke(self, input: str, configNone) - str: return input.upper() def stream(self, input: str, configNone) - Iterator[str]: for char in input: yield char.upper()七、数据流类型流转避坑高频错误输入类型不匹配python运行# 错误retriever 接收 str上游输出 dict chain RunnablePassthrough() | retriever # 正确使用lambda提取字段 chain RunnablePassthrough() | (lambda x: x[question]) | retriever混淆「值」和「Runnable」python运行# ❌ 错误写法 {question: 固定文本} # ✅ 正确固定常量使用 RunnableLambda {question: RunnableLambda(lambda x: 固定文本)}管道不能直接混用异步函数必须包 RunnableLambda八、Runnable vs 旧版 Chain历史区分旧版Chain强制输入输出为字典没有统一流式标准无法自由|拼接RetrievalQA基于老 Chain灵活性差新版Runnable输入可以是 str /dict/ 对象灵活原生支持同步 异步 流式 批处理LCEL 声明式构建链路官方主推所有新功能只迭代 Runnable结论新项目一律使用 Runnable / LCEL不要使用遗留 Chain。九、典型完整示例RAG 标准 Runnable 链路汇总python运行from langchain_core.runnables import RunnablePassthrough, RunnableParallel from langchain_core.output_parsers import StrOutputParser def format_docs(docs): return \n\n.join(d.page_content for d in docs) rag_chain ( RunnableParallel({ context: retriever | format_docs, question: RunnablePassthrough() }) | prompt | llm | StrOutputParser() ) # 调用 rag_chain.invoke(LangChain Runnable是什么)十、生产级拓展能力Runnable 生态.with_retry()自动重试python运行retry_llm llm.with_retry(max_attempts3).with_fallbacks()LLM 故障自动切换备用模型python运行safe_llm llm1.with_fallbacks([llm2]).pick()提取字典中某个字段python运行chain.pick(answer).map()批量处理等价循环调用python运行chain.map().invoke([问题1,问题2])十一、知识思维导图总结plaintextRunnable 统一接口 ├─ 五大执行原语invoke / ainvoke / stream / astream / batch ├─ 组合方式 │ ├─ | 管道 → RunnableSequence │ └─ {} 字典 → RunnableParallel ├─ 基础工具Runnable │ ├─ RunnablePassthrough透传输入 │ ├─ RunnableLambda包装普通函数 │ ├─ RunnableBranch条件分支 │ └─ .bind() 绑定参数 ├─ 控制层 │ ├─ RunnableConfig回调、标签、元数据 │ ├─ with_retry / with_fallbacks └─ 生态载体 ├─ Prompt、LLM、Parser、Retriever 全部实现Runnable

相关新闻

2026年实战指南:图片格式图纸识别技术在质量检验计划中的应用

2026年实战指南:图片格式图纸识别技术在质量检验计划中的应用

2026 年,在制造业数字化转型步入深水区的背景下,图片格式图纸识别(image format drawing recognition)已成为质量管理部门提升效率的关键技术。尽管 3D MBD(基于模型的定义)在高端制造领域普及,…

2026/10/17 7:21:41 阅读更多 →
在天津挑选专业标书制作机构,这些实用判断技巧很值得大家参考

在天津挑选专业标书制作机构,这些实用判断技巧很值得大家参考

对于天津不少工程服务商、政企供应商、中小微企业经营者来说,投标过程里最可惜的事,莫过于前期攒资质、跑对接、做测算花了几个月功夫,最后因为标书制作的疏漏,要么直接被废标,要么差两三分与项目失之交臂。来自天津公…

2026/10/17 3:16:21 阅读更多 →
400电话多场景架构适配与企业选型实战:从热线接待、中转分流到风控合规落地

400电话多场景架构适配与企业选型实战:从热线接待、中转分流到风控合规落地

标签:#400电话 #企业热线 #语音中继 #呼叫路由 #客服架构 #通信场景化落地阅读对象:后端开发、通信架构师、IT运维、系统集成、企业客服项目交付人员摘要:大部分企业对400电话的认知仅停留在“品牌热线”层面,忽略了其路由架构、并…

2026/10/17 7:23:59 阅读更多 →

最新新闻

一文讲透 Prompt(提示词):用自然语言编程模型的接口

一文讲透 Prompt(提示词):用自然语言编程模型的接口

这是「近五年 AI 技术演进」系列深挖的第 1 篇。上一部《从 ChatGPT 到 Agent Harness:近五年 AI 技术演进全景》用 1.2 万字串起了 13 个概念,从这一篇开始,我们把每个概念单独拎出来拆到底。第一站是最不起眼、却是一切起点的东西&#xff…

2026/10/17 10:47:09 阅读更多 →
Java 8 JRE解压即用:轻量运行时解决环境冲突与兼容性问题

Java 8 JRE解压即用:轻量运行时解决环境冲突与兼容性问题

简介:本资源为Oracle官方发布的Java SE Runtime Environment 8(即JRE 1.8)64位精简免安装版,面向Java初学者、教学环境部署人员及轻量级应用运行需求者,解决无管理员权限或需快速部署Java运行环境的典型场景。压缩包共…

2026/10/17 10:47:09 阅读更多 →
AI批量混剪流水线:多平台日更内容生产实战指南

AI批量混剪流水线:多平台日更内容生产实战指南

做短视频内容的人,十个有九个被“多平台更新”压垮过。我去年帮一个做本地生活账号的朋友处理五个平台的日更需求,一开始手动剪,三个人一天最多出六条,还都是换汤不换药;后来我把流程改成AI批量混剪,上午收…

2026/10/17 10:47:09 阅读更多 →
C语言UTF-8合法性检测:不依赖库的轻量级实现与三重门校验

C语言UTF-8合法性检测:不依赖库的轻量级实现与三重门校验

1. 字符集与字符编码:为什么你写的C程序在Linux下能正常显示中文,放到Windows终端却变成乱码?“字符集和字符编码”这八个字,看起来像教科书里的冷知识,但只要你写过哪怕一行带中文的C程序——比如printf("你好&a…

2026/10/17 10:47:09 阅读更多 →
嵌入式Linux SD/SDIO驱动核心:MMC框架、设备树与调试实战

嵌入式Linux SD/SDIO驱动核心:MMC框架、设备树与调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 10:47:09 阅读更多 →
C语言——makefile的使用

C语言——makefile的使用

makefile如果有多个.c文件要编译,用gcc编译每次都要重新输入,每次要编很多,如果出错改好又要全部都编一遍,如gcc main.c add.c sub.c来把文件拼接成a.out,这是很浪费时间和编译效率的这时候用makefile可以提升效率使用规则如下写m…

2026/10/17 10:46:08 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →