Chains(任务)
提示:新版的LangChain框架,推荐使用LCEL表达式自定义Chain,请参考前面LCEL章节。
仅使用LLM接口处理简单的应用程序还行,但复杂的应用场景需要将LLM组件、提示词模板、向量存储等多个LangChain组件串联(chain)起来一起使用。
LangChain为这样的“链式”应用程序提供了Chain接口,可以把Chain理解为LangChain为不同的应用场景设计的任务封装,例如LLMChain(基础任务)、RetrievalQA(问答链)等。
下面是Chain基本接口的定义:
class Chain(BaseModel, ABC):
"""基础接口定义,所有任务Chain都会实现这些接口"""
memory: BaseMemory
callbacks: Callbacks
def __call__(
self,
inputs: Any,
return_only_outputs: bool = False,
callbacks: Callbacks = None,
) -> Dict[str, Any]:
...
将组件链式组合的这个想法虽然简单,但非常强大。它大大简化了复杂应用程序的实现,并使其更加模块化,从而使调试、维护和改进应用程序变得更加容易。
为什么需要Chain(任务)?
Chain任务允许我们将多个LangChain组件组合在一起,创建一个单一、连贯的应用程序。例如,我们可以创建一个链条,接受用户输入,使用 PromptTemplate 进行格式化,然后将格式化后的响应传递给 LLM。我们可以通过将多个链条组合在一起或将链条与其他组件组合来构建更复杂的链条。
- 提示:说白了就是针对常用的应用场景封装一下AI任务,让我们少写点代码,也提供了一个任务框架,方便扩展和调试。
Chain入门例子
使用 LLMChain
任务
LLMChain
是LangChain最基本的Chain实现。它的封装的AI任务流程是:使用用户输入参数格式化提示词模板,然后把提示词传给大语言模型(LLM),然后从LLM获取响应。
要使用LLMChain
,首先创建提示模板。
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# 使用openai的llm模型
llm = OpenAI(temperature=0.9)
# 定义提示词模板
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
现在我们可以创建一个非常简单的链(任务),它将接受用户输入,格式化提示词,然后将其发送到LLM。
from langchain.chains import LLMChain
# 定义任务链,这个任务设置了使用openai模型,设置了前面定义的提示词模板
chain = LLMChain(llm=llm, prompt=prompt)
# 执行任务,这里传入了一个字符串参数,这个参数会传给提示词模板,格式化提示词后,传给LLM提问
print(chain.run("colorful socks"))
# 返回结果
Colorful Toes Co.
前面的任务链(Chain)接收的是一个参数,实际上,任务传入多少参数跟提示词模板的参数有关,下面是传入多个参数的例子
# 定义提示词模板,模板接收2个参数
prompt = PromptTemplate(
input_variables=["company", "product"],
template="What is a good name for {company} that makes {product}?",
)
# 定义任务链
chain = LLMChain(llm=llm, prompt=prompt)
# 以字典的方式传入2个参数,执行任务
print(chain.run({
'company': "ABC Startup",
'product': "colorful socks"
})
# 返回结果
Socktopia Colourful Creations.
你也可以在LLMChain中使用聊天模型:
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
)
# 定义人类消息模板,内嵌了一个模板参数product
human_message_prompt = HumanMessagePromptTemplate(
prompt=PromptTemplate(
template="What is a good name for a company that makes {product}?",
input_variables=["product"],
)
)
# 根据前面定义的人类消息,构建一个聊天消息模板
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
# 使用openai的chat模型(聊天模型,就是类似微信聊天一样的交互模式)
chat = ChatOpenAI(temperature=0.9)
# 定义LLMChain任务,使用聊天模型,并设置提示词模板
chain = LLMChain(llm=chat, prompt=chat_prompt_template)
# 传入参数,执行任务
print(chain.run("colorful socks"))
# 返回结果
Rainbow Socks Co.
通过前面两个Chain例子,大家也看到了通过Chain封装的任务,很方便处理跟大模型的交互逻辑,而且也很方便替换LLM模型、提示词模板等,实际业务场景,如果我们更换模型和提示词模板,只要调整下Chain的参数就行,减少对业务代码的影响。