33.RAG开发-20-自定义函数加入链

RunnambeLambda

chain = first_prompt | model | json_parser | second_prompt | model | str_parser

我们根据JsonOutputParser完成了多模型执行链条的构建。

  • 除了JsonOutputParser这类固定功能的解析器之外
  • 我们也可以自己编写Lambda匿名函数来完成自定义逻辑的数据转换,想怎么转换就怎么转换,更自由。
    想要完成这个功能,可以基于RunnableLambda类实现。

RunnableLambda类是Langchain内置的,将普通函数等转换为Runnable接口实例,方便自定义函数加入chain。

语法:
RunnableLambda(函数对象或lambda匿名函数)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
自定义函数 RunnableLambda 加入链示例

该脚本演示了如何使用 LangChain 的 RunnableLambda 功能,将自定义函数集成到链式调用中,
实现先生成名字,将名字转为大写,再解析名字含义的完整流程。
"""

# 导入必要的模块
from langchain_core.prompts import PromptTemplate  # 导入提示模板
from langchain_core.output_parsers import StrOutputParser  # 导入字符串输出解析器
from langchain_community.chat_models.tongyi import ChatTongyi  # 导入通义千问模型
from langchain_core.runnables import RunnableLambda  # 导入RunnableLambda,用于包装自定义函数

# 初始化输出解析器
str_parser = StrOutputParser()  # 字符串输出解析器,用于解析最终的文本结果

# 定义自定义函数:将AI返回的消息内容转换为普通字符串
# RunnableLambda 包装了一个lambda函数,该函数接收AI消息对象并返回其内容,其中ai_msg的数据类型是ChatMessage对象
my_func = RunnableLambda(lambda ai_msg: ai_msg.content)

# 初始化模型
model = ChatTongyi(model="qwen3-max")  # 使用通义千问的 qwen3-max 模型

# 第一个提示模板:生成名字
first_prompt = PromptTemplate.from_template(
    "我的邻居姓{lastname},刚生了{gender},请起名,仅生成一个名字并告知我名字,不要额外信息"
)

# 第二个提示模板:解析名字的含义
second_prompt = PromptTemplate.from_template(
    "姓名{name},请帮我解析含义"
)

# 构建链式调用
# 流程:第一个提示模板 -> 模型生成 -> 自定义函数(转为普通字符串) -> 第二个提示模板 -> 模型生成 -> 字符串解析
chain = first_prompt | model | my_func | second_prompt | model | str_parser

# 执行链式调用,传入参数
res: str = chain.invoke({"lastname": "张", "gender": "女儿"})

# 打印结果
print(res)  # 打印解析后的名字含义
print(type(res))  # 打印结果类型

“张若溪”是一个富有诗意和文化内涵的中文名字,我们可以从姓氏和名字两个部分来解析其含义:

一、姓氏:张(Zhāng)
“张”是中国常见的大姓之一,源于姬姓,历史悠久。在古代,“张”有“张开、展开、扩张”之意,象征着开阔、进取与包容。

二、名字:若溪(Ruò Xī)

1. 若(Ruò)
“若”字在古汉语中有多重含义,常见有:
- 如同、好像(如“若水”意为像水一样柔顺);
- 如果、假设(表条件);
- 在人名中,“若”常用于表达温婉、柔美、文雅的气质,带有古典诗意。
- 古代也用作第二人称代词(你),但在现代名字中多取其“如同、似”的美好寓意。

2. 溪(Xī)
“溪”指山间的小河或水流,清澈、灵动、自然。在传统文化中,溪水象征:
- 纯洁、澄澈的心灵;
- 绵延不绝的生命力;
- 宁静致远、淡泊明志的品格;
- 与“上善若水”相呼应,体现道家崇尚自然、柔中带刚的哲学。

三、整体寓意
“若溪”合起来可理解为“如溪水一般”,寓意:
- 性格温婉柔和,内心澄明;
- 品行高洁,如清溪般纯净;
- 生命如溪流,虽不张扬却源远流长,充满韧性与活力。

搭配姓氏“张”,全名“张若溪”读音流畅(Zhāng Ruò Xī),平仄协调(平—仄—平),音韵优美,意境清新脱俗,既有古典韵味,又不失 现代感。

总结:
“张若溪”是一个兼具美感、哲理与文化底蕴的名字,寄托了对拥有者如溪水般清澈、温柔、坚韧、灵动的美好期许。
<class 'langchain_core.messages.base.TextAccessor'>
image.png

跳过RunnableLambda类,直接让函数加入链也是可以的。
因为Runnable接口类在实现 _ _or _ _的时候,支持Callable接口的实例。

  • 函数就是Callable接口的实例
image.png

如上代码示例, | 符号(底层是调用 _ _or _ _)组链,是支持函数加入的。
其本质是将函数 自动转换为RunnableLambda

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容