LCEL让我们可以用|
管道符把不同的组件或链组合起来,这都得益于这些组件都实现了Runnable接口。
本篇我们就带着Runnable的概念继续学习下LCEL的基础用法。
1. LCEL核心接口Runnable
(1)Runnable接口
Langchain定义了“Runnable”协议,协议中实现了一系列方法,比如对管道运算符
|
的支持、invoke方法等。这里介绍下Runnable定义的一组标准调用接口(其中后三个是前面三个异步方式):
LangChain的很多组件(对象)都应用了Runnable协议,可以把他们称为Runnable对象,这些对象都实现了上述接口,因此这些对象组成的链也都支持上述调用方法。
(2)常用Runnable对象的输入输出类型
LCEL中使用|
将前一个Runnable对象的输出传递给下一个Runnable对象作为输入,因此需要保证管道两端的型号一致。
LangChain常用组件的输入、输出数据类型如下:
组件 | 输入类型 | 输出类型 |
---|---|---|
Prompt (提示词) | 字典 | PromptValue |
ChatModel (聊天模型) | 单个字符串、聊天消息列表或 PromptValue | ChatMessage |
LLM (非聊天模型) | 单个字符串、聊天消息列表或 PromptValue | String |
OutputParser (输出解析器) | LLM 或 ChatModel 的输出 | 取决于解析器 |
Retriever (检索器 ) | 单个字符串 | 文档清单 |
Tool (工具) | 单个字符串或字典,具体取决于工具 | 取决于工具 |
(3) RunnablePassthrough在管道中的作用
在使用LCEL构建链时,原始用户输入可能不仅要传给第一个组件,还要传给后续组件,这时可以用RunnablePassthrough。RunnablePassthrough可以透传用户输入。
2.快速上手
下面我们通过一个包含4个组件的RAG检索链来再次体验LCEL的便捷。
示例场景是基于给定的文本回答用户问题。
STEP1.环境准备
- 注意:由于示例的是检索本地文本,所以安装了向量数据库及其所需的库。
STEP2.构建检索器组件
- 为方便演示,本地文本简单的放一句话:”大鱼吃小鱼,小鱼吃虾米“。
- 用langchain的检索器
as_retriever
,它可以根据输入查询向量库并返回相关文本。
STEP3.构建Prompt提示词组件
- 提示词设计的是根据给定的文字回答问题。
- 提示词中共2个变量:
question
用来接收用户问题,context
来接收检索器的查询结果。
STEP4.构建llm组件
STEP5.组合成链
- 把检索器、提示词、模型、输出解析器四个组件串起来,命名为检索链
retrieval_chain
。 - 这一步注意两点:
- 用户输入的问题,不止组件1的检索器要用,组件2也要用它来构建提示词,因此组件1使用RunnablePassthrough方法把原始输入透传给下一步。
- 由于组件2 prompt的输入要求是字典类型,所以组件1把检索器和用户问题写成字典格式,并用组件2的变量作为键。
STEP6.运行链
- 传入用户问题,得到期望结果。
3.小结
本文解读了LangChain LCEL及其Runnable基础语法,关键要点如下:
Runnable接口
Runnable是Langchain表达式语言的核心接口
Runnable提供了一组标准调用接口:stream、invoke、batch及对应的异步方法。
Langchain很多组件都遵循Runnable协议,因此可以方便的组合、调用。
常用Runnable对象的输入输出类型要求,用管道
|
方式组合时需注意管道两端的类型一致。RunnablePassthrough在管道中的作用。
实例演示
- 构建了包含四个组件的检索链。
- 通过实操关注了管道前后数据类型的匹配、RunnablePassthrough的作用。
参考文档:翻译的LangChain官方文档
- 翻译链接:https://jherculesqz.gitbook.io/langchain-guan-fang-wen-dang