当前位置: 首页 > news >正文

【LangChain 】RunnablePassthrough 两种写法对比:`.assign()` 的参数到底要不要包 `RunnableLambda`?

RunnablePassthrough 两种写法对比:.assign()的参数到底要不要包RunnableLambda

一、两种调用方式对比

LangChain 提供了两种调用assign的方式,功能等价但写法不同。

1.1 写法一:实例方法.assign()

fromlangchain_core.runnablesimportRunnableParallel,RunnablePassthrough chain=RunnableParallel(passed=RunnablePassthrough().assign(modified=lambdax:x["k1"]+"!!!"),)

1.2 写法二:类方法assign()

fromlangchain_core.runnablesimportRunnablePassthroughdefget_user_age(data):return25chain=RunnablePassthrough.assign(age=get_user_age)

二、核心对比

对比项写法一:RunnablePassthrough().assign(...)写法二:RunnablePassthrough.assign(...)
调用方式实例方法(先创建实例再调用)类方法(直接通过类调用)
返回值Runnable实例Runnable实例
功能效果保留原字段 + 添加新字段保留原字段 + 添加新字段
使用场景通常配合RunnableParallel使用通常作为独立步骤使用
本质区别先实例化再配置类级别的工厂方法

结论:两种写法功能完全等价,选择取决于代码上下文和个人习惯。

三、参数要不要包RunnableLambda

这是最容易混淆的地方。答案是:.assign()里不需要,在管道运算符\|里需要。

3.1 不需要包的场景

以下方法内部会自动把函数或 Lambda 包装成RunnableLambda

fromlangchain_core.runnablesimportRunnablePassthrough,RunnableParalleldefget_user_age(data):return25# ✅ RunnablePassthrough.assign() —— 自动转换chain1=RunnablePassthrough.assign(age=get_user_age)# ✅ RunnableParallel() —— 自动转换chain2=RunnableParallel({"result":lambdax:x["name"].upper()})# ✅ 直接传 lambda —— 自动转换chain3=RunnablePassthrough().assign(modified=lambdax:x["k1"]+"!!!")

3.2 需要包的场景

管道运算符\|只接受Runnable对象,不会自动转换:

fromlangchain_core.runnablesimportRunnableLambda# ❌ 错误:普通函数不能直接接在管道里chain_bad=step1|get_user_age|step2# ✅ 正确:必须手动包一层 RunnableLambdachain_good=step1|RunnableLambda(get_user_age)|step2

四、四种等价写法实测

fromlangchain_core.runnablesimportRunnablePassthrough,RunnableLambdadefget_user_age(data):return25# 写法1:直接传函数(最简洁,推荐)r1=RunnablePassthrough.assign(age=get_user_age)# 写法2:传 lambda(也简洁)r2=RunnablePassthrough.assign(age=lambdax:25)# 写法3:手动包 RunnableLambda(啰嗦,但效果一样)r3=RunnablePassthrough.assign(age=RunnableLambda(get_user_age))# 写法4:实例方式调用r4=RunnablePassthrough().assign(age=get_user_age)# 测试forrin[r1,r2,r3,r4]:result=r.invoke({"name":"Alice"})print(result)

输出:

{'name':'Alice','age':25}{'name':'Alice','age':25}{'name':'Alice','age':25}{'name':'Alice','age':25}

五、自动转换方法汇总

方法/类自动转换函数为 RunnableLambda?
RunnablePassthrough.assign()✅ 是
RunnableParallel()✅ 是
RunnableLambda()构造函数✅ 是(当然)
管道运算符|❌ 否
RunnableSequence()❌ 否

六、最佳实践建议

场景推荐写法原因
.assign()里传函数age=get_user_age最简洁,可读性最好
.assign()里简单逻辑age=lambda x: ...无需定义额外函数
管道|里传函数RunnableLambda(func)必须手动包,否则报错
配合RunnableParallelRunnablePassthrough().assign(...)实例方式更自然

七、一句话总结

.assign()RunnableParallel是"友好"的 API,看到函数会自动帮你包成RunnableLambda;但管道运算符\|是"严格"的,只接受 Runnable 对象,不会自动转换。

.assign()里直接写函数或 Lambda 就行,别画蛇添足包RunnableLambda

http://www.jsqmd.com/news/841111/

相关文章:

  • 全球冷再生机市场深度研判:预计2032年将达到13.46亿美元
  • CST仿真空心电感,结果总比实测小?聊聊建模误差、趋肤效应和端口设置的那些坑
  • 明日方舟终极自动化助手:MAA的完整使用指南与实战技巧
  • 猎影·全域目标追踪矩阵新品技术发布会宣讲稿
  • 基于向量数据库与混合检索的AI长期记忆系统构建指南
  • 深入PCIe Switch:从配置空间看数据包如何被路由到正确的设备
  • 基于RT-Thread与MCXA156的智能门锁系统:多外设驱动与RTOS实战
  • 鸿蒙 Harmony 6.0 页面构建实战:智慧车务应用开发解析
  • 5G毫米波通信技术:开启高速通信新维度
  • 为什么87%的教育博士生在开题前没用NotebookLM?3步完成质性资料编码+概念提炼
  • Postman便携版终极指南:无需安装的API测试神器
  • SwarmClaw:多智能体协作框架的设计原理与工程实践
  • 从10分钟到10秒:Photoshop图层批量导出的终极效率革命
  • CefFlashBrowser终极指南:2025年如何完美运行Flash游戏与保存进度
  • Node.js轻量级i18n库amem:极简设计与高性能本地化实践
  • Hackintool终极指南:5个核心功能助你打造完美黑苹果系统
  • 对比篇:别再傻傻分不清:ERP管“账”,WMS管“货”——物流新人必修课
  • Redis分布式锁进阶第七十二篇
  • The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received
  • 5G Sub-6GHz频段部署:开启无线通信新篇章
  • 不会录音?顶伯在线语音工具 TTS 一键生成有声书 / 播客
  • Android 15稳定版推送:深度解析AI安全与防盗锁定新特性
  • 虚实界·全息动态管控平台新品技术发布会宣讲稿
  • 人工智能导论作业
  • 基于MCP协议与psutil构建AI系统监控服务器实战指南
  • 为什么WSL 上 删除了文件,磁盘空间没减少?以及解决办法!
  • 长期使用 Taotoken 聚合服务对项目运维复杂度的实际降低效果
  • Kubernetes Operator模式深入解析与自定义资源开发
  • 快速原型开发中利用Taotoken模型广场高效选型与切换
  • iServer访问路径改造实战:用Nginx代理实现域名+端口/路径的平滑迁移