LangChain表达式
LangChain表达式语言(LCEL) 使得从基本组件构建复杂链条变得容易,并且支持诸如流式处理、并行处理和日志记录等开箱即用的功能
LCEL基本示例:提示+模型+输出解析器
将提示模板和模型链接在一起,让它为我们实现一个语言翻译的功能
首先需要安装库文件
pip install --upgrade --quiet langchain-core langchain-community langchain-openai
接下来是python代码
我使用的是gpt-4o-mini的模型,这个模型的API是免费调用的,但是需要使用科学手段来访问到openAI的官网。在代码中加上本地的http_proxy代理和https_proxy代理,或者直接使用梯子也可。
import os
#openAI的API密钥
os.environ["OPENAI_API_KEY"] = 'your_openai_key'
#本地代理
os.environ['http_proxy'] = 'your_proxy'
os.environ['https_proxy'] = 'your_proxy'
# 此处为LangSmith监测,可以忽略
os.environ["LANGCHAIN_TRACING_V2"]="true"
os.environ["LANGCHAIN_API_KEY"]="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"
此处的代码前期环境准备工作已经结束,在后面的讲解中我将不再赘述。
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("{text}.Please translate this sentence from {input_language} to {output_language}")
model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
messages = {
"text":"生活不易,我学LangChain",
"input_language":"Chinese",
"output_language":"English",
}
chain.invoke(messages)
"Life is not easy, I am learning LangChain."
|
符号类似于 unix 管道操作符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。在这个链条中,用户输入被传递给提示模板,然后提示模板的输出被传递给模型,然后模型的输出被传递给输出解析器。这样我们就完成了第一个小案例
接下来我们逐个组件来探寻一下,理解整个过程的运行逻辑
1. Prompt(提示)
prompt
是一个模板,可以接受一个包含变量的字典,并生成一个最终的提示信息。这个提示信息会被包装成一个 PromptValue
,作为输入传递给语言模型(LLM
)或者聊天模型(ChatModel
)。对于语言模型来说,它以字符串形式接收输入;而对于聊天模型,它以消息序列的形式接收
prompt_value = prompt.invoke(messages)
prompt_value
ChatPromptValue(messages=[HumanMessage(content='生活不易,我学LangChain.Please translate this sentence from Chinese to English', additional_kwargs={}, response_metadata={})])
prompt_value 转换为 message ,变为了role为用户输入的HumanMessage
prompt_value.to_messages()
[HumanMessage(content='生活不易,我学LangChain.Please translate this sentence from Chinese to English', additional_kwargs={}, response_metadata={})]
2. model(模型)
然后将 PromptValue
传递给 model
。在这种情况下,我们的 model
是一个 ChatModel
,这意味着它将输出一个 BaseMessage
message = model.invoke(prompt_value)
message
AIMessage(content='"Life is not easy; I am learning LangChain."')
这里我们只关注于AIMessage中的content内容(其余信息为模型调用的细节)
3. Output_parser(输出解析器)
我们将 model
的输出传递给 output_parser
,它是一个 BaseOutputParser
,它可以接受字符串或 BaseMessage
作为输入。StrOutputParser
简单地将任何输入转换为字符串。
output_parser.invoke(message)
'"Life is not easy; I am learning LangChain."'
这样我们就只获取到想要的结果字符串,略去了其他与结果无关的信息
过程逻辑: