LCEL介绍
LangChain 表达式语言(LCEL)是一种声明式的方法,可以轻松地将多个链条组合在一起。
LCEL 从第一天开始设计就支持将原型投入生产,无需进行代码更改,从最简单的“提示 + LLM”链条到最复杂的链条(我们见过人们在生产中成功运行包含数百个步骤的 LCEL 链条)
- 支持流式
- 支持异步
- 支持并行
- 无缝 LangSmith 跟踪
- 无缝 LangServe 部署
LCEL使用
基本示例:提示(Prompt) + 模型(Model) + 输出解析器(OutputParser)
简单示例
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 模型
model = ChatOpenAI(参数省略...)
# 模板
prompt = ChatPromptTemplate.from_template("你是历史专家,请讲一个关于{topic}的历史故事。")
# 输出解析器
output_parser = StrOutputParser()
# 链
chain = prompt | model | output_parser
# 执行
chain.invoke({
"topic": "刘彻"})
chain = prompt | model | output_parser:类似于unix管道运算符,其中链将不同的组件组合在一起,从一个组件提供输出作为下一个组件的输入。|
在此链中,用户输入被传递到提示模板,然后提示模板输出传递给模型,然后模型输出为传递给输出解析器。
元素解读
- prompt :是一个BasePromptTemplate,这意味着它接受模板变量的字典并生成PromptValue,是提示词包装
- model :将PromptValue传递给模型。在这种情况下,我们的模型是ChatModel,这意味着它将输出BaseMessage
- output_parser
:最后,我们将模型输出传递给output_parser,它是一个BaseOutputParser,这意味着它接受字符串或BaseMessage作为输入。指定的StrOutputParser只需将任何输入转换为字符串
完整步骤
- 我们将用户的主题以 {“topic”:“刘彻”} 形式输入
- 提示组件(Prompt)接受用户输入,然后在使用主题构造提示后使用该输入构造PromptValue。
- 模型组件(Model)接受生成的提示,并传递到OpenAI LLM模型中进行评估。模型生成的输出是一个ChatMessage对象。
- 最后,output_parser组件接收ChatMessage,并将其转换为从invoke方法返回的Python字符串。
知道具体步骤后,我们可以对其拆分,查看中间过程结果
# 模型
model = ChatOpenAI(参数省略...)
# 模板
prompt = ChatPromptTemplate.from_template("你是历史专家,请讲一个关于{topic}的历史故事。")
input = {
"topic": "刘彻"}
# prompt执行invoke方法的输出
prompt.invoke(input)
# 输出
ChatPromptValue(messages=[HumanMessage(content='你是历史专家,请讲一个关于刘彻的历史故事。')])
# prompt+model执行invoke的输出