LangChain 中的链 | 豆包MarsCode AI刷题

152 阅读5分钟

LangChain 是一个旨在简化复杂应用开发的库,它通过提供模块化的链(Chain)概念,让开发者能够更容易地构建、调试、维护和扩展语言模型驱动的应用程序。在 LangChain 中,链代表了一组可以组合和串联的功能单元,通过这种组合,用户可以构建出复杂的应用,并且通过模块化提高代码的可读性和可维护性。

什么是链(Chain)?

链是 LangChain 中的一个核心概念,它的作用是将多个步骤或组件链接在一起,形成一个完整的工作流或功能流程。每个链可以视为 LangChain 中的一种基本功能单元。通过将不同的链按照需要组合起来,开发者可以构建出更加复杂且灵活的应用。

简单来说,链是将一系列步骤(例如,调用语言模型、处理输入、格式化输出等)封装到一起,然后通过一个统一的接口进行调用。链的目的是简化应用程序的开发,同时让这些步骤之间的组合更加模块化、可重用和易于调试。

在 LangChain 中,链通常由以下几个组件构成:

  1. 提示模板(PromptTemplate) :用于格式化输入的提示信息。
  2. 语言模型(LLM) :执行推理任务的模型。
  3. 输出解析器(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 提供了多种方式来调用链。我们可以通过以下几种方式来执行链:

  1. 直接调用:直接调用链对象,实际上是调用链内部的 __call__ 方法。
  2. run 方法:与直接调用类似,run 方法也是通过调用链的 __call__ 方法来执行任务。
  3. predict 方法:与 run 方法类似,但 predict 方法的输入是以关键字参数传入,而不是字典形式。
  4. apply 方法:允许你一次性处理多个输入,适用于批量处理场景。
  5. 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)是实现复杂应用的重要工具。通过将不同的功能模块封装为链,并且通过顺序链或并行链将多个链连接起来,开发者可以更方便地构建各种复杂的应用程序。