LangChain 学习笔记 · Day 3-4 多步骤任务编排

系统学习 LangChain 中的顺序链(LCEL 管道写法),并通过新闻摘要与翻译-总结任务演示多步骤任务编排,同时了解 LLMChain 与 SequentialChain 的旧语法对比。
18 分钟阅读
LangChainPythonLLMChainLCELSequentialChain任务编排新闻摘要翻译

🎯 学习目标

  1. 理解 LLMChain / SequentialChain 的原理
  2. 掌握 LCEL (LangChain Expression Language) 的流水线写法
  3. 通过案例:
    • 新闻摘要生成器(要点 → 摘要 → 标题)
    • 翻译 → 摘要 任务编排

🔹 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. 今日练习

  1. 运行新闻摘要器,尝试不同新闻文本。
  2. 运行翻译→摘要流水线,测试长英文文章。
  3. 给摘要步骤增加“风格参数”(学术/新闻/轻松),体会 PromptTemplate 灵活性。
  4. 挑战:改写为 三步链:英文 → 中文翻译 → 中文摘要 → 中文标题。