LangChain Expression Language 入门

278 阅读3分钟

大家好,我是雨飞。

LangChain 的表达式语言(简称LCEL),是 LangChain 提供的一种类似 linux 管道操作的符号语言,通过这种语言可以更方便轻松的构建 LLMChain 去实现对话调用,RAG 等操作。今天,就让我们一起来了解一下这门语言。

一、什么是 LCEL

LCEL 是一种声明式方法,可以轻松地将链组合在一起。LCEL 从设计之初就支持将原型投入生产, 从最简单的 "prompt + LLM "链到最复杂的链,无需修改代码。主要的优点有下面几个:

1、对于流式处理的支持。当你使用 LCEL 去构建链时,可以很方便的转为流式输出。而使用其他方法,则需要重新修改代码

2、异步支持。使用 LCEL的时候,可以同时使用同步和异步的 API 进行调用。

3、并行执行优化。如果 LCEL 中有一些步骤可以并行执行,那么就可以自动的去并行执行,不需要额外修改代码

4、重试和回退机制。可以提高整个链路调用的可靠性。

5、访问中间结果。你可以通过 LangServe 去方便的访问链路中的中间 结果。

6、输入输出模式定义。LCEL 可以使用 pydantic 和 JSON 格式去验证链的输入和输出。

7、无缝衔接 LangSmith 和 LangServe。

二、参考示例

下面是一个简单的 LECL 调用示例,其中| 这个符号和 linux 的管道符号比较相似,意味着链可以轻易的链接各个组件。比如,从提示词到大模型到最后的输出解析器就构成了一个 chain。

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate


model = ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_template("请帮我讲一个关于{topic}的笑话")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

chain.invoke({"topic": "冰激凌"})

1、提示词

我们使用了 ChatPromptTemplate 去表示提示词,这个和 python 的 format 语法比较类似,用于将括号里的词进行填充。因此,我们如果想在 ChatPromptTemplate 中使用括号的时候,需要转义,使用 {{x}} 的这种形式。

prompt_value = prompt.invoke({"topic": "ice cream"})

2、模型

我们使用了 OpenAI 的 ChatModel 去接受这个提示词,然后输出一个 BaseMessage 的类。如果是 LLM,则只会输出一个字符串。

3、输出解析器

我们最后,将模型的输出传递给输出解析器,它可以接受 string 或者 BaseMessage 作为输入。其中,StrOutputParser 就是会把输入转为一个 string。

4、全部的流水线

将上面三个步骤进行串接,我们就得到了一开始的调用链。

首先,将用户的输入传递给提示词模板,然后输出一个 PromptValue ;模型根据提示词进行处理,得到处理之后的 ChatMessage;输出解析器将 ChatMessage 解析成字符串得到最终的结果。

当然,我们也可以任意组合形成新的链去看一下这个链路的中间结果,比如

 input = {"topic": "冰激凌"}

prompt.invoke(input)

(prompt | model).invoke(input)

更多示例,可以参考下面的文章:

雨飞:从零开始学 langchain 之搭建最小的 RAG 系统

好了,这篇文章到此结束,如果对你有所感悟,欢迎点赞,评论 。也欢迎加我微信 「1060687688」,一起交流。