跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI算法

LangChain 入门:Memory 记忆组件详解

综述由AI生成LangChain 框架中的 Memory 记忆组件,阐述了其在保持对话上下文连续性方面的作用。文章讲解了记忆组件的基本原理,包括读取和写入交互历史的过程。重点分析了四种主要的记忆组件类型:ConversationBufferMemory(全量记录)、ConversationBufferWindowMemory(窗口限制)、ConversationSummaryMemory(摘要总结)以及 VectorStoreRetrieverMemory(向量检索),并通过代码示例展示了各自的用法和配置参数。此外,文章还提供了不同组件的优缺点对比表及选择建议,帮助开发者根据 Token 限制、性能需求和业务场景选择最合适的记忆方案,以实现更自然的多轮对话体验。

链路追踪发布于 2025/2/6更新于 2026/5/1413 浏览
LangChain 入门:Memory 记忆组件详解

LangChain 入门:Memory 记忆组件详解

什么是 Memory

在构建基于大语言模型(LLM)的应用时,存储对话历史中的信息的能力被称为'记忆'(Memory)。这种机制允许应用程序记住之前的交互内容,从而支持上下文联想和连续对话。记忆组件既可以单独使用,也可以无缝集成到一条链(Chain)中。

记忆的存储生命周期通常覆盖程序执行的全过程,即从开始执行到结束期间产生的所有记忆。一个标准的记忆组件需要支持以下核心操作:

  • 读取(Read):获取之前存储的交互内容。
  • 写入(Write):将当前的交互内容保存下来。

每条链定义了核心执行逻辑,期望某些输入,这些输入一部分来自用户,另一部分来自记忆组件。在一次与 LLM 的完整交互中,链与记忆组件通常会进行两次交互:

  1. 读取记忆:将之前的交互内容读取出来,放入到本次的提示词(Prompt)上下文中。
  2. 写入记忆:将本次的交互结果(包括用户输入和模型输出)写入到记忆当中,以便后续使用。

为什么需要使用记忆组件

在 LangChain 中,如果直接使用 llm.invoke 进行大模型对话,LLM 的记忆范围仅限于单次会话的执行过程。一旦运行结束,再次对话就是新的开始,没有以前的记忆内容。例如,当提问'我刚刚说了什么'时,如果没有记忆组件,模型无法回答前一次的交互内容。

from langchain_community.llms import Tongyi

llm = Tongyi()
print("第一次对话:", llm.invoke("今天天气真好啊"))
print("第二次对话:", llm.invoke("我刚刚说了什么"))

运行上述代码,第二次对话时模型会因为没有上下文而无法识别'刚刚'指代的内容。

而使用记忆组件就可以让 LLM 拥有记忆能力,能够将进行上下文联想。这让与大模型对话时有和真人对话的感觉,能够维持多轮对话的连贯性。

使用步骤

要构建一个具备记忆能力的对话系统,通常需要四个部件组合起来使用:大模型、提示词模板、链、记忆组件。

  1. 实例化一个 LLM:选择合适的大模型服务。
  2. 定义记忆组件:根据需求选择合适的 Memory 类型。
  3. 创建提示词模板:在 Prompt 中预留记忆内容的占位符。
  4. 使用链将它们链接起来:通过 Chain 将上述组件串联。

四种记忆组件详解

1. ConversationBufferMemory(会话缓冲区)

如实记录列表中所有的对话历史消息,并保留完整的交互记录。随着历史记录的增加,上下文长度会越来越长,导致运行速度变慢,甚至超出大模型的 Token 限制。适用于交互次数少、输入输出字符量不大的场景。

使用方法
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())
os.environ["DASHSCOPE_API_KEY"] = "你的 API_KEY"

from langchain_community.llms  Tongyi
 langchain.chains  LLMChain
 langchain.prompts  PromptTemplate
 langchain.memory  ConversationBufferMemory


llm = Tongyi()


template = 
prompt = PromptTemplate(
    template=template,
    input_variables=[]
)




memory = ConversationBufferMemory(memory_key=, return_messages=)


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


chain.invoke()
chain.invoke()
chain.invoke()
res = chain.invoke()
(res[])
import
from
import
from
import
from
import
# 实例化 LLM
# 定义提示词模板,包含 {chat_memory} 占位符
'''你是一个美少女,你的名字是燕砸,你的任务是用温柔的语气回答人类的问题。 {chat_memory} human:{question} '''
"question"
# 初始化记忆组件
# memory_key: 对应 prompt 中的变量名
# return_messages: 是否返回消息对象列表
"chat_memory"
False
# 创建链
True
# 执行对话
"我喜欢美食,我最喜欢的美食是清蒸鲈鱼"
"你是谁?"
"今天的天气真好啊"
"我最开始跟你聊的什么呢?"
print
'text'

在 Prompt 的 template 中有一个 {chat_memory},这就是记忆组件的输入,也就是链与记忆组件的第一次交互点。在 memory 定义中需要将这个记忆组件的输入定义出来,memory_key 必须与 prompt 中的变量名一致。

2. ConversationBufferWindowMemory(会话缓冲窗口)

持续记录对话历史,但只使用最近的 k 个交互。这确保了缓存大小不会过大,运行速度比较稳定。适用于需要一定上下文但又不希望无限累积历史的场景。

使用方法
from langchain.memory import ConversationBufferWindowMemory

# 设置 k=2,只保留最近 2 条交互记录
memory = ConversationBufferWindowMemory(memory_key="chat_memory", k=2, return_messages=False)

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

参数 k 决定了记录交互的次数。其余两个参数与上一个一致。设置 k=2 后,模型只会记得最近的两次对话内容,更早的历史会被丢弃。

3. ConversationSummaryMemory(会话摘要)

随着时间的推移总结对话内容,并将摘要存储在记忆中。需要的时候将摘要注入提示词或链中。缓存不会过大,运行稳定,但是写入记忆时需要调用一次 LLM 进行摘要,因此运行速度比 ConversationBufferWindowMemory 慢很多。这使得它可以记住很长的交互记忆,不过随着交互的增加,摘要的内容不断迭代更换,使得某些细节内容可能会遗失。

使用方法
from langchain.memory import ConversationSummaryMemory

# 需要传入一个 llm 参数用于生成摘要
memory = ConversationSummaryMemory(llm=llm, memory_key="chat_memory", return_messages=False)

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

这个类型的记忆组件需要传入一个 llm 参数,使用 LLM 来进行对话摘要。这种方式适合长对话场景,但需要注意摘要可能丢失细节信息。

4. VectorStoreRetrieverMemory(向量存储)

将记忆存储在向量数据库中,并在每次调用时查询前 K 个最'显著'的文档。与大多数其他记忆类不同的是,它不明确跟踪交互的顺序。在这种情况下,'文档'是先前对话片段。这对于提及 AI 在对话中早些时候被告知的相关信息可能是有用的。这种方式通过语义检索来匹配上下文,而非简单的顺序匹配。

使用方式
from datetime import datetime
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
import faiss

from langchain.docstore import InMemoryDocstore
from langchain.vectorstores import FAISS

embedding_size = 1536  # OpenAIEmbeddings 的维度
index = faiss.IndexFlatL2(embedding_size)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})

llm = OpenAI(temperature=0)  # 可以是任何有效的 LLM
_DEFAULT_TEMPLATE = """以下是人类和 AI 之间友好的对话。AI 健谈并从其上下文中提供了许多具体细节。如果 AI 不知道问题的答案,它会真诚地说自己不知道。

先前对话的相关部分:
{history}

(如果不相关,您无需使用这些信息)

当前对话:
人类:{input}
AI:"""
PROMPT = PromptTemplate(
    input_variables=["history", "input"], template=_DEFAULT_TEMPLATE
)

# 初始化向量存储记忆
memory = VectorStoreRetrieverMemory(vectorstore=vectorstore, top_k=2)

conversation_with_summary = ConversationChain(
    llm=llm,
    prompt=PROMPT,
    memory=memory,
    verbose=True
)

conversation_with_summary.predict(input="Hi, 我叫 Perry,有什么新鲜事?")

这是官方提供的示例代码,有兴趣的可以进行尝试。这里不再过多展示运行结果。

记忆组件对比与选择建议

组件类型优点缺点适用场景
ConversationBufferMemory完整保留历史,实现简单上下文过长会导致 Token 溢出,速度慢短对话,测试环境
ConversationBufferWindowMemory控制上下文长度,性能稳定早期历史会被丢弃中等长度对话,需关注近期内容
ConversationSummaryMemory支持超长对话,节省 Token写入慢,摘要可能丢失细节长对话,角色扮演,剧情游戏
VectorStoreRetrieverMemory语义检索,不依赖顺序配置复杂,依赖向量库知识库问答,非线性的对话流

注意事项

  1. Token 限制:无论使用哪种记忆组件,最终传递给 LLM 的总 Token 数不能超过模型的限制。对于 Buffer 类型,务必监控上下文长度。
  2. 隐私安全:记忆组件会存储用户的对话历史,请确保符合数据隐私合规要求,不要在敏感业务中使用明文存储。
  3. 性能权衡:ConversationSummaryMemory 虽然节省空间,但每次写入都需要消耗额外的 LLM 调用成本和时间,需根据业务实时性要求权衡。
  4. Prompt 设计:在 Prompt 中正确放置记忆占位符是关键,通常放在 human 输入之前,以便模型理解上下文。

总结

对于一个聊天机器人,在对话中可能需要进行上下文联想、分析的操作,或者是进行一个情景对话,记忆组件都是不可或缺的重要组成部分。在 LangChain 的早期版本中,记忆组件运行速度非常的慢,如果作为一个请求内容返回给前端百分百会超时,在稳定的版本出来之后就流畅很多了,应用到实际的应用中也更具有体验感。在这样的条件下,对大模型进行角色定制,对话中这个角色的丰富度就会高很多。也能做出更多更有意思的聊天机器人。

选择合适的记忆组件取决于具体的业务需求。如果是简单的问答,Buffer 即可;如果需要长期记忆且对话频繁,Summary 或 VectorStore 是更好的选择。开发者应根据 Token 预算、延迟要求和数据精度需求进行综合评估。

目录

  1. LangChain 入门:Memory 记忆组件详解
  2. 什么是 Memory
  3. 为什么需要使用记忆组件
  4. 使用步骤
  5. 四种记忆组件详解
  6. 1. ConversationBufferMemory(会话缓冲区)
  7. 使用方法
  8. 实例化 LLM
  9. 定义提示词模板,包含 {chat_memory} 占位符
  10. 初始化记忆组件
  11. memory_key: 对应 prompt 中的变量名
  12. return_messages: 是否返回消息对象列表
  13. 创建链
  14. 执行对话
  15. 2. ConversationBufferWindowMemory(会话缓冲窗口)
  16. 使用方法
  17. 设置 k=2,只保留最近 2 条交互记录
  18. 3. ConversationSummaryMemory(会话摘要)
  19. 使用方法
  20. 需要传入一个 llm 参数用于生成摘要
  21. 4. VectorStoreRetrieverMemory(向量存储)
  22. 使用方式
  23. 初始化向量存储记忆
  24. 记忆组件对比与选择建议
  25. 注意事项
  26. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 小米手机端智能体落地,破解智能家居被动执行困局
  • VRM4U 插件在 Unreal Engine 5 中的使用指南
  • Java 高德地图面检索中 WGS84 坐标转换与 POI 查询实战
  • Flutter sse_stream 在鸿蒙端的适配:高并发背压处理与 AI 响应流优化
  • 本地部署 GraphRAG 教程及与传统 RAG 效果对比
  • 10 款 AI 降重工具功能对比与选择建议
  • 用 Anthropic Skill 优化大模型前端设计的审美
  • Openclaw 开源仿生机械爪设计与应用解析
  • VSCode 与 PyCharm 配置 OpenCV 教程(Python 与 C++)
  • Ubuntu 系统 Docker 完整安装及国内镜像加速配置
  • Python 安装后缺失 pip 的解决方案
  • 大模型技术详解:定义、架构与应用
  • 基于 MYAI 大模型的智慧警务应用场景与能力解析
  • AI 风口下的理性入局路径与避坑建议
  • Claude Code 进阶指南:利用 Everything 配置打造有记忆的 AI 助手
  • 医疗 AI 场景下的模型融合与集成策略
  • 常见反爬策略与破解方法:爬虫工程师攻防实战
  • 前端 Base64 格式文件上传详解:原理、实现与最佳实践
  • VSCode Copilot 认证失败排查与修复实战
  • Web IM 聊天信息加密算法:三种实现方案对比

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

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

  • Mermaid 预览与可视化编辑

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

  • 随机西班牙地址生成器

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

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

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