LangChain 学习笔记 · Day 3-4 多步骤任务编排
系统学习 LangChain 中的顺序链(LCEL 管道写法),并通过新闻摘要与翻译-总结任务演示多步骤任务编排,同时了解 LLMChain 与 SequentialChain 的旧语法对比。
18 分钟阅读
LangChainPythonLLMChainLCELSequentialChain任务编排新闻摘要翻译
🎯 学习目标
- 理解 LLMChain / SequentialChain 的原理
- 掌握 LCEL (LangChain Expression Language) 的流水线写法
- 通过案例:
- 新闻摘要生成器(要点 → 摘要 → 标题)
- 翻译 → 摘要 任务编排
🔹 1. Chain 的基本原理
在 LangChain 中,一个 Chain(链) = Prompt + LLM +(可选的输出解析器)。
- Prompt:告诉模型做什么(模板化,支持变量)。
- LLM:调用大语言模型(OpenAI / Kimi / DeepSeek …)。
- Parser:把输出转为字符串、JSON 或结构化数据。
👉 本质就是:
输入变量 → PromptTemplate → LLM 调用 → 输出结果
🔹 2. LCEL(推荐写法)
LangChain Expression Language 提供了声明式、管道式写法:
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"topic": "LangChain 是什么?"})
优势:
- 更简洁(像 Unix 管道
|一样) - 更灵活(可组合成复杂工作流)
- 更现代(官方推荐,未来主流)
🔹 3. 案例一:新闻摘要生成器
LCEL 实现
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="kimi-k2-0711-preview", temperature=0.3)
# Step1: 提取要点
prompt_points = ChatPromptTemplate.from_messages([
("system", "你是新闻编辑,请提取3~5个关键信息点。"),
("user", "新闻全文:{article}")
])
points_chain = prompt_points | llm | StrOutputParser()
# Step2: 生成摘要
prompt_summary = ChatPromptTemplate.from_messages([
("system", "你是新闻编辑,请写100~150字中文摘要。"),
("user", "要点如下:\n{points}")
])
summary_chain = prompt_summary | llm | StrOutputParser()
# Step3: 生成标题
prompt_title = ChatPromptTemplate.from_messages([
("system", "请生成20字以内的中文新闻标题。"),
("user", "摘要如下:\n{summary}")
])
title_chain = prompt_title | llm | StrOutputParser()
def summarize_article(article: str):
points = points_chain.invoke({"article": article})
summary = summary_chain.invoke({"points": points})
title = title_chain.invoke({"summary": summary})
return {"points": points, "summary": summary, "title": title}
🔹 4. 案例二:翻译 → 摘要任务编排
SequentialChain 写法(旧语法)
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
llm = ChatOpenAI(model="kimi-k2-0711-preview", temperature=0.3)
# Step1: 翻译
tpl_translate = PromptTemplate(
input_variables=["article_en"],
template="请将以下英文文章翻译成中文:\n{article_en}"
)
translate_chain = LLMChain(llm=llm, prompt=tpl_translate, output_key="article_zh")
# Step2: 摘要
tpl_summary = PromptTemplate(
input_variables=["article_zh"],
template="请为以下中文文章写一段100字以内的摘要:\n{article_zh}"
)
summary_chain = LLMChain(llm=llm, prompt=tpl_summary, output_key="summary")
# 顺序链
overall_chain = SequentialChain(
chains=[translate_chain, summary_chain],
input_variables=["article_en"],
output_variables=["article_zh", "summary"],
verbose=True
)
LCEL 等效写法(推荐)
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="kimi-k2-0711-preview", temperature=0.3)
# Step1: 翻译
prompt_translate = ChatPromptTemplate.from_messages([
("system", "请把英文翻译成流畅中文。"),
("user", "{article_en}")
])
translate_chain = prompt_translate | llm | StrOutputParser()
# Step2: 摘要
prompt_summary = ChatPromptTemplate.from_messages([
("system", "请总结为100字以内中文摘要。"),
("user", "{article_zh}")
])
summary_chain = prompt_summary | llm | StrOutputParser()
def pipeline(article_en: str):
article_zh = translate_chain.invoke({"article_en": article_en})
summary = summary_chain.invoke({"article_zh": article_zh})
return {"article_zh": article_zh, "summary": summary}
🔹 5. Day3 vs Day4 对比
- Day 3:手动顺序执行 LCEL 链(新闻摘要器)
- Day 4:学习 LangChain 提供的顺序链工具(SequentialChain),并用 LCEL 重写
- 结论:在 0.3.27 版本里完全可以用 LCEL 来写顺序链,SequentialChain 仅需了解
🔹 6. 今日练习
- 运行新闻摘要器,尝试不同新闻文本。
- 运行翻译→摘要流水线,测试长英文文章。
- 给摘要步骤增加“风格参数”(学术/新闻/轻松),体会 PromptTemplate 灵活性。
- 挑战:改写为 三步链:英文 → 中文翻译 → 中文摘要 → 中文标题。