学习 LangChain 的 LCEL
- 0. 引言
- 1. 基本示例:提示+模型+输出解析器
- 1-1. Prompt
- 1-2. Model
- 1-3. Output parser
- 1-4. Entire Pipeline
0. 引言
LCEL(LangChain Expression Language) 可以轻松地从基本组件构建复杂的链,并支持开箱即用的功能,例如流式传输、并行性和日志记录。
1. 基本示例:提示+模型+输出解析器
最基本和常见的用例是将提示模板和模型链接在一起。为了看看这是如何工作的,让我们创建一个接受主题并生成笑话的链:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
chain.invoke({"topic": "ice cream"})
请注意这行代码,我们使用 LCEL 将不同的组件拼凑成一个链:
chain = prompt | model | output_parser
|
符号类似于 unix 管道运算符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。
在此链中,用户输入传递到提示模板,然后提示模板输出传递到模型,然后模型输出传递到输出解析器。让我们分别看一下每个组件,以真正了解发生了什么。
1-1. Prompt
prompt
是一个 BasePromptTemplate
,这意味着它接受模板变量的字典并生成一个 PromptValue
。 PromptValue
是一个完整提示的包装器,可以传递给 LLM (它接受一个字符串作为输入)或 ChatModel
(它接受一个序列作为输入的消息)。它可以与任何一种语言模型类型一起使用,因为它定义了生成 BaseMessage
和生成字符串的逻辑。
prompt_value = prompt.invoke({"topic": "ice cream"})
prompt_value
prompt_value.to_messages()
prompt_value.to_string()
1-2. Model
然后 PromptValue
被传递给 model
。在本例中,我们的 model
是 ChatModel
,这意味着它将输出 BaseMessage
。
message = model.invoke(prompt_value)
message
如果我们的 model
是 LLM
,它将输出一个字符串。
from langchain_openai.llms import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-instruct")
llm.invoke(prompt_value)
1-3. Output parser
最后,我们将 model
输出传递给 output_parser
,这是一个 BaseOutputParser
,意味着它接受字符串或 BaseMessage
作为输入。 StrOutputParser
特别简单地将任何输入转换为字符串。
output_parser.invoke(message)
1-4. Entire Pipeline
请按照以下步骤操作:
-
我们将所需主题的用户输入传递为
{"topic": "ice cream"}
-
prompt
组件获取用户输入,然后在使用topic
构造提示后,将其用于构造PromptValue
。 -
model
组件获取生成的提示,并传递到OpenAI LLM
模型进行评估。模型生成的输出是一个ChatMessage
对象。 -
最后,
output_parser
组件接收ChatMessage
,并将其转换为Python
字符串,该字符串从invoke
方法返回。
请注意,如果您对任何组件的输出感到好奇,您始终可以测试链的较小版本,例如 prompt
或 prompt | model
以查看中间结果:
input = {"topic": "ice cream"}
prompt.invoke(input)
# > ChatPromptValue(messages=[HumanMessage(content='tell me a short joke about ice cream')])
(prompt | model).invoke(input)
# > AIMessage(content="Why did the ice cream go to therapy?\nBecause it had too many toppings and couldn't cone-trol itself!")
refer: https://python.langchain.com/docs/expression_language/get_started