黑马大模型RAG与Agent智能体实战教程LangChain提示词——22、RAG开发——RunnableLambda&自定义函数加入链(Callable接口、自定义解析函数)
已创建代码文件。
·
教程:https://www.bilibili.com/video/BV1yjz5BLEoY
代码:https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev
文章目录
RAG开发-20、自定义函数加入链
介绍



→提示词:帮我根据图片内容,创建代码25,简单介绍RunnableLambda&自定义函数加入链@AI_LLM_RAG_Agent_Dev



←AI回复
已创建代码文件 25_LangChain_RunnableLambda.py。该文件包含:
主要内容
- RunnableLambda 基本介绍:说明 RunnableLambda 的作用和用途
- RunnableLambda 基本用法:演示如何创建和使用 RunnableLambda
- 使用 RunnableLambda 构建多模型链:完整示例,展示在链中使用 RunnableLambda 进行数据转换
- 直接在链中使用 lambda 函数:演示可以跳过 RunnableLambda,直接在链中使用 lambda 函数
- 对比两种方式:对比显式使用 RunnableLambda 和直接使用 lambda 的区别
- 更多自定义转换示例:展示不同的数据转换场景
核心要点
- RunnableLambda 将普通函数或 lambda 转换为 Runnable 接口实例
- 可以直接在链中使用 lambda 函数,因为
__or__方法支持 Callable 接口 - 提供了比固定功能解析器(如 JsonOutputParser)更灵活的自定义数据转换能力
代码风格与现有文件保持一致,包含详细的中文注释和说明。可以直接运行该文件查看演示效果。
运行代码
结果
示例6代码没严格控制,有点问题,记录一下:

================================================================================
LangChain RunnableLambda 自定义函数加入链示例
================================================================================
================================================================================
【示例一】RunnableLambda 基本介绍
================================================================================
1. RunnableLambda 是什么:
- RunnableLambda 是 LangChain 内置的类
- 将普通函数或 lambda 匿名函数转换为 Runnable 接口实例
- 方便自定义函数加入 chain,实现更灵活的数据转换
2. 为什么需要 RunnableLambda:
- 除了 JsonOutputParser 这类固定功能的解析器之外
- 我们也可以自己编写 Lambda 匿名函数来完成自定义逻辑的数据转换
- 想怎么转换就怎么转换,更自由
3. 语法:
RunnableLambda(函数对象或 lambda 匿名函数)
4. 示例:
my_func = RunnableLambda(lambda ai_msg: {'name': ai_msg.content})
这个函数将 AIMessage 对象转换为包含 'name' 键的字典
================================================================================
【示例二】RunnableLambda 基本用法
================================================================================
1. 创建 RunnableLambda 实例:
my_func = RunnableLambda(lambda ai_msg: {'name': ai_msg.content})
my_func 的类型:<class 'langchain_core.runnables.base.RunnableLambda'>
my_func 是否是 Runnable 的子类:True
2. 模拟模型的输出(AIMessage 对象):
ai_message = AIMessage(content='张雨萱')
ai_message 的类型:<class 'langchain_core.messages.ai.AIMessage'>
ai_message.content:张雨萱
3. 使用 RunnableLambda 处理 AIMessage:
result = my_func.invoke(ai_message)
result 的类型:<class 'dict'>
result 的值:{'name': '张雨萱'}
结论:RunnableLambda 可以将 AIMessage 转换为自定义格式的字典。
================================================================================
【示例三】使用 RunnableLambda 构建多模型链(完整示例)
================================================================================
1. 创建解析器实例:
str_parser = StrOutputParser()
2. 创建模型实例:
model = ChatTongyi(model='qwen3-max')
3. 创建 RunnableLambda 实例:
my_func = RunnableLambda(lambda ai_msg: {'name': ai_msg.content})
作用:将 AIMessage 转换为包含 'name' 键的字典
4. 创建第一个提示词模板:
first_prompt = PromptTemplate.from_template(...)
要求:仅告知名字,不要额外信息
5. 创建第二个提示词模板:
second_prompt = PromptTemplate.from_template('姓名{name},请帮我解析含义。')
使用第一个模型输出的 name 字段
6. 构建链:
chain = first_prompt | model | my_func | second_prompt | model | str_parser
链的执行流程:
1. first_prompt: 接收变量字典,输出 PromptValue
2. 第一个 model: 接收 PromptValue,输出 AIMessage(名字)
3. my_func: 接收 AIMessage,提取 content,输出 dict({'name': '...'})
4. second_prompt: 接收 dict,使用 name 字段构建新的 PromptValue
5. 第二个 model: 接收 PromptValue,输出 AIMessage(名字含义解析)
6. str_parser: 接收 AIMessage,输出 str(最终字符串结果)
7. 调用链:
res = chain.invoke({'lastname': '张', 'gender': '女儿'})
================================================================================
✅ 成功!最终结果:
“张若溪”是一个富有诗意和文化内涵的中文名字,我们可以从姓氏和名字两个部分来解析其含义:
---
### 一、姓氏:张(Zhāng)
“张”是中国最常见的姓氏之一,源自上古时期,有多种起源说法,如出自黄帝之子挥,因发明弓箭而被赐姓“张”(“张”本义为拉开弓)。作为姓氏,“张”本身不直接参与名字的寓意,但承载家族传承。
---
### 二、名字:若溪(Ruò Xī)
#### 1. 若(Ruò)
- **字义**:
“若”在古汉语中有多重含义,常见的有:
- **如同、好像**(如“若水”意为“像水一样”);
- **柔美、温婉**(常用于形容女子气质);
- 在文言中也作第二人称代词“你”,但现代取名中多取其比喻、柔美的意象。
- **文化意象**:
“若”字常出现在古典诗词中,如“翩若惊鸿”“静若处子”,给人以轻盈、优雅、含蓄之感。
#### 2. 溪(Xī)
- **字义**:
“溪”指山间的小河或水流,清澈、灵动、自然。
- **文化意象**:
溪水象征纯净、柔韧、生生不息。古人常以“溪”入诗,如“明月松间照,清泉石上流”(王维),表达宁静致远、淡泊明志的情怀。
#### 3. “若溪”整体寓意
“若溪”可理解为 **“如溪水一般”**,引申为:
- 性格温柔、清澈、纯净;
- 心境宁静、淡雅、通透;
- 生命如溪流般绵延不息,柔中带刚。
这个名字整体意境优美,富有自然之美与古典韵味,常用于女孩名字,体现父母希望孩子拥有如水般的柔美、智慧与坚韧。
---
### 三、音韵与书写
- **读音**:Zhāng Ruò Xī,平仄相间(阴平–去声–阴平),音调婉转悦耳,朗朗上口。
- **字形**:“若”简洁,“溪”虽笔画稍多,但结构平衡,整体书写美观。
---
### 总结
“张若溪”是一个兼具诗意、文化深度与美好寓意的名字,寓意女孩如溪水般清澈灵动、温婉坚韧,既有古典雅致之气,又不失现代清新之感。
如需进一步分析五行、八字适配或英文名建议,也可以告诉我!
结果类型:<class 'str'>
================================================================================
================================================================================
【示例四】直接在链中使用 lambda 函数
================================================================================
1. 说明:
跳过 RunnableLambda 类,直接让函数加入链也是可以的。
因为 Runnable 接口类在实现 `__or__` 的时候,支持 Callable 接口的实例。
函数就是 Callable 接口的实例。
2. 创建组件:
str_parser = StrOutputParser()
model = ChatTongyi(model='qwen3-max')
first_prompt = PromptTemplate.from_template(...)
second_prompt = PromptTemplate.from_template(...)
3. 直接在链中使用 lambda 函数:
chain = first_prompt | model | (lambda ai_msg: {'name': ai_msg.content}) | second_prompt | model | str_parser
注意:lambda 函数直接放在链中,不需要显式使用 RunnableLambda
其本质是将函数自动转换为 RunnableLambda
4. 调用链:
res = chain.invoke({'lastname': '张', 'gender': '女儿'})
================================================================================
✅ 成功!最终结果:
“张若溪”是一个富有诗意和文化内涵的中文名字,我们可以从姓氏和名字两个部分来解析其含义:
一、姓氏:张
“张”是中国最常见的姓氏之一,源自上古时期,有“开弓”“扩张”之意,象征着开拓、进取与包容。在传统文化中,“张”也常与“张弛有度”联系在一起,寓意做事有分寸、进退得当。
二、名字:若溪
1. **若**:
- “若”是一个文雅的虚词,在古汉语中常作“如同”“好像”解,如“若水”“若兰”,具有柔美、温婉、含蓄的意象。
- 在人名中,“若”常用来表达一种轻盈、灵动、谦和的气质,也带有古典文学的韵味。
2. **溪**:
- “溪”指山间的小河或清流,象征清澈、纯净、宁静与生生不息。
- 在中国传统文化中,水代表智慧、柔韧与滋养,《道德经》有云:“上善若水,水善利万物而不争。”因此,“溪”也暗含谦逊、柔和而坚韧的品格。
三、整体寓意:
“若溪”合起来可理解为“如溪水一般”,形容人如清溪般澄澈、温柔、灵动,又不失内在的力量与恒久的生命力。整个名字“张若溪”给人一种清新脱俗、温婉雅致、富有灵性与文化底蕴的感觉。
四、音韵美感:
- 声调为:张(阴平)-若(去声)-溪(阴平),读起来抑扬顿挫,流畅悦耳。
- 字形结构也较为平衡,书写美观。
总结:
“张若溪”是一个兼具诗意、哲理与美感的名字,寓意品性高洁、心地澄明、气质温婉,同时蕴含自然之灵与人文之雅,非常适合追求内在修养与外在柔美的女性。
结果类型:<class 'str'>
================================================================================
================================================================================
【示例五】RunnableLambda vs 直接使用 lambda 函数
================================================================================
方式1:显式使用 RunnableLambda
my_func = RunnableLambda(lambda ai_msg: {'name': ai_msg.content})
chain1 = first_prompt | model | my_func | second_prompt | model | str_parser
方式2:直接使用 lambda 函数
chain2 = first_prompt | model | (lambda ai_msg: {'name': ai_msg.content}) | second_prompt | model | str_parser
两种方式的结果对比:
方式1 的结果:
================================================================================
“张婉清”是一个富有诗意和文化内涵的中文姓名,我们可以从姓氏、名字的字义以及整体意境三个方面来解析其含义:
一、姓氏:“张”
“张”是中国的大姓之一,源于姬姓,历史悠久。作为姓氏,“张”本身没有特定的寓意,但在姓名学中,它为名字提供了稳定的基础。
二、名字解析:
1. **婉(wǎn)**
- 字义:温柔、和顺、美好。常用于形容女子温婉贤淑、言辞委婉动听。
- 引申义:有涵养、举止优雅、性情柔和。
- 文化意象:如《诗经》中有“婉兮清扬”,形容女子容貌清秀、气质温婉。
2. **清(qīng)**
- 字义:清澈、纯净、高洁、明朗。可指水质清澈,也可引申为品行清白、心境澄明。
- 引申义:清雅脱俗、心思清明、志趣高远。
- 文化意象:古人常用“清”字表达对高尚人格的追求,如“清风明月”“冰清玉洁”。
三、整体意境:“婉清”
“婉清”二字结合,营造出一种柔美而清雅的气质——既有温婉柔和之美,又有清丽脱俗之韵。整体给人以恬静、文雅、纯净、知性的印象,非常适合女性使用。
四、音韵美感:
“张婉清”读作 Zhāng Wǎn Qīng,声调为阴平—上声—阴平,起伏有致,音律和谐,朗朗上口,具有古典诗词般的韵律美。
五、综合寓意:
“张婉清”寓意一位性情温婉、内心澄澈、品行高洁、气质优雅的女子,既有传统美德,又不失清新脱俗的现代审美。
这个名字典雅而不失灵动,传统中蕴含诗意,是一个非常优美且富有文化深度的名字。
================================================================================
方式2 的结果:
================================================================================
“张若曦”是一个富有诗意和文化内涵的中文名字,我们可以从姓氏和名字两个部分来解析其含义:
一、姓氏:张
“张”是中国最常见的姓氏之一,源于上古时期,有“开弓”“扩张”之意,象征着开拓、进取与包容。在传统文化中,“张”也常与“张弛有度”联系在一起,寓意做事有分寸、进退得当。
二、名字:若曦
1. **若**:
- 本义为“如同、好像”,常用于文言虚词,带有柔美、婉约的语气。
- 在人名中,“若”常用来表达温婉、文雅、聪慧的气质,如“若水”“若兰”等。
- 也有“顺从、柔和”的引申义,体现一种谦和内敛的品格。
2. **曦**:
- 指“晨曦”“阳光”,特指清晨的第一缕阳光,象征希望、光明、温暖与新生。
- 在古诗词中常被用来描绘朝霞初照、万物苏醒的美好景象,如“晨曦微露”。
- 用作人名时,寓意前途光明、性格开朗、充满活力。
三、整体寓意:
“若曦”连读,意为“如同晨曦一般”,给人以清新、温柔、明亮之感。整个名字“张若曦”可理解为:
> 如晨光般温婉明亮、充满希望的女子,既有内在的柔美与智慧,又蕴含外在的光明与朝气。
四、音韵与美感:
- 音调为:张(一声)— 若(四声)— 曦(一声),读起来抑扬顿挫,流畅悦耳。
- 字形结构优美,“若”字草字头显柔美,“曦”字日字旁带光明,整体视觉和谐。
五、文化联想:
“若曦”一名常见于文学作品或影视剧中(如《步步惊心》中的马尔泰·若曦),因此也带有一定的文艺气息和古典美感。
总结:
“张若曦”是一个兼具诗意、寓意美好、音形俱佳的名字,寄托了父母对孩子温柔聪慧、前途光明、如晨曦般温暖而充满希望的美好祝愿。
================================================================================
结论:
- 两种方式功能完全等价
- 显式使用 RunnableLambda 更清晰,适合复杂函数
- 直接使用 lambda 函数更简洁,适合简单转换
- 本质都是将函数转换为 RunnableLambda
================================================================================
【示例六】更多自定义数据转换示例
================================================================================
示例1:提取并重命名字段
将 AIMessage 的 content 提取为 'generated_name' 字段
结果:“李承宇”是一个典型的中文名字,由姓氏“李”和名字“承宇”组成。我们可以从字义、文化内涵和音韵等方面来解析其含义:
1. **姓氏:李**
“李”是中国最常见的姓氏之一,源远流长,历史悠久...
示例2:添加额外字段
在提取名字的同时,添加时间戳和来源信息
结果:“王若溪”是一个富有诗意和文化意蕴的中文名字,可以从字义、音韵和整体意境三个方面来解析其含义:
1. **姓氏“王”**
“王”是中国常见的大姓之一,本义为“君主”“王者”,象征尊贵、权威...
示例3:格式化输出
将名字格式化为特定结构
结果:“张若曦”是一个典型的中文姓名,其中“张”是姓氏,“若曦”是名字。以下是对“若曦”这一名字部分的含义分析:
1. **字义解析**:
- **若**:
- 本义为“如同、好像”,常...
总结:
- RunnableLambda 提供了极大的灵活性
- 可以根据需求自定义任何数据转换逻辑
- 比固定功能的解析器(如 JsonOutputParser)更自由
================================================================================
全部示例执行完毕。
================================================================================
总结:
1. RunnableLambda 是 LangChain 内置的类,将函数转换为 Runnable 接口实例
2. 除了固定功能的解析器(如 JsonOutputParser),
我们也可以使用 RunnableLambda 完成自定义逻辑的数据转换
3. 可以直接在链中使用 lambda 函数,不需要显式使用 RunnableLambda
4. Runnable 接口的 `__or__` 方法支持 Callable 接口,
函数会自动转换为 RunnableLambda
5. RunnableLambda 提供了极大的灵活性,可以根据需求自定义任何数据转换逻辑
===============================================================================
总结

更多推荐



所有评论(0)