教程:https://www.bilibili.com/video/BV1yjz5BLEoY

代码:https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev

云开发平台:https://hzh.sealos.run

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

介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

←AI回复

已创建代码文件 25_LangChain_RunnableLambda.py。该文件包含:

主要内容

  1. RunnableLambda 基本介绍:说明 RunnableLambda 的作用和用途
  2. RunnableLambda 基本用法:演示如何创建和使用 RunnableLambda
  3. 使用 RunnableLambda 构建多模型链:完整示例,展示在链中使用 RunnableLambda 进行数据转换
  4. 直接在链中使用 lambda 函数:演示可以跳过 RunnableLambda,直接在链中使用 lambda 函数
  5. 对比两种方式:对比显式使用 RunnableLambda 和直接使用 lambda 的区别
  6. 更多自定义转换示例:展示不同的数据转换场景

核心要点

  • 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 提供了极大的灵活性,可以根据需求自定义任何数据转换逻辑
===============================================================================

总结

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐