LangChain 是一个旨在简化复杂应用开发的库,它通过提供模块化的链(Chain)概念,让开发者能够更容易地构建、调试、维护和扩展语言模型驱动的应用程序。在 LangChain 中,链代表了一组可以组合和串联的功能单元,通过这种组合,用户可以构建出复杂的应用,并且通过模块化提高代码的可读性和可维护性。
什么是链(Chain)?
链是 LangChain 中的一个核心概念,它的作用是将多个步骤或组件链接在一起,形成一个完整的工作流或功能流程。每个链可以视为 LangChain 中的一种基本功能单元。通过将不同的链按照需要组合起来,开发者可以构建出更加复杂且灵活的应用。
简单来说,链是将一系列步骤(例如,调用语言模型、处理输入、格式化输出等)封装到一起,然后通过一个统一的接口进行调用。链的目的是简化应用程序的开发,同时让这些步骤之间的组合更加模块化、可重用和易于调试。
在 LangChain 中,链通常由以下几个组件构成:
- 提示模板(PromptTemplate) :用于格式化输入的提示信息。
- 语言模型(LLM) :执行推理任务的模型。
- 输出解析器(Output Parser) :用于解析和处理模型返回的结果。
语言模型链(LLMChain)
LLMChain 是 LangChain 中最基本的一种链类型,它通过将提示模板、语言模型和输出解析器组合在一起,封装了一个完整的输入-输出过程。LLMChain 的作用是接收输入、格式化该输入、将其传递给语言模型进行推理,然后返回结果。通过 LLMChain,开发者可以更简洁地处理提示、模型和输出解析的工作。
LLMChain 的基本使用
让我们看一个简单的例子,演示如何使用 LLMChain:
# 先要设置OpenAI API密钥
import os
# 导入所需的库
from langchain import PromptTemplate, LLMChain
from langchain_openai import ChatOpenAI
# 原始字符串模板
template = "{flower}的花语是?"
# 创建模型实例
llm = ChatOpenAI(temperature=0, model=os.environ.get("LLM_MODELEND"))
# 创建LLMChain
llm_chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template(template))
# 调用LLMChain,返回结果
result = llm_chain("玫瑰")
print(result)
在这个示例中,我们通过 LLMChain 封装了一个简单的工作流,接收花名(例如“玫瑰”)作为输入,然后返回花语。这就是一个最基础的链的使用。
链的调用方式
LangChain 提供了多种方式来调用链。我们可以通过以下几种方式来执行链:
- 直接调用:直接调用链对象,实际上是调用链内部的
__call__方法。 run方法:与直接调用类似,run方法也是通过调用链的__call__方法来执行任务。predict方法:与run方法类似,但predict方法的输入是以关键字参数传入,而不是字典形式。apply方法:允许你一次性处理多个输入,适用于批量处理场景。generate方法:类似于apply,但是返回的是一个包含更多信息的LLMResult对象,而不仅仅是字符串。
例如,我们可以通过 run 方法来调用链:
# 初始化链
llm_chain = LLMChain(llm=llm, prompt=prompt)
# run方法
response = llm_chain.run({"flower": "玫瑰", "season": "夏季"})
print(response)
或者通过 predict 方法:
# predict方法
result = llm_chain.predict(flower="玫瑰", season="夏季")
print(result)
处理多个输入
在 LangChain 中,我们还可以通过 apply 方法一次性处理多个输入。这对于需要批量处理的场景非常有用。例如:
# apply方法允许您针对输入列表运行链
input_list = [
{"flower": "玫瑰", "season": "夏季"},
{"flower": "百合", "season": "春季"},
{"flower": "郁金香", "season": "秋季"},
]
result = llm_chain.apply(input_list)
print(result)
通过 generate 方法,我们可以获取更详细的模型生成信息,例如:
# generate方法
result = llm_chain.generate(input_list)
print(result)
链的部分类型
顺序链(Sequential Chain)
顺序链(SequentialChain)允许将多个链串联在一起,按照顺序执行。这种链的组合方式对于一些需要逐步推理的任务非常有用。
路由链:根据输入选择不同的目标链
在实际应用中,我们可能需要根据输入的内容选择不同的链来处理。例如,如果输入是关于花卉护理的问题,就使用花卉护理相关的链;如果是关于花卉装饰的问题,则使用花卉装饰的链。为此,LangChain 提供了路由链(LLMRouterChain),允许我们根据不同的输入动态选择不同的目标链。
默认链:处理没有匹配路由的输入
有时,输入内容可能不符合任何目标链的要求,或者用户的问题过于模糊,无法确定应该选择哪个目标链。在这种情况下,我们可以使用默认链(ConversationChain)来处理这些不确定的输入。默认链通常用于聊天对话等场景,能够保证应用在面对未知或不明确的输入时,仍然能生成合理的输出。
多提示链:同时处理多个提示
多提示链(MultiPromptChain)是一种允许同时处理多个提示并根据不同的提示执行不同操作的链。在复杂的应用中,可能需要根据输入生成多个不同的输出,这时可以使用多提示链来处理多个提示,并将结果结合在一起。
总结
LangChain 中的链(Chain)是实现复杂应用的重要工具。通过将不同的功能模块封装为链,并且通过顺序链或并行链将多个链连接起来,开发者可以更方便地构建各种复杂的应用程序。