如果我们想开发更复杂的应用程序,那么就需要通过 “Chain” 来链接LangChain的各个组件和功能——模型之间彼此链接,或模型与其他组件链接。“Chain”简化了复杂应用程序的实现,并使之更加模块化,能够创建出单一的、连贯的应用程序,从而使调试、维护和改进应用程序变得容易。
关于链的实现和使用
- 首先LangChain通过设计好的接口,实现一个具体的链的功能。例如,LLM链(LLMChain)能够接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化的响应传递给 LLM。这就相当于把整个Model I/O的流程封装到链里面。
- 实现了链的具体功能之后,我们可以通过将多个链组合在一起,或者将链与其他组件组合来构建更复杂的链。
链在内部把一系列的功能进行封装,而链的外部则又可以组合串联。链其实可以被视为LangChain中的一种基本功能单元。
最简单的链——LLMChain
LLMChain围绕着语言模型推理功能又添加了一些功能,整合了PromptTemplate、语言模型(LLM或聊天模型)和 Output Parser,相当于把Model I/O放在一个链中整体操作。它使用提示模板格式化输入,将格式化的字符串传递给 LLM,并返回 LLM 输出。
Eg:花语
若不使用链,代码:
#----第一步 创建提示
from langchain import PromptTemplate
template = "{flower}的花语是?"
prompt_temp = PromptTemplate.from_template(template)
prompt = prompt_temp.format(flower='玫瑰')
print(prompt)
#----第二步 创建并调用模型
from langchain import OpenAI
model = OpenAI(temperature=0)
result = model(prompt)
print(result)
输出:
玫瑰的花语是?
爱情、浪漫、美丽、永恒、誓言、坚贞不渝。
若使用链,代码:
from langchain import PromptTemplate, OpenAI, LLMChain
template = "{flower}的花语是?"
llm = OpenAI(temperature=0)
llm_chain = LLMChain(
llm=llm,
prompt=PromptTemplate.from_template(template))
result = llm_chain("玫瑰")
print(result)
输出:
{'flower': '玫瑰', 'text': '\n\n爱情、浪漫、美丽、永恒、誓言、坚贞不渝。'}
可见,代码结构更加简洁。
链的调用方式
- 直接调用
当我们像函数一样调用一个对象时,它实际上会调用该对象内部实现的__call__方法。
如果我们示模板中包含多个变量,在调用链的时候,可以使用字典一次性输入它们。
- 通过run方法
通过run方法,也等价于直接调用_call_函数。
- 通过predict方法
predict方法类似于run,只是输入键被指定为关键字参数而不是 Python 字典。
- 通过apply方法
apply方法允许我们针对输入列表运行链,一次处理多个输入。
- 通过generate方法
generate方法类似于apply,只不过它返回一个LLMResult对象,而不是字符串。LLMResult通常包含模型生成文本过程中的一些相关信息,例如令牌数量、模型名称等。