在这里插入图片描述

你好,LangChain 的探索者!

在上一篇博文中,我们阐述了链的作用。那么,在构建大型语言模型(LLM)应用时,更多的需要我们将多个独立的任务串联起来,形成一个自动化的工作流。比如,你可能想先让大模型生成一个产品名称,然后围绕这个名称创作一句广告语,最后再为这句广告语撰写一则社交媒体推文。

在 LangChain 中,实现这种“流水线”式操作的利器,就是我们今天要探讨的主角—— 顺序链(Sequential Chains)


什么是顺序链?为什么它如此重要?

想象一下工厂里的流水线:第一道工序完成了零件的初步加工,然后将其传递给第二道工序进行组装,最后再交给第三道工序进行质检。顺序链就是 LLM 应用中的“流水线”,它允许我们将多个独立的“链”(Chains)或者“语言模型调用”(LLM Calls)按照预定的顺序连接起来。

核心思想

它的核心思想非常简单:前一个链的输出,自动成为后一个链的输入。

这种机制的重要性在于,它赋予了我们构建复杂、多步骤任务的能力。我们不再局限于单一的问答或文本生成,而是能够设计出能够完成一系列连贯思考和处理的智能应用,让 AI 的能力得到指数级的放大。

顺序链的分类

在 LangChain 中,顺序链主要分为两种类型,以适应不同复杂度的场景:

  • SimpleSequentialChain:简单顺序链,适用于最直接的“单输入、单输出”流水线。
  • SequentialChain:通用顺序链,功能更强大,支持“多输入、多输出”的复杂工作流。

接下来,让我们通过详细的讲解和代码示例,逐一揭开它们的面纱。


SimpleSequentialChain:最简单的流水线

SimpleSequentialChain 是顺序链家族中最基础、最直接的成员。它的工作模式就像一条笔直的传送带,没有任何分叉。

在这里插入图片描述

核心特点

  • 单一输入/输出: 每个子链都只有一个输入参数和一个输出结果。
  • 自动衔接: 前一个链的输出结果,会被 LangChain 自动作为下一个链的输入,我们无需进行任何手动配置。
  • 简洁易用: 代码实现非常简单,适合快速搭建线性任务流程。

代码实战:AI 小说家助手

假设我们要创建一个“小说家助手”,它能分两步完成任务:

  1. 第一步 (chain_A): 根据一个主题(比如“一个失落的古代文明”),生成一个吸引人的小说标题。
  2. 第二步 (chain_B): 根据生成的小说标题,写出小说的开篇第一段。

模型引入部分:

import os
import dotenv
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")

llm = ChatOpenAI(
    model=os.getenv("CHAT_MODEL")
)

chains 部分内容:

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain

# 链 A: 生成小说标题
# 定义模板:接收一个输入变量 {topic}
prompt_template_A = PromptTemplate(
	template="请为关于“{topic}”的小说想一个吸引人的标题。",
    input_variables=["topic"]
)
# 创建 LLMChain
chain_A = LLMChain(llm=llm, prompt=prompt_template_A)

# 链 B: 根据小说标题写开篇
# 定义模板:接收一个输入变量 {title}
prompt_template_B = PromptTemplate(
    template="根据标题“{title}”,为这本小说写一个引人入胜的开篇段落。",
    input_variables=["title"]
)
# 创建 LLMChain
chain_B = LLMChain(llm=llm, prompt=prompt_template_B)

# 创建 SimpleSequentialChain
# 将 chain_A 和 chain_B 按照顺序放入列表中
simple_sequential_chain = SimpleSequentialChain(
    chains=[chain_A, chain_B],
    verbose=True  # 设置为 True,可以看到链的执行过程
)

# 运行顺序链,初始输入为一个字典
# 注意:这里的 key 必须是第一个链 (chain_A) 的输入变量名,即 "topic"
initial_input = "一个在深海中发现的失落古代文明"
final_result = simple_sequential_chain.invoke(initial_input)

# 打印最终结果
print("\n--- 最终结果 ---")
print(final_result)

代码重点解析

我们创建了两个独立的 LLMChainchain_Achain_B

  • chain_A 的输入变量是 topic,它会输出一个标题。
  • chain_B 的输入变量是 title

当我们将它们放入 SimpleSequentialChain 后,LangChain 会自动将 chain_A 的输出(那个标题字符串)传递给 chain_B 作为输入。

simple_sequential_chain.invoke() 的输入面向的是整个流水线的第一个环节所需要的输入。

为什么 SimpleSequentialChain 的中间衔接如此“智能”?

细心的你可能会问:chain_A 的输出key是什么?chain_B 的输入key(title)又是怎么接收到值的?

在 LLMChain 中,默认的输出键(output key)是 text。而在 SimpleSequentialChain 内部,它做了一个聪明的简化:它会忽略前一个链的输出键和后一个链的输入键的名称,直接将输出值本身作为输入值传递过去。 这就是为什么它被称为“简单”顺序链——它为你处理了所有中间变量的映射,前提是你的每个环节都只有一个输入和一个输出。


SequentialChain:更强大、更灵活的流水线

当我们的工作流变得复杂时,SimpleSequentialChain 的局限性就显现出来了。如果某个环节需要多个输入,或者我想保留并使用中间环节的输出结果,该怎么办?这时,SequentialChain 就闪亮登场了。

在这里插入图片描述

核心特点

  • 多变量支持: 允许链中的任何一个环节接收多个输入变量,并产生多个输出变量。
  • 灵活映射: 你需要显式地定义变量如何从一个链传递到下一个链。通过精准地命名 输入关键字(input_variables输出关键字(output_variables,来清晰地定义链之间的依赖关系。
  • 复杂流程控制: 能够构建更复杂的、非线性的数据流,并能访问流水线中任何一步的输出。

代码实战:AI 营销文案大师

让我们升级任务。现在需要一个“营销文案大师”,它能完成三步操作:

  1. 第一步 (chain_one): 根据产品和特点,生成一句广告语。
  2. 第二步 (chain_two): 评估这句广告语的优点,并列出三条。
  3. 第三步 (chain_three): 结合产品、广告语和优点,撰写一则完整的社交媒体推广文案。

这个流程中,第三步明显需要用到第一步和第二步的输出,是典型的多输入场景。

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain

# 链 1: 生成广告语
prompt_one = PromptTemplate(
    template="为 {product}(特点:{features})创作一句吸引人的广告语。",
    input_variables=["product", "features"]
)
chain_one = LLMChain(llm=llm, prompt=prompt_one, output_key="ad_slogan") # 明确指定输出变量名

# 链 2: 评估广告语优点
prompt_two = PromptTemplate(
    input_variables=["ad_slogan"],
    template="分析广告语 “{ad_slogan}” 的三个主要优点。"
)
chain_two = LLMChain(llm=llm, prompt=prompt_two, output_key="advantages") # 明确指定输出变量名

# 链 3: 撰写社交媒体文案
prompt_three = PromptTemplate(
    input_variables=["product", "ad_slogan", "advantages"],
    template="产品:{product}\n广告语:{ad_slogan}\n优点分析:\n{advantages}\n\n根据以上信息,为该产品写一则不超过100字的社交媒体推广文案。"
)
chain_three = LLMChain(llm=llm, prompt=prompt_three, output_key="social_media_post") # 最终输出

# 创建 SequentialChain
# 需要定义整个链的输入变量和输出变量
overall_chain = SequentialChain(
    chains=[chain_one, chain_two, chain_three],
    input_variables=["product", "features"],  # 整个流水线的初始输入
    output_variables=["ad_slogan", "advantages", "social_media_post"], # 希望从流水线返回的所有输出
    verbose=True
)

# 运行链
initial_data = {
    "product": "AI智能咖啡机",
    "features": "自动调节研磨粗细、App远程控制、记忆用户口味"
}
result = overall_chain.invoke(initial_data)

# 打印结果
# result 是一个包含所有 output_variables 的字典
print("\n--- 最终结果 ---")
import json
print(json.dumps(result, indent=2, ensure_ascii=False))

代码解释与重点

  • output_key: 在创建每个 LLMChain 时,我们通过 output_key 参数明确指定了该链输出结果的“名字”。例如, chain_one 的输出被命名为 ad_slogan。这是 SequentialChain 实现变量映射的关键。
  • input_variables:SequentialChain 中,input_variables 定义了整个流水线启动时需要哪些初始输入。
  • output_variables: 这个参数非常重要,它定义了当整个流水线执行完毕后,我们希望得到哪些变量。你可以只关心最终结果(如 ["social_media_post"]),也可以像示例中一样,获取所有中间过程的产出。
  • 变量的传递: SequentialChain 内部维护着一个“记忆”或“状态”字典。chain_one 运行后,{'ad_slogan': '...'} 被添加到这个字典中。chain_two 运行时,它会从字典中找到自己需要的 ad_slogan 作为输入。同理,chain_three 会找到它所需要的所有输入变量。

对比 SimpleSequentialChain 与 SequentialChain

为了让你更清晰地理解两者的区别,这里有一个简单的对比表格:

特性 SimpleSequentialChain SequentialChain
使用场景 简单的、线性的单输入/单输出任务流。 复杂的、需要多输入或保留中间结果的任务流。
输入/输出 每个链严格限制为单个输入和单个输出。 支持任意数量的输入和输出。
变量映射 自动处理,无需配置。 必须手动通过 output_keyinput_variables 明确指定。
灵活性 低,结构固定。 高,可以构建复杂的依赖关系和数据流。
代码复杂度 非常简单,代码量少。 相对复杂,需要仔细定义变量名。
中间结果 默认不保留,只返回最终结果。 可以通过 output_variables 访问任何环节的输出。

我应该选择哪一个?

很明显:

  • 当你刚刚起步,或者你的需求非常直接,比如“先总结,再翻译”,那么 SimpleSequentialChain 是你的最佳选择。它能让你用最少的代码快速实现想法。
  • 当你的任务涉及到多个信息源的整合,比如需要结合“用户评论”和“产品文档”来生成一份“FAQ文档”,或者你想在后续步骤中重用前面步骤的结果时,SequentialChain 是唯一正确的选择。

总结

顺序链是 LangChain 中组织和编排 LLM 任务的基本构件。通过将简单的调用组合成强大的工作流,我们可以让 AI 完成远超单个提示词所能及的复杂任务。

  • SimpleSequentialChain 是快速原型验证的利器,专为线性、简单的任务设计。
  • SequentialChain 则是构建生产级、复杂应用的基石,提供了无与伦比的灵活性和控制力。

希望这篇指南能帮助你理解并开始在自己的项目中应用顺序链。现在,就去动手尝试构建属于你自己的第一个 AI 流水线吧!你会发现,这是一个充满无限可能的新世界 @~@


2025.10.09 金融街

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐