🌟 LangChain 30 天保姆级教程 · Day 8|Chains 进阶!用 SequentialChain 串联多个 AI 步骤,打造自动化工作流

2 阅读4分钟

系列目标:30 天从 LangChain 入门到企业级部署
今日任务:理解 Chain 组合的价值 → 掌握 SequentialChain → 构建“关键词提取 → 文案生成 → 情感分析”三步 AI 流水线!


🔗 一、为什么需要组合多个 Chain?

单一 Chain 只能完成一个任务,比如:

  • 翻译一段文字
  • 提取用户信息
  • 生成产品描述

但真实场景往往是多步骤的

用户输入:“这款降噪耳机音质太差了!”
我们希望 AI 自动完成: 1️⃣ 提取产品名 → “降噪耳机”
2️⃣ 生成客服回复 → “很抱歉给您带来不好体验…”
3️⃣ 判断情绪 → “negative”

SequentialChain 就是 LangChain 提供的“AI 工作流编排器” —— 它按顺序执行多个 Chain,前一个的输出作为后一个的输入,像流水线一样处理任务。

✅ 今天,我们就来搭建一条全自动的“用户反馈处理流水线”!


🧱 二、SequentialChain 核心概念

参数说明
chains要执行的 Chain 列表(按顺序)
input_variables整个工作流的初始输入字段
output_variables最终要返回的字段(可选)
verbose是否打印每一步过程(调试用)

💡 每个子 Chain 必须有明确的输入/输出变量名,且前后衔接。


🛠️ 三、实战:构建“用户反馈处理流水线”

我们将实现以下三步流程:

输入: "这个手机电池续航太短了!"
  ↓
[Step 1] 提取产品关键词 → "手机"
  ↓
[Step 2] 生成客服回复 → "感谢反馈,我们会优化电池..."
  ↓
[Step 3] 分析情绪 → "negative"
  ↓
输出: {product, reply, sentiment}

步骤 1:准备 LLM 和工具函数

# day8_sequential_chain.py
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import LLMChain, SequentialChain

# 初始化本地模型
llm = ChatOllama(model="qwen:7b", temperature=0)

步骤 2:定义 Step 1 —— 提取产品关键词

# Chain 1: 提取产品
product_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个产品识别助手。"),
    ("human", "请从以下用户反馈中提取出具体的产品名称(不要品牌):{feedback}")
])
product_chain = LLMChain(
    llm=llm,
    prompt=product_prompt,
    output_key="product"  # 关键:指定输出变量名
)

步骤 3:定义 Step 2 —— 生成客服回复

# Chain 2: 生成客服回复(依赖 product)
reply_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的电商客服。"),
    ("human", "用户对【{product}】有负面反馈,请写一段礼貌的回复:{feedback}")
])
reply_chain = LLMChain(
    llm=llm,
    prompt=reply_prompt,
    output_key="reply"
)

步骤 4:定义 Step 3 —— 情绪分析

# Chain 3: 情绪分析
sentiment_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个情绪分析器,只返回 'positive' 或 'negative'。"),
    ("human", "{feedback}")
])
sentiment_chain = LLMChain(
    llm=llm,
    prompt=sentiment_prompt,
    output_key="sentiment"
)

步骤 5:组装 SequentialChain

# 组装流水线
overall_chain = SequentialChain(
    chains=[product_chain, reply_chain, sentiment_chain],
    input_variables=["feedback"],          # 初始输入
    output_variables=["product", "reply", "sentiment"],  # 最终输出
    verbose=True  # 查看每一步执行过程
)

# 调用
result = overall_chain.invoke({
    "feedback": "这个蓝牙音箱音质太差了,完全不值这个价!"
})

print("\n✅ 最终结果:")
print(f"产品:{result['product']}")
print(f"客服回复:{result['reply']}")
print(f"情绪:{result['sentiment']}")

▶️ 输出示例(verbose 模式):

> Entering new SequentialChain chain...
... [Step 1] product: 蓝牙音箱
... [Step 2] reply: 非常抱歉给您带来不佳体验...
... [Step 3] sentiment: negative

✅ 最终结果:
产品:蓝牙音箱
客服回复:非常抱歉给您带来不佳体验,我们会将您的反馈转达给产品团队...
情绪:negative

✅ 三步自动完成,无需人工干预!


🔁 四、关键设计原则

1. 变量命名要清晰

  • 每个 Chain 的 output_key 必须与下一个 Chain 的 prompt 中的 {xxx} 一致
  • 避免命名冲突(如都叫 output

2. 输入/输出要显式声明

  • input_variables:整个工作流的入口
  • output_variables:最终要保留的字段(可过滤中间结果)

3. 调试靠 verbose=True

  • 开发阶段务必开启,观察每一步是否符合预期

🔄 五、替代方案:LCEL 链式表达式(更现代)

虽然 SequentialChain 直观,但 LangChain 更推荐 LCEL(LangChain Expression Language)

from langchain_core.runnables import RunnablePassthrough

# 用 LCEL 实现类似逻辑(需配合字典操作,稍复杂)
# 对于多分支/条件逻辑,LCEL 更灵活;但对于线性流程,SequentialChain 更易读

📌 建议

  • 简单线性流程 → 用 SequentialChain(清晰易懂)
  • 复杂 DAG/条件分支 → 用 LCEL(Day 25 讲 LangGraph)

⚠️ 六、注意事项

问题建议
某一步失败导致整体中断后续可加 try-except 或重试机制(Day 15 讲 Callback)
中文模型理解“产品名”模糊在 prompt 中举例:“如‘耳机’、‘手机’、‘充电宝’”
想要并行执行?SequentialChain 是串行的,并行需用 RunnableParallel(进阶)
输出字段太多?通过 output_variables 精简返回内容

📦 七、配套代码结构

langchain-30-days/
└── day8/
    └── feedback_processing_pipeline.py  # 三步用户反馈处理流水线

📝 八、今日小结

  • ✅ 理解了多步骤 AI 工作流的价值
  • ✅ 学会了 SequentialChain 基础用法
  • ✅ 实现了“提取 → 生成 → 分析”三步流水线
  • ✅ 掌握了 Chain 之间的变量传递机制
  • ✅ 知道了何时用 SequentialChain vs LCEL