【LangChain】P17 LangChain 之 Chain 深度解析(二):轻松掌握顺序链(Sequential Chains)
想象一下工厂里的流水线:第一道工序完成了零件的初步加工,然后将其传递给第二道工序进行组装,最后再交给第三道工序进行质检。顺序链就是 LLM 应用中的“流水线”,它允许我们将多个独立的“链”(Chains)或者“语言模型调用”(LLM Calls)按照预定的顺序连接起来。顺序链是 LangChain 中组织和编排 LLM 任务的基本构件。通过将简单的调用组合成强大的工作流,我们可以让 AI 完成远超
目录

你好,LangChain 的探索者!
在上一篇博文中,我们阐述了链的作用。那么,在构建大型语言模型(LLM)应用时,更多的需要我们将多个独立的任务串联起来,形成一个自动化的工作流。比如,你可能想先让大模型生成一个产品名称,然后围绕这个名称创作一句广告语,最后再为这句广告语撰写一则社交媒体推文。
在 LangChain 中,实现这种“流水线”式操作的利器,就是我们今天要探讨的主角—— 顺序链(Sequential Chains)。
什么是顺序链?为什么它如此重要?
想象一下工厂里的流水线:第一道工序完成了零件的初步加工,然后将其传递给第二道工序进行组装,最后再交给第三道工序进行质检。顺序链就是 LLM 应用中的“流水线”,它允许我们将多个独立的“链”(Chains)或者“语言模型调用”(LLM Calls)按照预定的顺序连接起来。
核心思想
它的核心思想非常简单:前一个链的输出,自动成为后一个链的输入。
这种机制的重要性在于,它赋予了我们构建复杂、多步骤任务的能力。我们不再局限于单一的问答或文本生成,而是能够设计出能够完成一系列连贯思考和处理的智能应用,让 AI 的能力得到指数级的放大。
顺序链的分类
在 LangChain 中,顺序链主要分为两种类型,以适应不同复杂度的场景:
SimpleSequentialChain:简单顺序链,适用于最直接的“单输入、单输出”流水线。SequentialChain:通用顺序链,功能更强大,支持“多输入、多输出”的复杂工作流。
接下来,让我们通过详细的讲解和代码示例,逐一揭开它们的面纱。
SimpleSequentialChain:最简单的流水线
SimpleSequentialChain 是顺序链家族中最基础、最直接的成员。它的工作模式就像一条笔直的传送带,没有任何分叉。

核心特点
- 单一输入/输出: 每个子链都只有一个输入参数和一个输出结果。
- 自动衔接: 前一个链的输出结果,会被 LangChain 自动作为下一个链的输入,我们无需进行任何手动配置。
- 简洁易用: 代码实现非常简单,适合快速搭建线性任务流程。
代码实战:AI 小说家助手
假设我们要创建一个“小说家助手”,它能分两步完成任务:
- 第一步 (chain_A): 根据一个主题(比如“一个失落的古代文明”),生成一个吸引人的小说标题。
- 第二步 (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)
代码重点解析
我们创建了两个独立的 LLMChain:chain_A 和 chain_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 营销文案大师
让我们升级任务。现在需要一个“营销文案大师”,它能完成三步操作:
- 第一步 (chain_one): 根据产品和特点,生成一句广告语。
- 第二步 (chain_two): 评估这句广告语的优点,并列出三条。
- 第三步 (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_key 和 input_variables 明确指定。 |
| 灵活性 | 低,结构固定。 | 高,可以构建复杂的依赖关系和数据流。 |
| 代码复杂度 | 非常简单,代码量少。 | 相对复杂,需要仔细定义变量名。 |
| 中间结果 | 默认不保留,只返回最终结果。 | 可以通过 output_variables 访问任何环节的输出。 |
我应该选择哪一个?
很明显:
- 当你刚刚起步,或者你的需求非常直接,比如“先总结,再翻译”,那么
SimpleSequentialChain是你的最佳选择。它能让你用最少的代码快速实现想法。 - 当你的任务涉及到多个信息源的整合,比如需要结合“用户评论”和“产品文档”来生成一份“FAQ文档”,或者你想在后续步骤中重用前面步骤的结果时,
SequentialChain是唯一正确的选择。
总结
顺序链是 LangChain 中组织和编排 LLM 任务的基本构件。通过将简单的调用组合成强大的工作流,我们可以让 AI 完成远超单个提示词所能及的复杂任务。
SimpleSequentialChain是快速原型验证的利器,专为线性、简单的任务设计。SequentialChain则是构建生产级、复杂应用的基石,提供了无与伦比的灵活性和控制力。
希望这篇指南能帮助你理解并开始在自己的项目中应用顺序链。现在,就去动手尝试构建属于你自己的第一个 AI 流水线吧!你会发现,这是一个充满无限可能的新世界 @~@
2025.10.09 金融街
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)