当前位置: 首页 > 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.zskr.cn/news/1312783.html

相关文章:

  • 全球冷再生机市场深度研判:预计2032年将达到13.46亿美元
  • CST仿真空心电感,结果总比实测小?聊聊建模误差、趋肤效应和端口设置的那些坑
  • 基于RT-Thread与MCXA156的智能门锁系统:多外设驱动与RTOS实战
  • 为什么87%的教育博士生在开题前没用NotebookLM?3步完成质性资料编码+概念提炼
  • SwarmClaw:多智能体协作框架的设计原理与工程实践
  • 【小白适用】2026 最新 Win11 OpenClaw 一键安装步骤(包含安装包)
  • Hackintool终极指南:5个核心功能助你打造完美黑苹果系统
  • The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received
  • Android 15稳定版推送:深度解析AI安全与防盗锁定新特性
  • 为什么WSL 上 删除了文件,磁盘空间没减少?以及解决办法!
  • 虚实界·全息动态管控平台新品技术发布会宣讲稿
  • 快速原型开发中利用Taotoken模型广场高效选型与切换
  • TVBoxOSC:让闲置电视盒子变身智能家庭网络中心的终极方案
  • 2026年上海口碑好的全铝家具供应商推荐,金属书柜/不锈钢橱柜/全铝家具/全铝电视柜,全铝家具研发企业口碑推荐 - 品牌推荐师
  • Pyecharts入门指南:一键生成交互式图表(Python 可视化图表实战附代码)
  • ez-cursor-free:轻量级跨平台鼠标控制库的原理、应用与避坑指南
  • CircuitPython硬件接口实战:PWM、舵机与传感器控制指南
  • 如何配置阿里云 ECS 安全组限制特定 IP 访问 SSH 端口
  • 基于MCP协议的Jira AI连接器:实现结构化数据与LLM的安全高效集成
  • 基于PhantomBuster API的自动化数据采集系统构建指南
  • 告别硬编码:实战解析Linux设备树(DTS)如何让驱动开发更高效
  • DLSS Swapper完整指南:一键管理游戏DLSS文件,释放NVIDIA显卡全部潜力
  • AMD Ryzen处理器底层调试技术解析:SMUDebugTool的架构设计与实践应用
  • Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型
  • 【2026最新版|建议收藏】吴恩达×Anthropic Agent Skills详解,小白/程序员入门大模型必看
  • AI产品经理入门实战:如何理解语音识别?
  • DLSS版本管理:如何为你的游戏选择最佳AI超分辨率方案?
  • 基于MCP协议与psutil构建AI系统监控服务器实战指南
  • 对比篇:别再傻傻分不清:ERP管“账”,WMS管“货”——物流新人必修课
  • Postman便携版终极指南:无需安装的API测试神器