LangChain 之 【Runnable与LCEL】

发布时间:2026/9/27 11:10:07

LangChain 之 【Runnable与LCEL】
目录1.简单代码展示2. Runnable 接口2.1 什么是 Runnable2.2 为什么需要 Runnable2.3 代码印证3. LCELLangChain 表达式语言3.1 什么是 LCEL3.2 什么是 RunnableSequence4. 深入管道符三种等价的“组合”方式5. 数据流转的底层逻辑1.简单代码展示1.1申请 API key与配置环境变量这里是远程调用大模型 API所以需要在对应大模型官网上申请 api_key同时为了后续便捷调用可以将 api_key 与 base_url 设置进环境变量中1.2.安装 OpenAI 包与定义⼤模型命令行输入pip install -U langchain-openai安装 LangChain 官方提供的 OpenAI 集成包# 定义⼤模型 from langchain_openai import ChatOpenAI model ChatOpenAI(modeldeepseek-v4-flash)通过修改配置(上述两个环境变量等)DeepSeek API 可以使用与 OpenAI 兼容的 API 格式1.3.定义消息列表# 定义消息列表 from langchain_core.messages import HumanMessage, SystemMessage messages [ SystemMessage(content请翻译成中文), HumanMessage(contentHello world), ]消息列表参数说明SystemMessage表示系统角色消息。系统消息通常作为输入消息序列中的第一条传入是用来启动 AI 行为的消息HumanMessage表示用户角色消息。是来自用户的、从用户传递到模型的消息1.4.调⽤⼤模型model 是 LangChain Runnable 可运⾏接⼝的实例这意味着 model 提供了⼀个标准接⼝供我们与之交互。要简单地调⽤模型我们可以将 消息列表 传递给 .invoke ⽅法。使⽤ .invoke ⽅法进⾏⼤模型调⽤核⼼代码response model.invoke(messages) print(response)输出结果调试可以看⻅ response 类型为 AIMessageAIMessage(content你好世界, additional_kwargs{refusal: None}, response_metadata{token_usage: {completion_tokens: 54, prompt_tokens: 10, total_tokens: 64, completion_tokens_details: {accepted_prediction_tokens: None, audio_tokens: None, reasoning_tokens: 50, rejected_prediction_tokens: None}, prompt_tokens_details: {audio_tokens: None, cached_tokens: 0}, prompt_cache_hit_tokens: 0, prompt_cache_miss_tokens: 10}, model_name: deepseek-v4-flash, system_fingerprint: fp_8b330d02d0_prod0820_fp8_kvcache_20260402, id: 91d952ef-75ff-4975-acc0-2def7d7a5d11, service_tier: None, finish_reason: stop, logprobs: None}, idrun--019f2f8b-04ef-7a01-9794-0406ca490dd6-0, usage_metadata{input_tokens: 10, output_tokens: 54, total_tokens: 64, input_token_details: {cache_read: 0}, output_token_details: {reasoning: 50}})输出说明AIMessage来自 AI 的消息。从聊天模型返回作为对提示输入的响应。content消息的内容。additional_kwargs与消息关联的其他有效负载数据。对于来自 AI 的消息可能包括模型提供程序编码的工具调用。response_metadata响应元数据。例如响应标头、logprobs、令牌计数、模型名称。侧重于响应本身的信息比如这次请求的 ID、使用的模型版本、以及服务提供商返回的所有原始元数据。它主要用于调试、日志记录和获取请求的上下文信息。usage_metadata消息的使用元数据例如令牌计数。侧重于资源消耗的量化信息即这次请求消耗了多少 Token。它主要用于成本计算、监控和预算控制。1.5.输出解析若只想输出聊天模型返回的结果字符串可以使⽤StrOutputParser输出解析器组件将⼤模型输出结果解析为最可能的字符串。核⼼代码# 定义str字符串输出解析器 from langchain_core.output_parsers import StrOutputParser parser StrOutputParser() print(parser.invoke(result))1.6.链式执行# 定义链 chain model | parser # 执⾏链 response chain.invoke(messages) print(response)2. Runnable 接口2.1 什么是 Runnable官方定义它为使用 LangChain 组件的基础你可以把它想象成我们生活中的USB-C 接口。无论是大模型、解析器、检索器还是复杂的 Agent只要实现了 Runnable 接口它们就拥有了统一的“插拔”标准2.2 为什么需要 Runnable在没有统一标准前调用模型用model.chat()调用解析器用parser.parse()调用检索器用retriever.get()……方法名五花八门Runnable 接口强制规定了一套标准化的方法论。任何一个实现了 Runnable 的组件都天然具备以下四种核心能力能力对应方法作用解释Invoked调用.invoke()最常用。输入一个东西立刻得到一个输出同步执行。Batched批处理.batch()高效处理一批输入比用for循环快得多支持并行。Streamed流式传输.stream()实现 AI 打字机效果数据边生成边输出提升用户体验。Composed组合配合|使用这是 LCEL 的基础允许将自身与另一个 Runnable 串联。2.3 代码印证from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser # ChatOpenAI 是 Runnable 接口的实例 model ChatOpenAI(modelgpt-4o-mini) result model.invoke(messages) # 调用 .invoke() # StrOutputParser 也是 Runnable 接口的实例 parser StrOutputParser() parser.invoke(result) # 同样调用 .invoke()3. LCELLangChain 表达式语言如果说 Runnable 是“积木”那么LCEL 就是把这些积木拼在一起的“说明书”和“胶水”3.1 什么是 LCELLCEL 采用声明式的方法从现有的 Runnable 对象构建出新的 Runnable 对象。它不改变组件内部的逻辑只负责定义数据流动的方向它的核心语法极其简单使用|管道运算符3.2 什么是 RunnableSequence# model 和 parser 都是 Runnable chain model | parser # 检查 chain 的类型class langchain_core.runnables.base.RunnableSequence print(type(chain)) # 因为 RunnableSequence 也是 Runnable所以它也有 .invoke() result chain.invoke(messages)当我们通过 LCEL 将两个或更多的 Runnable 串联起来时LangChain 会在底层生成一个新的对象 ——RunnableSequence可运行序列。关键点来了RunnableSequence本身也完整地实现了 Runnable 接口这是一个典型的“组合模式”应用。这意味着你拼出来的这条“链”Chain和你之前用的单个model拥有完全一样的调用姿势也有.invoke()、.batch()等方法。你可以把拼好的链再当作一个零件去拼进更大的链里实现无限嵌套4. 深入管道符三种等价的“组合”方式三种将组件串联的方法在逻辑上完全等价只是编码风格不同序号写法方式代码示例适用场景1管道符最常用chain model | parser日常开发首选Python 重载了|运算符简洁直观。2显式实例化chain RunnableSequence(firstmodel, lastparser)底层实现原理通常用于框架内部或需要动态构建链时。3.pipe() 方法chain model.pipe(parser)函数式编程风格与管道符完全同义在某些 IDE 中自动补全更友好。5. 数据流转的底层逻辑chain model | parser当你在 LCEL 中执行 chain.invoke(messages) 时输入messages消息列表传入 chain。第一步LCEL 将 messages 传给 model大模型执行 model.invoke(messages)。中间产出model 返回一个 AIMessage 对象包含内容、元数据、Token 用量等。第二步LCEL 自动将上一步的产出AIMessage作为参数传给 parser执行 parser.invoke(AIMessage)。最终输出parser 提取出 AIMessage 中的 content 字段返回纯字符串 你好。核心公式上一个 Runnable 的输出类型 下一个 Runnable 的输入类型

相关新闻

3个核心功能解析:Scarab如何成为空洞骑士模组管理的终极解决方案

3个核心功能解析:Scarab如何成为空洞骑士模组管理的终极解决方案

2026/9/28 3:51:48

3个核心功能解析:Scarab如何成为空洞骑士模组管理的终极解决方案 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab Scarab是一个基于Avalonia框架开发的跨平台空洞…

为什么选择LMCache-mindspore?5大核心优势彻底对比

为什么选择LMCache-mindspore?5大核心优势彻底对比

2026/9/2 5:13:15

为什么选择LMCache-mindspore?5大核心优势彻底对比 【免费下载链接】LMCache-mindspore An LMCache extension for mindspore-based inference. 项目地址: https://gitcode.com/openeuler/LMCache-mindspore 前往项目官网免费下载:https://ar.ope…

如何快速上手OpenDesign miniprogram:5分钟学会openEuler社区小程序使用技巧

如何快速上手OpenDesign miniprogram:5分钟学会openEuler社区小程序使用技巧

2026/8/23 1:13:19

如何快速上手OpenDesign miniprogram:5分钟学会openEuler社区小程序使用技巧 【免费下载链接】opendesign-miniprogram The repository of OpenDesign miniprogram 项目地址: https://gitcode.com/openeuler/opendesign-miniprogram 前往项目官网免费下载&am…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

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

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

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

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…