🔗 LangChain 实战(中):Chains + Memory,解锁大模型应用的高阶能力
一、本章概览
第10章《大模型应用开发框架 LangChain(中)》是 LangChain 核心进阶篇,聚焦两大核心模块——Chains(链) 和 Memory(记忆),让你从"单次调用大模型"升级到"编排复杂业务流水线"。
核心内容:
-
Chains:大模型应用的最佳实践 -
LLMChain:上手你的第一个链(公司取名实战) -
SequentialChain:串联式调用链(戏剧简介 + 评论实战) -
SimpleSequentialChain vs SequentialChain -
TransformChain:处理超长文本的转换链 -
RouterChain:实现条件判断的路由链 -
Memory System:赋予应用记忆能力 -
三大记忆类型详解 -
可选作业:文本摘要 + 翻译聊天助手
二、Chains:大模型应用的最佳实践
乐高式创新思维
LangChain 的核心设计理念是乐高式创新——将语言模型、提示模板、输出解析器等组件像乐高积木一样模块化组合,通过 Chains(链) 串联起来,构建复杂的大模型应用。
大模型抽象回顾:Model I/O
Format(格式化)→ Predict(预测)→ Parse(解析)
X = "foo", y = "bar"
↓
Prompt Template → "Does {x} like {y}, and why?"
↓
LLM / Chat Model → {"likes": True, "reason": "Because ..."}
↓
Output Parser → "Foo does..."
LangChain 高层结构
Chains 是连接所有组件的"最终链条",可应用于:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
三、LLMChain:第一个链
LLMChain 是整合语言模型和提示模板的最简单链,也是上手 LangChain 的起点。
工作流程
Input(prompts)
↓
Prompt Template 格式化
↓
LLM / Chat Model 预测
↓
Output(contents)
↓
Output Parser 解析
实战:公司取名
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = OpenAI(temperature=..., max_tokens=...)
prompt = PromptTemplate(
input_variables=["product"],
template="给制造{product}的有限公司取10个好名字,并给出完整的公司名称"
)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run({'product': '性能卓越的GPU'}))
输出示例(10个公司名称):
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
四、SimpleSequentialChain:单输入/输出串联
SimpleSequentialChain 是最简单形式的顺序链,每个步骤具有单一输入/输出,上一个步骤的输出自动成为下一个步骤的输入。
Input → LLMChain A → LLMChain B → Output
实战:戏剧简介 → 戏剧评论
Step 1 — synopsis_chain:根据剧目标题撰写简介
|
|
|
|---|---|
|
|
你是一位剧作家。根据戏剧的标题,你的任务是为该标题写一个简介。标题:{title} |
|
|
title = "三体人不是无法战胜的" |
|
|
|
Step 2 — review_chain:撰写戏剧评论
|
|
|
|---|---|
|
|
你是《纽约时报》的戏剧评论家。根据剧情简介,你的工作是为该剧撰写一篇评论。剧情简介:{synopsis} |
|
|
|
|
|
|
代码实现:
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(
chains=[synopsis_chain, review_chain],
verbose=True
)
review = overall_chain.run("三体人不是无法战胜的")
五、SequentialChain:多输入/输出串联
SequentialChain 是更通用形式的顺序链,允许多个输入和多个输出,适合复杂业务场景。
Input 1 ──→ LLMChain A ──→ Output A
Input 2 ──→ LLMChain B ──→ Output B
实战:带时代背景的戏剧简介 + 评论
from langchain.chains import SequentialChain
overall_chain = SequentialChain(
chains=[synopsis_chain, review_chain],
input_variables=["era", "title"],
output_variables=["synopsis", "review"],
verbose=True
)
overall_chain({
"title": "三体人不是无法战胜的",
"era": "二十一世纪的新中国"
})
运行结果:
{
"title": "三体人不是无法战胜的",
"era": "二十一世纪的新中国",
"synopsis": "讲述了一个普通家庭中的三体人,受到传统的社会和政治压力,面对社会歧视与偏见以及政治压迫和控制,却不断坚持自己的价值观和信念",
"review": "一部非常有趣且有意义的戏剧,展示了社会歧视和偏见,以及政治压迫等内容"
}
★💡 SimpleSequentialChain vs SequentialChain
对比维度 SimpleSequentialChain SequentialChain 输入/输出 单一输入/输出 多输入/多输出 传递方式 自动传递 显式指定 input_variables / output_variables 适用场景 简单流水线 复杂业务逻辑
六、TransformChain:处理超长文本的转换链
TransformChain 用于处理超长文本,在调用 LLM 之前进行预处理/转换。
架构图
SequentialChain
├── D0C 1
├── TransformChain(预处理/截断/提取关键部分)
├── LLMChain(摘要生成)
└── Summary → D0C 2
典型场景:当文档内容超过 LLM 的 Token 限制时,先用 TransformChain 进行文本截断、关键信息提取或分段处理,再交由 LLMChain 处理。
七、RouterChain:实现条件判断的路由链
RouterChain 根据输入条件,由路由链判断选择不同的下游 LLMChain 执行。
Input 1 ──→ LLMRouterChain ──→ LLMChain A ──→ Output A
Input 2 ──→ LLMRouterChain ──→ LLMChain B ──→ Output B
典型场景:根据用户意图(如"翻译"或"摘要")自动路由到不同的处理链。
八、可选作业:文本摘要 + 翻译聊天助手
结合 Chains 全部能力,构建一个既能做摘要又能做翻译的聊天助手:
Input 1 ──→ TransformChain ──→ LLMChain A ──→ Summary
Input 2 ──→ LLMRouterChain ──→ LLMChain B ──→ Translation
九、Memory:赋予应用记忆的能力
为什么需要 Memory?
★没有 Memory 的 LLM 应用,每次对话都是"初次见面"——模型无法记住之前说过什么。Memory 系统让应用具备对话记忆能力,实现真正的多轮交互。
Memory System 与 Chain 的关系
Memory 在 Chain 中承担 READ(读取) 和 WRITE(写入) 两个核心功能:
Chain:
Prompt: "{past_messages} {question}" → Model → Output Parser → {"answer": ...}
↑ ↓
Memory: READ ←────────────────── WRITE
工作流程:
-
WRITE:模型生成答案后,Memory 将新的对话历史写入存储 -
READ:用户发起新问题时,Memory 读取历史消息 {past_messages}注入到 Prompt 中 -
模型在上下文中"看到"历史对话,实现连贯的多轮交互
记忆基类
LangChain 提供了 BaseMemory 和 BaseChatMessageMemory 作为记忆系统的基类,支持高度定制化——你可以替换为不同的 XMemory 实现,使应用具备不同形式的记忆能力。
三大记忆类型详解
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
记忆类型对比图示:
ConversationBufferMemory:
[消息1] [消息2] [消息3] [消息4] [消息5] ... 全部保留
ConversationBufferWindowMemory(窗口=3):
[消息1] [消息2] [消息3] [消息4] [消息5]
→ 只保留 [消息3] [消息4] [消息5](最近3条)
ConversationSummaryBufferMemory:
[摘要] + [消息4] [消息5](最新对话保留原文)
十、课程项目:GitHub openai-quickstart
|
|
|
|---|---|
| 项目名称 |
|
| 定位 |
|
| 文档 |
|
| 内容 |
|
项目目录
openai-quickstart/
├── openai_api/ # OpenAI API 实战
├── langchain/ # LangChain 集成示例(本章核心)
├── openai-translator/ # OpenAI 翻译工具
├── chatgpt-plugins/ # ChatGPT 插件开发
├── docs/ # 文档与学习资料
└── selected_homework/ # 学员优秀作业
📌 本章核心要点总结
|
|
|
|
|---|---|---|
|
|
LLMChain |
|
|
|
SimpleSequentialChain |
|
|
|
SequentialChain |
|
|
|
TransformChain |
|
|
|
RouterChain |
|
|
|
ConversationBufferMemory |
|
|
|
ConversationBufferWindowMemory |
|
|
|
ConversationSummaryBufferMemory |
|
|
|
Memory 工作流程 |
|
★📚 下期预告:第11章 —— LangChain 实战(下):Agents + Data Connection,敬请期待!
本文整理自《AI 大模型应用开发实战营》第10章,讲师:彭靖田

