系列目标: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