LCEL让我们可以用|管道符把不同的组件或链组合起来,这都得益于这些组件都实现了Runnable接口。

本篇我们就带着Runnable的概念继续学习下LCEL的基础用法。

image-20231222104906413

1. LCEL核心接口Runnable

(1)Runnable接口

  • Langchain定义了“Runnable”协议,协议中实现了一系列方法,比如对管道运算符|的支持、invoke方法等。

  • 这里介绍下Runnable定义的一组标准调用接口(其中后三个是前面三个异步方式):

    • stream:流式输出

    • invoke:基于单一输入调用链

    • batch:基于列表输入调用链

    • astream:异步流式输出

    • ainvoke:基于单一输入异步调用链

    • abatch:基于列表输入异步调用链

  • LangChain的很多组件(对象)都应用了Runnable协议,可以把他们称为Runnable对象,这些对象都实现了上述接口,因此这些对象组成的链也都支持上述调用方法。

(2)常用Runnable对象的输入输出类型

LCEL中使用|将前一个Runnable对象的输出传递给下一个Runnable对象作为输入,因此需要保证管道两端的型号一致。

LangChain常用组件的输入、输出数据类型如下:

组件输入类型输出类型
Prompt (提示词)字典PromptValue
ChatModel (聊天模型)单个字符串、聊天消息列表或 PromptValueChatMessage
LLM (非聊天模型)单个字符串、聊天消息列表或 PromptValueString
OutputParser (输出解析器)LLM 或 ChatModel 的输出取决于解析器
Retriever (检索器 )单个字符串文档清单
Tool (工具)单个字符串或字典,具体取决于工具取决于工具

(3) RunnablePassthrough在管道中的作用

在使用LCEL构建链时,原始用户输入可能不仅要传给第一个组件,还要传给后续组件,这时可以用RunnablePassthrough。RunnablePassthrough可以透传用户输入。

2.快速上手

下面我们通过一个包含4个组件的RAG检索链来再次体验LCEL的便捷。

示例场景是基于给定的文本回答用户问题。

STEP1.环境准备

  • 注意:由于示例的是检索本地文本,所以安装了向量数据库及其所需的库。

image-20231223004634709

STEP2.构建检索器组件

  • 为方便演示,本地文本简单的放一句话:”大鱼吃小鱼,小鱼吃虾米“。
  • 用langchain的检索器as_retriever,它可以根据输入查询向量库并返回相关文本。

image-20231223005234058

STEP3.构建Prompt提示词组件

  • 提示词设计的是根据给定的文字回答问题。
  • 提示词中共2个变量:question用来接收用户问题,context来接收检索器的查询结果。

image-20231223010525145

STEP4.构建llm组件

image-20231223011307090

STEP5.组合成链

  • 把检索器、提示词、模型、输出解析器四个组件串起来,命名为检索链retrieval_chain
  • 这一步注意两点:
    • 用户输入的问题,不止组件1的检索器要用,组件2也要用它来构建提示词,因此组件1使用RunnablePassthrough方法把原始输入透传给下一步。
    • 由于组件2 prompt的输入要求是字典类型,所以组件1把检索器和用户问题写成字典格式,并用组件2的变量作为键。

image-20231223011350292

STEP6.运行链

  • 传入用户问题,得到期望结果。

image-20231223011640703

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