news 2026/7/3 4:02:33

1.2 使用LangChain中的RunnableLambda

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
1.2 使用LangChain中的RunnableLambda

📄 文件代码内容

fromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportPromptTemplatefromlangchain_community.chat_models.tongyiimportChatTongyi model=ChatTongyi(model="qwen3-max")str_parser=StrOutputParser()first_prompt=PromptTemplate.from_template("我邻居姓:{lastname},刚生了{gender},请帮忙起名字,仅生成一个名字,并告知我名字,不要额外信息。")second_prompt=PromptTemplate.from_template("姓名{name},请帮我解析含义。")# 函数的入参:AIMessage -> dict ({"name": "xxx"})# my_func = RunnableLambda(lambda ai_msg: {"name": ai_msg.content})#可以封装,也可以直接把函数加入到链中chain=first_prompt|model|(lambdaai_msg:{"name":ai_msg.content})|second_prompt|model|str_parserforchunkinchain.stream({"lastname":"曹","gender":"女孩"}):print(chunk,end="",flush=True)

🔄 代码流程梳理

  1. 导入依赖

    • StrOutputParser:将模型输出的AIMessage转为纯字符串。
    • PromptTemplate:定义提示模板。
    • ChatTongyi:通义千问聊天模型。
  2. 初始化组件

    • 创建ChatTongyi实例(模型)。
    • 创建StrOutputParser实例(解析器)。
  3. 定义两个提示模板

    • first_prompt:要求模型根据姓氏和性别生成一个名字(限定只输出名字,无额外信息)。
    • second_prompt:要求模型解析该名字的含义(输入变量为name)。
  4. 构建 LCEL 链(核心)

    chain=(first_prompt|model|(lambdaai_msg:{"name":ai_msg.content})# ① 转换|second_prompt|model|str_parser)
    • 步骤 1first_prompt根据输入{"lastname": "曹", "gender": "女孩"}生成提示字符串。
    • 步骤 2model生成名字(返回AIMessage,例如content="曹梦瑶")。
    • 步骤 3lambda 函数接收上一步的AIMessage,提取content,并将其包装成字典{"name": "曹梦瑶"},以便注入second_prompt
    • 步骤 4second_prompt使用该字典生成新的提示字符串(如 “姓名曹梦瑶,请帮我解析含义。”)。
    • 步骤 5model再次调用,生成名字含义的回复(AIMessage)。
    • 步骤 6str_parser将最终AIMessage转为纯字符串。
  5. 流式输出

    • 调用chain.stream()并传入参数,逐块打印最终结果(stream支持渐进式生成,适合长文本)。

💡 高频面试知识点与回答思路

1.RunnableLambda的作用与使用场景
  • 作用:将任意 Python 函数包装成Runnable,使其能够参与 LCEL 链式编排。
  • 使用场景
    • 数据格式转换(如本例中AIMessagedict)。
    • 插入日志、调试、缓存等副作用。
    • 调用外部 API 或执行自定义业务逻辑。
  • 实现方式:可直接使用lambda表达式,也可用RunnableLambda(func)显式包装。
2. LCEL 链的数据流转规则
  • 链中每个节点必须是Runnable,前一个节点的输出类型需与后一个节点的输入类型兼容。
  • 若类型不匹配,必须通过RunnableLambdaRunnablePassthrough进行适配。
  • 本例中,model输出AIMessage,但second_prompt期望接收包含name键的字典,因此 lambda 担任转换角色。
3.streaminvoke的区别
  • invoke:一次性执行整条链,返回完整结果。
  • stream:返回生成器,逐步产出结果(适合长文本、流式输出)。
  • 两者都支持input参数,但stream对内存更友好,用户体验更好。
4.StrOutputParser的作用
  • AIMessage对象中的content字段提取出来,返回纯字符串。
  • RunnableLambda不同,它是 LangChain 内置的解析器,专门用于输出提取。
5. 链式调用中如何处理中间变量的传递?
  • 可通过RunnableParallel并行传递,或通过RunnablePassthrough保留中间值。
  • 本例中,使用lambda将中间结果转为所需格式,满足下一环节的输入要求。
6. 如果 lambda 函数逻辑复杂,如何保持代码可读性?
  • 可以单独定义一个普通函数,然后用RunnableLambda(func)包装,避免 lambda 过于臃肿。
  • 也可定义类实现__call__或继承Runnable

📌 面试回答话术(示例)

“该文件演示了 LangChain 中RunnableLambda的典型用法。在 LCEL 链中,模型第一次输出的是AIMessage,而后续的PromptTemplate需要字典格式的输入,因此通过一个 lambda 函数提取content并构造字典。这种手法在需要将模型输出‘喂’给下一个 Prompt 时非常常见。流式输出(stream)能提升长文本生成的用户体验。若需更复杂的转换,我会使用显式的RunnableLambda包装函数,保证代码可维护性和可测试性。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 4:01:43

力扣42-接雨水-双指针解法详解

接雨水:从按列计算理解双指针解法 1. 这道题真正容易卡在哪里 LeetCode 42「接雨水」这道题,很多人第一次看双指针解法时,最难理解的往往不是代码语法,而是计算模型。 官方题解里的代码大概是这样: class Solution { p…

作者头像 李华
网站建设 2026/7/3 3:48:26

Java毕设选题推荐:基于 SpringBoot 的水务运行监测与智能应急决策系统的设计与实现 智慧水务突发事件调度处置系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/3 3:38:34

G-Helper终极指南:华硕笔记本色彩修复与性能优化完整方案

G-Helper终极指南:华硕笔记本色彩修复与性能优化完整方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…

作者头像 李华
网站建设 2026/7/3 3:32:04

【双token登录】

双 Token 登录:从概念到实践的完整解读 项目仓库:Factory_Test_Demo 技术栈:Spring Boot 4.1 Java 21 MyBatis-Plus MySQL 我陆续遇到的问题 在做一个多登录方式的认证系统时,我陆续遇到这些问题: 单 Token 和双 …

作者头像 李华
网站建设 2026/7/3 3:30:05

多维聚合中的数据变形术:维度层级、度量聚合与变形链路实战

1. 这不是简单的“GROUP BY”——多维聚合中的数据变形术到底在解决什么问题?如果你正在处理销售报表、用户行为分析、IoT设备时序汇总,或者哪怕只是整理一份带地区、季度、产品线、渠道四个维度的Excel透视表,那你一定遇到过这种场景&#x…

作者头像 李华