1.2 使用LangChain中的RunnableLambda

📅 2026/7/3 4:02:39
1.2 使用LangChain中的RunnableLambda
文件代码内容fromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportPromptTemplatefromlangchain_community.chat_models.tongyiimportChatTongyi modelChatTongyi(modelqwen3-max)str_parserStrOutputParser()first_promptPromptTemplate.from_template(我邻居姓{lastname}刚生了{gender}请帮忙起名字仅生成一个名字并告知我名字不要额外信息。)second_promptPromptTemplate.from_template(姓名{name}请帮我解析含义。)# 函数的入参AIMessage - dict ({name: xxx})# my_func RunnableLambda(lambda ai_msg: {name: ai_msg.content})#可以封装也可以直接把函数加入到链中chainfirst_prompt|model|(lambdaai_msg:{name:ai_msg.content})|second_prompt|model|str_parserforchunkinchain.stream({lastname:曹,gender:女孩}):print(chunk,end,flushTrue) 代码流程梳理导入依赖StrOutputParser将模型输出的AIMessage转为纯字符串。PromptTemplate定义提示模板。ChatTongyi通义千问聊天模型。初始化组件创建ChatTongyi实例模型。创建StrOutputParser实例解析器。定义两个提示模板first_prompt要求模型根据姓氏和性别生成一个名字限定只输出名字无额外信息。second_prompt要求模型解析该名字的含义输入变量为name。构建 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转为纯字符串。流式输出调用chain.stream()并传入参数逐块打印最终结果stream支持渐进式生成适合长文本。 高频面试知识点与回答思路1.RunnableLambda的作用与使用场景作用将任意 Python 函数包装成Runnable使其能够参与 LCEL 链式编排。使用场景数据格式转换如本例中AIMessage→dict。插入日志、调试、缓存等副作用。调用外部 API 或执行自定义业务逻辑。实现方式可直接使用lambda表达式也可用RunnableLambda(func)显式包装。2. LCEL 链的数据流转规则链中每个节点必须是Runnable前一个节点的输出类型需与后一个节点的输入类型兼容。若类型不匹配必须通过RunnableLambda或RunnablePassthrough进行适配。本例中model输出AIMessage但second_prompt期望接收包含name键的字典因此 lambda 担任转换角色。3.stream与invoke的区别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包装函数保证代码可维护性和可测试性。”