LangChain Runnable 完整深度解读

发布时间:2026/9/10 1:17:34

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/9/6 3:35:22

ADIS16470AMLZ是一款工业级微型六轴传感器

型号介绍ADIS16470AMLZ 是一款工业级微型六轴 MEMS 惯性测量单元,它拥有行业突出的量程与噪声、零偏指标。陀螺仪支持 2000/s 超大角速度测量范围,适配高速旋转、剧烈机动设备;常温 25℃标准工况下运行零偏稳定性达 8/hr,角度随机…

2026/9/6 2:49:24

ADXL367BCCZ-RL7,高精度无噪声三轴传感器

型号介绍ADXL367BCCZ-RL7 是一款超低功耗三轴数字 MEMS 加速度计,该芯片支持 1.1V 至 3.6V 宽电压输入,主供电引脚 Vs 与数字 IO 供电 VDDIO 共用这一电压区间,可直接匹配单颗纽扣锂电池,内部集成稳压电路,电源抑制比&…

2026/9/10 1:16:04

谢海涛老师把数学方法讲到原理这一步

一个方法学会了怎样操作,是否就意味着已经理解?在初中数学学习中,这个问题经常出现在公式运用、因式分解和方程求解之间。步骤可以被记住,但题目的形式一变化,学生还需要知道方法为什么成立,以及它可以在什…

2026/9/10 1:16:04

Spring Boot+Vue个人网盘管理系统设计与实现全解析

又到了毕业设计季,看到"基于Spring Boot Vue个人网盘管理系统"这个题目,我一点都不意外。说实话,网盘类系统在毕设里一直是热门选题,原因很简单:业务闭环完整、技术栈主流、演示效果好,而且做好…

2026/9/10 1:11:04

基于主从博弈的电热综合能源系统动态定价与能量管理Matlab实现

直接说结论:这套“基于主从博弈的电热综合能源系统动态定价与能量管理”项目,我做过完整复现和改造,今天把建模思路、求解细节、Matlab代码结构、还有调试中踩过的坑一次性整理出来。核心就一句话:运营商定电价和热价,…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码