当前位置:首页 > 技术 > 正文内容

LangChain滑动窗口记忆组件:ConversationBufferWindowMemory实战指南

访客 技术 2026年6月25日 1

ConversationBufferWindowMemory是LangChain中一个实用的记忆管理组件,通过滑动窗口机制只保留最近的K次对话交互。与传统方式保存全部对话历史不同,它自动丢弃超出窗口范围的早期内容,有效防止内存缓冲区膨胀。

技术依赖

pip install langchain-opentutorial

from langchain_opentutorial import package

package.install(
    [
        "langsmith",
        "langchain",
        "langchain_core",
        "langchain-anthropic",
        "langchain_community",
        "langchain_text_splitters",
        "langchain_openai",
    ],
    verbose=False,
    upgrade=False,
)

环境配置

from langchain_opentutorial import set_env

set_env(
    {
        "OPENAI_API_KEY": "",
        "LANGCHAIN_API_KEY": "",
        "LANGCHAIN_TRACING_V2": "true",
        "LANGCHAIN_ENDPOINT": "https://api.smith.langchain.com",
        "LANGCHAIN_PROJECT": "ConversationBufferWindowMemory",
    }
)

或者使用.env文件加载变量:

from dotenv import load_dotenv
load_dotenv(override=True)

初始化记忆对象

创建窗口大小为2的记忆实例,只保留最近两轮对话:

from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(k=2, return_messages=True)

模拟银行业务对话

依次保存6轮完整的客户咨询交互:

# 第一轮
memory.save_context(
    inputs={"human": "你好,我想在线开立银行账户。如何开始?"},
    outputs={"ai": "您好!很高兴您想开立账户。首先,请准备您的身份证件进行验证。"}
)

# 第二轮
memory.save_context(
    inputs={"human": "是的,我准备好了身份证件。接下来我该做什么?"},
    outputs={"ai": "谢谢您。请拍摄身份证的正反面清晰照片并上传。然后我们将进行身份验证流程。"}
)

# 第三轮
memory.save_context(
    inputs={"human": "我已经上传了照片。身份验证是如何进行的?"},
    outputs={"ai": "我已经确认了您上传的照片。现在,请进行手机验证。您将通过短信收到验证码 - 请输入该验证码。"}
)

# 第四轮
memory.save_context(
    inputs={"human": "我已经输入了验证码。如何继续开立账户?"},
    outputs={"ai": "您的身份已经验证。现在,请选择您想要的账户类型并输入所需信息。您可以选择存款类型、货币和其他选项。"}
)

# 第五轮
memory.save_context(
    inputs={"human": "我已经输入了所有信息。下一步是什么?"},
    outputs={"ai": "我已经确认了您的信息。账户开立流程几乎完成。最后,请同意服务条款并确认开立账户。"}
)

# 第六轮
memory.save_context(
    inputs={"human": "我已经完成了所有步骤。账户是否已经开立?"},
    outputs={"ai": "是的,您的账户已成功开立。您的账户号码和相关信息已发送到您注册的电子邮件。如果您需要任何进一步的帮助,请随时告诉我们。谢谢!"}
)

验证窗口效果

调用load_memory_variables方法查看实际保留的对话内容:

memory.load_memory_variables({})["history"]

输出结果仅包含最后两轮交互(第5轮和第6轮),共4条消息。前4轮对话被自动丢弃,体现了滑动窗口的核心机制。

工作原理

  • 窗口大小控制:通过k参数定义需要保留的交互轮数,每轮包含一条用户输入和一条AI响应
  • 缓冲管理:内部维护固定长度的队列,新消息入队时自动移除最早项
  • 消息格式:return_messages=True时返回HumanMessage和AIMessage对象;设为False则返回字符串
  • 历史查询:load_memory_variables方法返回当前窗口内的所有消息

扩展思路

  • 自适应窗口:根据对话复杂度或用户指令动态调整k值
  • 权重策略:为重要对话片段分配更高保留优先级
  • 混合记忆:将窗口记忆与摘要记忆结合,对丢弃的内容进行压缩存储
  • 多模态扩展:支持图片、音频等非文本消息的记忆管理
  • 持久化集成:将窗口内容同步到数据库或缓存系统

这种滑动窗口机制在控制内存消耗和维持上下文连贯性之间取得了良好平衡。对于长时间对话或资源受限环境尤为实用。需要注意的是,丢弃早期信息可能在某些需要完整历史记录的场景下造成信息损失,建议根据实际业务需求权衡窗口大小。

标签: LangChain

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。