跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

深入剖析 LangChain:解构大模型的记忆增强策略

综述由AI生成LangChain 大模型记忆增强方案涵盖短时与长时记忆机制。核心原理为历史消息调取、填充 Prompt 及保存。常用组件包括 ConversationBufferMemory 用于内存存储,ConversationSummaryMemory 用于上下文总结,以及结合向量数据库实现长期记忆。通过 ConversationBufferMemory 配合 PromptTemplate 或 ChatPromptTemplate 的 MessagesPlaceholder 可实现上下文感知。ConversationChain 进一步封装了上述流程,简化开发。开发者需注意 memory_key 与 variable_name 的一致性规则,根据模板类型选择合适配置。扩展方案可结合向量数据库实现 RAG 架构,提升知识检索能力。

ServerBase发布于 2025/2/7更新于 2026/6/320 浏览
深入剖析 LangChain:解构大模型的记忆增强策略

深入剖析 LangChain:解构大模型的记忆增强策略

LangChain 为大语言模型(LLM)提供了丰富的记忆组件,使得构建具有上下文感知能力的对话应用变得简单。本文将深入拆解基于 LangChain 的大模型记忆方案,涵盖原理、类型及具体实现。

1. 安装记忆的原理

1.1. 核心步骤

给 LLM 安装记忆的核心逻辑包含三个关键步骤:

  1. 调取历史:在发起新对话请求前,检索之前的历史消息。
  2. 填充 Prompt:将检索到的历史消息作为上下文填充到当前的 Prompt 模板中。
  3. 保存记忆:对话结束后,将新的交互记录保存到 Memory 存储中,以便后续轮次使用。

1.2. 常规使用方法的弊端

若手动实现上述三步,开发者需要编写大量重复的模板代码,不仅冗余且容易遗漏关键逻辑。LangChain 通过封装 Memory 组件和 Chain 机制,简化了这一流程,让开发者能更专注于业务逻辑的实现。

2. 记忆的种类

根据存储时长和机制的不同,LangChain 中的记忆主要分为短时记忆和长时记忆。

  • 短时记忆:通常指当前会话窗口内的上下文。常用 ConversationBufferMemory 以键值对方式将消息存在内存中。对于较长对话,可使用 ConversationSummaryMemory 对上下文进行总结摘要,或 ConversationTokenBufferMemory 基于固定 Token 数量自动刷新旧消息。
  • 长时记忆:用于跨会话的长期知识存储。可通过向量数据库(如 FAISS、Chroma)存储嵌入后的文本,或使用 Redis、Elasticsearch 等持久化存储。

以下将以 ConversationBufferMemory 为例,演示如何快速为 LLM 安装记忆。

3. 给 LLM 安装记忆 — 非 MessagesPlaceholder

3.1. ConversationBufferMemory 使用示例

使用 ConversationBufferMemory 记住上下文的基本代码如下:

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.save_context(
    {"input": "你好,我的名字是半支烟,我是一个程序员"}, 
    {"output": "你好,半支烟"}
)
print(memory.load_memory_variables({}))

3.2. LLMChain + ConversationBufferMemory 使用示例

结合 PromptTemplate 使用时,需指定 memory_key 以匹配 Prompt 中的变量名:

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

# Prompt 模板
template = """
你是一个对话机器人,以下<history>标签中是 AI 与人类的历史对话记录,请你参考历史上下文,回答用户输入的问题。

历史对话:
<history>
{customize_chat_history}
</history>

人类:{human_input}
机器人:
"""

prompt = PromptTemplate(
    template=template,
    input_variables=["customize_chat_history", "human_input"],
)

memory = ConversationBufferMemory(
    memory_key="customize_chat_history",
)
model = ChatOpenAI(model="gpt-3.5-turbo")

chain = LLMChain(
    llm=model,
    memory=memory,
    prompt=prompt,
    verbose=True,
)

# 首次调用
chain.predict(human_input="你知道我的名字吗?")

# 第二次调用,利用记忆
chain.predict(human_input="我叫半支烟,我是一名程序员")

# 第三次调用,验证记忆是否保留
chain.predict(human_input="你知道我的名字吗?")

此时,LLM 已具备记忆能力,无需手动处理历史消息的拼接与保存。

4. 给 LLM 安装记忆 — MessagesPlaceholder

当使用 ChatPromptTemplate 时,由于涉及多角色(System, Human, AI),需要使用 MessagesPlaceholder 来插入历史消息列表。

4.1. PromptTemplate 和 ChatPromptTemplate 区别

  • PromptTemplate:主要用于单行文本生成,适合结构化数据或非对话场景。
  • ChatPromptTemplate:专为聊天场景设计,支持 System、Human、AI 等多角色消息格式。历史消息需按顺序排列在最新问题之前。

4.2. 使用 MessagesPlaceholder 安装

以下是 ChatPromptTemplate 配合 MessagesPlaceholder 的标准实现:

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的助手。"),
    MessagesPlaceholder(variable_name="customize_chat_history"),
    ("human", "{human_input}"),
])

memory = ConversationBufferMemory(
    memory_key="customize_chat_history",
    return_messages=True,  # 关键参数:返回消息对象而非字符串
)
model = ChatOpenAI(model="gpt-3.5-turbo")

chain = LLMChain(
    llm=model,
    memory=memory,
    prompt=chat_prompt,
    verbose=True,
)

chain.predict(human_input="你好,我叫半支烟,我是一名程序员。")

5. 使用对话链 ConversationChain

为了进一步简化开发,LangChain 提供了 ConversationChain,它内部封装了 Memory、LLMChain 和 ChatPromptTemplate 的初始化过程。

from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="history",  # 默认占位符通常为 history
    return_messages=True,
)
model = ChatOpenAI(model="gpt-3.5-turbo")

chain = ConversationChain(
    llm=model,
    memory=memory,
    verbose=True,
)

# 注意:此处变量名必须是 input
chain.predict(input="你好,我叫半支烟,我是一名程序员。")

ConversationChain 提供了包含 AI 角色和人类角色的标准对话格式,极大降低了配置复杂度。

6. ConversationBufferMemory 细节

6.1. memory_key

ConversationBufferMemory 的 memory_key 参数定义了内存中存储对话数据的键名。该键名必须与 Prompt 模板中的变量名保持一致,否则无法正确注入历史消息。

6.2. 使用 "chat_history" 还是 "history"

在实际开发中,memory_key 的选择取决于使用的模板类型:

  1. 自定义 MessagesPlaceholder:如果使用 ChatPromptTemplate 并显式定义 MessagesPlaceholder,则 memory_key 可以与 variable_name 保持一致,例如都设为 customize_chat_history。

    chat_prompt = ChatPromptTemplate.from_messages([
        ("system", "你是一个乐于助人的助手。"),
        MessagesPlaceholder(variable_name="customize_chat_history"),
        ("human", "{input}"),
    ])
    memory = ConversationBufferMemory(
        memory_key="customize_chat_history",
        return_messages=True,
    )
    
  2. 使用 ConversationChain:如果直接使用 ConversationChain 而不自定义 Prompt,memory_key 必须设置为 history,因为 ConversationChain 内部默认使用此键名。

7. MessagesPlaceholder 的使用场景

MessagesPlaceholder 本质上是 Prompt 中的一个占位符,用于动态插入从 Memory 读取的历史消息列表。它允许在构建复杂 Prompt 时灵活控制消息的结构和位置。

7.1. 选择原则

  • PromptTemplate:无需使用 MessagesPlaceholder,直接通过字符串格式化注入历史内容。
  • ChatPromptTemplate:推荐使用 MessagesPlaceholder,因为它能保持消息的角色属性(Role),确保 LLM 正确理解对话流。

7.2. ConversationChain 的特殊性

在使用 ConversationChain 时,可以省去创建 ChatPromptTemplate 的步骤。虽然输出结果可能略有差异,但大多数场景下功能一致。若需精细控制 System Prompt 或消息结构,建议手动构建 ChatPromptTemplate 并传入 ConversationChain。

8. 总结与最佳实践

本文详细解析了 LangChain 中大模型记忆增强的基本原理与实现方案。主要要点如下:

  1. 记忆机制:核心在于历史消息的提取、注入与持久化。
  2. 组件选择:ConversationBufferMemory 适用于短期会话;ConversationSummaryMemory 适用于长上下文;向量数据库适用于跨会话知识检索。
  3. 模板匹配:务必确保 memory_key 与 Prompt 中的变量名严格对应。
  4. 开发效率:优先使用 ConversationChain 简化流程,特殊需求再手动定制 ChatPromptTemplate。

扩展:长时记忆的实现思路

对于需要长期存储知识的场景,除了简单的内存缓存,建议结合向量数据库。基本流程为:

  1. 将历史对话或知识库文档向量化。
  2. 使用 VectorStoreRetriever 根据当前问题检索相关片段。
  3. 将检索到的片段作为 Context 注入到 Prompt 中。 这种模式被称为 RAG(检索增强生成),能有效解决 LLM 知识截止和幻觉问题,是构建企业级 AI 应用的关键技术路径。

通过合理运用上述记忆策略,开发者可以构建出既具备连贯对话能力,又能准确调用外部知识的智能应用系统。

目录

  1. 深入剖析 LangChain:解构大模型的记忆增强策略
  2. 1. 安装记忆的原理
  3. 1.1. 核心步骤
  4. 1.2. 常规使用方法的弊端
  5. 2. 记忆的种类
  6. 3. 给 LLM 安装记忆 — 非 MessagesPlaceholder
  7. 3.1. ConversationBufferMemory 使用示例
  8. 3.2. LLMChain + ConversationBufferMemory 使用示例
  9. Prompt 模板
  10. 首次调用
  11. 第二次调用,利用记忆
  12. 第三次调用,验证记忆是否保留
  13. 4. 给 LLM 安装记忆 — MessagesPlaceholder
  14. 4.1. PromptTemplate 和 ChatPromptTemplate 区别
  15. 4.2. 使用 MessagesPlaceholder 安装
  16. 5. 使用对话链 ConversationChain
  17. 注意:此处变量名必须是 input
  18. 6. ConversationBufferMemory 细节
  19. 6.1. memory_key
  20. 6.2. 使用 "chat_history" 还是 "history"
  21. 7. MessagesPlaceholder 的使用场景
  22. 7.1. 选择原则
  23. 7.2. ConversationChain 的特殊性
  24. 8. 总结与最佳实践
  25. 扩展:长时记忆的实现思路
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • FastAPI 打造基于 LLM 的 Web 接口实战教程
  • 学习 Python 推荐的 10 个优质技术资源网站
  • 本地 LLM 模型与 Ollama、Python 集成实战
  • 若依 (RuoYi) 低代码框架深度解析与选型建议
  • C++ STL list 容器详解:使用与模拟实现
  • Python 项目打包成 exe 并添加卸载功能教程
  • Stable Diffusion 图生图功能详解与参数优化指南
  • 基于数据流架构扩展 RAG 提升大模型准确度
  • Arduino BLDC 机器人 IMU 角度读取与 PID 互补滤波控制
  • Stable Diffusion 1.5 皮革服装 LoRA 镜像部署实战
  • Flutter 全方位深入探索与实战指南
  • AIGC 联动 Photoshop 与 Spine 2D 实现 2D 角色骨骼动画拆件
  • 大模型入门教程:基础原理、微调技术与实战指南
  • 程序员职业发展的“内卷化”现象与应对策略
  • 漏洞扫描工具整合使用教程
  • AI 智能体:基于 OpenCode 搭建 Skills 环境与项目实战开发
  • 大模型工作岗位解析与项目经理职责详解
  • 无人机结构设计核心要点解析
  • C++ 模拟实现二叉搜索树
  • 大模型提示工程 (Prompt Engineering) 核心策略与实战

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online