LLM上下文是有限的,目前大部分LLM支持128k-1M上下文,处理超长文本多模态数据依然不足。

滑动窗口与记忆机制就是针对这些问题的有效解决方案,平衡计算效率与信息保留能力。

模型每次只处理一个窗口的数据,但会将重要的历史信息,总结或关键向量,保留在缓存中,作为后续分析的上下文。

这里尝试基于网络资料,探索和学习最新的LLM滑动窗口与记忆机制,及其实践应用。

1 滑动窗口与记忆压缩本质

1.1 滑动窗口

滑动窗口出发点是解决Transformer中注意力机制随序列长度呈平方级增长的复杂度问题O(n^2)

每个token只与固定大小窗口w内的邻近token计算注意力,将复杂度降至O(n \cdot w)

然而,如何捕捉窗口外的长程依赖?这就引出了信息在深度网络中传播的感受野理论。

正如卷积神经网络(CNN)中,随着层数加深,高层神经元能看到原始输入更大的区域,

Transformer也是如此,对于一个L层网络,其理论最大感受野为L \times w。这意味着信息虽然不直接在注意力中可见,但可以通过层层传递方式,让网络间接获得全局视野。

1.2 记忆压缩

记忆压缩则指向了另一种路径,有损压缩与状态空间模型。

例如,线性注意力(Linear Attention)通过核技巧改变计算顺序,将历史信息累加到一个固定大小的隐藏状态中,实现了O(1)的推理复杂度。

这种软记忆是全局但有损,在将无限历史压缩进有限空间时,不可避免地会发生信息模糊或混叠。

滑动窗口与记忆机制的结合,本质上是局部无损精确记忆与全局有损压缩记忆在工程上的统一。

2 滑动窗口与记忆力探索

2.1 朴素截断到智能分层

实践中单一滑动窗口很快会遗忘早期重要信息,解决方案为分层的记忆架构。

1)朴素滑动窗口

朴素滑动窗口这是最基础的实现,像一个先进先出FIFO队列,只保留最近的K轮对话或Token 。

这种策略在LangChain等框架中对应`ConversationBufferWindowMemory`,适用于闲聊等对近期上下文敏感的短对话场景 。其优点是实现简单、开销极低,但代价是对早期信息的硬截断。

2)混合专家策略

混合专家策略Longformer与Mistral为了弥补窗口的不足,这些模型引入了全局或高效的变体。

Longformer在滑动窗口的基础上,允许部分token如[CLS]拥有全局注意力,能够关注整个序列,充当信息汇聚的枢纽 。

Mistral采用工程优化手段,不仅使用了滑动窗口,还通过分组查询注意力GQA大幅减少了KV缓存的大小,使得在固定大小的GPU内存中可以处理更长的序列 。

3)分层记忆架构

字节跳动研究的人工海马网络AHN,维护一个无损的短期记忆,即Transformer的KV缓存滑动窗口,例如32k tokens,同时,当一个窗口滑出时,一个被称为海马网络的可学习模块,即一个基于Mamba2、DeltaNet等RNN式架构,会将这些信息压缩成一个固定大小的长期记忆向量 。

这就将重要历史信息总结或关键向量保留在缓存中。实验结果证明,这种方法在长文本基准测试如LV-Eval上超越了纯滑动窗口基线,并节省了大量计算资源,比如Qwen2.5-3B的FLOPs减少40.5%。

2.2 动态、可逆与软性记忆

这里进一步探索动态、可逆、软性记忆,让记忆机制变得更智能、更灵活。

1)自适应滚动,Adaptive Stacking

在强化学习或序列建模中,研究者发现固定的滑动窗口无法处理依赖长度不定的场景。

自适应堆叠Adaptive Stacking让模型学习一个策略,即决定何时以及哪个记忆槽位应该被新信息替换,而不是机械地丢弃最旧的信息 。这相当于让模型自己判断哪些历史信息值得保留。

2)可逆压缩与精准恢复

为了在压缩信息的同时保留未来恢复的可能性,R³Mem 架构提出了滚动记忆的概念。它通过可逆Transformer和虚拟记忆Token,实现了对历史信息的压缩-存储-解压过程。

模型不仅可以向前传递压缩后信息,还可以通过反向计算恢复出某个历史片段原始内容 。

3)软性淘汰,Soft Eviction

传统的KV缓存淘汰是硬性的,一旦被移出活跃窗口,信息就无法参与后续计算。

ASR-KF-EGR框架则提出了一种软冻结机制,根据注意力得分动态评估token的重要性,将不重要的token从GPU的活跃缓存中移到CPU上的冻结存储中,如果未来需要,例如通过下一个token分布的熵值判断,还可以将其恢复到注意力计算中 。

这是一种更精细的内存分页paging管理思路,实现了在有限显存下的无限长上下文推理。

3 滑动窗口实践案例示例 

3.1 PyTorch滑动窗口注意力

这是滑动窗口最直观的实现方式,通过一个掩码矩阵,人为限制每个Token只能看到附近邻居。

下面的伪代码清晰地展示了这一过程。

1)掩码机制

代码通过遍历序列,为每个位置i生成一个只覆盖其前后window_size/2范围的掩码。

2)复杂度优势

虽然这段代码为了清晰而使用了完整的序列长度进行计算,并通过掩码屏蔽,但其核心将每个Token的关注范围从全局N缩减为局部常数w,即将复杂度从O(N²)降至O(N*w)。在实际长文本摘要任务中,这种优化能将推理速度提升多倍,而性能下降却相对有限

import torch
import torch.nn as nn

class SlidingWindowAttention(nn.Module):
    def __init__(self, dim, window_size=64):
        super().__init__()
        self.window_size = window_size
        self.qkv_proj = nn.Linear(dim, dim * 3)
        self.out_proj = nn.Linear(dim, dim)

    def forward(self, x):
        # x: (batch_size, seq_len, dim)
        batch_size, seq_len, dim = x.shape
        qkv = self.qkv_proj(x).view(batch_size, seq_len, 3, dim).permute(2, 0, 1, 3)
        q, k, v = qkv[0], qkv[1], qkv[2]

        # --- 核心部分:生成滑动窗口掩码 ---
        mask = torch.zeros(seq_len, seq_len, device=x.device)
        for i in range(seq_len):
            # 定义第i个token的可见范围: [i - window_size/2, i + window_size/2]
            start = max(0, i - self.window_size // 2)
            end = min(seq_len, i + self.window_size // 2 + 1)
            mask[i, start:end] = 1
        mask = mask.unsqueeze(0).unsqueeze(0)  # 扩展维度以匹配注意力分数

        # --- 计算注意力,窗口外分数被屏蔽为负无穷 ---
        attn_scores = torch.einsum('bhd,bhd->bhc', q, k.transpose(-2, -1)) / (dim ** 0.5)
        attn_scores = attn_scores.masked_fill(mask == 0, float('-inf'))
        attn_weights = torch.softmax(attn_scores, dim=-1)

        output = torch.einsum('bhc,bhd->bhd', attn_weights, v)
        return self.out_proj(output)

3.2 Ollama对Gemma3的优化

在实际工程中需要精妙的设计才能真正转化为性能提升。

上面示例中通过掩码屏蔽的方式,在计算前依然为所有Token分配了内存,造成浪费。

Ollama项目对Gemma 3模型的优化则更切实实际情况。。

1)物理丢弃,而非逻辑屏蔽

优化前滑动窗口计算正确,仍然在KV缓存中为整个长上下文例如32k分配了内存,导致显存占用高达20GB。优化后只保留窗口内的Key/Value向量,将窗口外的向量从缓存中物理删除。

2)显著收益

内存占用大幅下降,对于32k的上下文,总内存占用从~20GB降至~8GB。

计算量实质性减少,参与矩阵运算的张量规模变小,后续的计算自动加速。

这种优化方式的伪代码逻辑如下

import torch
import torch.nn as nn

class SlidingWindowAttention(nn.Module):
    def __init__(self, dim, window_size=64):
        super().__init__()
        self.window_size = window_size
        self.qkv_proj = nn.Linear(dim, dim * 3)
        self.out_proj = nn.Linear(dim, dim)

    def forward(self, x):
        # x: (batch_size, seq_len, dim)
        batch_size, seq_len, dim = x.shape
        qkv = self.qkv_proj(x).view(batch_size, seq_len, 3, dim).permute(2, 0, 1, 3)
        q, k, v = qkv[0], qkv[1], qkv[2]

        # --- 核心部分:生成滑动窗口掩码 ---
        mask = torch.zeros(seq_len, seq_len, device=x.device)
        for i in range(seq_len):
            # 定义第i个token的可见范围: [i - window_size/2, i + window_size/2]
            start = max(0, i - self.window_size // 2)
            end = min(seq_len, i + self.window_size // 2 + 1)
            mask[i, start:end] = 1
        mask = mask.unsqueeze(0).unsqueeze(0)  # 扩展维度以匹配注意力分数

        # --- 计算注意力,窗口外分数被屏蔽为负无穷 ---
        attn_scores = torch.einsum('bhd,bhd->bhc', q, k.transpose(-2, -1)) / (dim ** 0.5)
        attn_scores = attn_scores.masked_fill(mask == 0, float('-inf'))
        attn_weights = torch.softmax(attn_scores, dim=-1)

        output = torch.einsum('bhc,bhd->bhd', attn_weights, v)
        return self.out_proj(output)

3.3 跨领域的滑动窗口

滑动窗口的思想并非NLP独有,在计算机视觉领域同样大放异彩。

1)Swin-Transformer

这是视觉Transformer中的里程碑式工作,通过层次化的设计,将图像划分为不重叠的窗口如7x7,只在窗口内计算自注意力W-MSA。为了建立窗口间的联系,它巧妙地在下一层将窗口移位(Shifted Window, SW-MSA),让信息在层与层之间流动。这种设计使得计算复杂度从图像像素数的平方变为与像素数线性相关。

2)SiamCAT视觉跟踪算法

在目标跟踪任务中,需要同时处理模板(目标)和搜索区域。SiamCAT算法提出使用带有滑动窗口的中央注意力机制,来更好地维持2D输入的空间结构,避免全局注意力对局部空间相关性的破坏,在保持实时性的同时取得了顶尖的跟踪精度。

4 记忆力机制实践案例示例

4.1 AI分层记忆

受生物记忆启发,AI系统也发展出了精妙的分层记忆架构。这里以两个前沿框架为例。

1)MemGPT-将操作系统思想引入AI记忆

MemGPT的核心思想是将大模型的有限上下文窗口视为工作记忆,并引入长期记忆和元认知控制,模拟操作系统的内存层次结构-4

工作记忆 (Working Memory),相当于传统LLM的上下文窗口,例如32k tokens,负责处理当前的实时对话。它容量小但读取快。

长期记忆 (Long-Term Memory),外接向量数据库或键值存储,容量近乎无限(TB级)。当工作记忆溢出时,不常用的信息会被“分页”到这里存储。

元认知控制 (Metacognitive Control),这是一个智能决策模块,由强化学习训练而成。它动态判断何时将工作记忆中的信息压缩并存储到长期记忆,或何时从长期记忆中检索相关上下文并重新加载到工作记忆。

2)MemOS-记忆即一级资源

MemOS则将记忆的地位提升到操作系统级的高度,提出了标准化的记忆封装单元MemCube。

每个MemCube都像是一个自包含的记忆原子,可以独立管理、调度和演化。

明文记忆 (Plaintext Memory),可显式编辑的结构化知识,如用户偏好、规则文档,存储在Neo4j等图数据库中,支持关系追溯和版本管理。

激活记忆 (Activation Memory),模型推理过程中的瞬时状态,如KV缓存。MemOS首次将其抽象为可调度资源,支持按需唤醒、压缩和固化。

参数记忆 (Parametric Memory),固化在模型权重中的长期知识,相当于人类的“本能”和“常识”,通过LoRA等技术可实现模块化注入。

4.2 Langchain示例

滑动窗口缓冲记忆 (ConversationBufferWindowMemory)

这是最直接的“短期记忆”实现。它像一个固定大小的队列,只保留最近K轮对话,模拟了生物大脑中“工作记忆”的容量限制和“门口效应”的清零机制

from langchain.memory import ConversationBufferWindowMemory

# 创建一个只保留最近2轮对话的窗口
memory = ConversationBufferWindowMemory(k=2)
memory.save_context({"input": "你好"}, {"output": "你好,今天有什么可以帮你的?"})
memory.save_context({"input": "我想订一张去北京的机票"}, {"output": "请问您想哪天出发?"})
memory.save_context({"input": "下周一"}, {"output": "好的,正在为您查询下周一去北京的航班。"})

# 加载记忆变量,此时最早的对话("你好")已经被窗口遗忘
print(memory.load_memory_variables({}))

# 输出: {'history': 'Human: 我想订一张去北京的机票\nAI: 请问您想哪天出发?\nHuman: 下周一\nAI: 好的,正在为您查询下周一去北京的航班。'}

摘要记忆 (ConversationSummaryMemory)

这模拟了大脑的记忆固化和泛化过程。当对话过长时,它调用LLM自身,将冗长的对话历史压缩成一个精炼的摘要,保留核心要点,丢弃细枝末节。

from langchain.memory import ConversationSummaryMemory
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
# 创建一个摘要记忆,当对话token超过特定阈值时自动触发摘要
memory = ConversationSummaryMemory(llm=llm, max_token_limit=100)

# 假设进行了一段关于项目计划的复杂长对话...
memory.save_context({"input": "我们项目的核心目标是提升用户留存率。"}, 
                    {"output": "明白了,那我们需要重点关注用户 onboarding 流程和核心功能的使用频率。"})
# ... (更多轮对话) ...

# 此时,memory.buffer 中存储的已不是原始对话,而是LLM生成的摘要
print(memory.buffer)
# 输出示例: 'The user discussed the project's goal of improving user retention. The AI suggested focusing on the onboarding process and core feature usage frequency.'

实体记忆 (EntityMemory)

这个机制类似于生物大脑中专门负责跟踪特定实体及其属性的记忆系统。

它能从对话中自动提取并记住关于特定人物、地点、事物的信息,并随时间更新。

例如,在一个客服场景中,它可以跟踪用户的“偏好”和“历史订单”。

from langchain.memory import EntityMemory

# 初始化实体记忆(简化示例)
memory = EntityMemory()
memory.update("用户偏好:喜欢科技类产品,尤其关注手机续航。")
memory.update("用户历史订单:去年购买过一台X牌手机。")

# 当用户再次咨询时,可以查询关于这个“用户”实体的记忆
user_prefs = memory.load_memory_variables({"name": "用户"})
print(user_prefs)
# 输出会包含之前存储的偏好和订单信息

reference

---

LLM大规模数据的组织检索方法

https://blog.csdn.net/liliang199/article/details/158741006

Sliding Window Attention: Efficient Long-Context Modeling

https://www.digitalocean.com/community/tutorials/sliding-window-attention-efficient-long-context-models

Linear attention 与 Sliding window attention 是否等价?

https://www.zhihu.com/question/2010649897699930332/answer/2010836155172679954

深入解析AI智能体记忆机制:八大策略与实现方案

https://bbs.huaweicloud.com/blogs/458776

Short-Term vs Long-Term Agent Memory: A Deep Dive

https://sparkco.ai/blog/short-term-vs-long-term-agent-memory-a-deep-dive

Rolling Memory: Principles & Applications

https://www.emergentmind.com/topics/rolling-memory

Artificial Hippocampus Networks for Efficient Long-Context Modeling

https://arxiv.org/abs/2510.07318

人工海马体网络:减少70% KV cache

https://zhuanlan.zhihu.com/p/1959530386859233649

kvcache: Optimize sliding window attention

https://gitea.com/HeavenzFire/ollama/commit/2d6eac9084a29060ccff69014e28e206a3a7a663

Short window attention enables long-term memorization

https://hub.baai.ac.cn/paper/d14d74a8-9a9f-485c-b44b-d952e3214b9f

NSA稀疏注意力深度解析:DeepSeek如何将Transformer复杂度从O(N²)降至线性,实现9倍训练加速

https://developer.aliyun.com/article/1674696

End-to-End Test-Time Training for Long Context

https://hub.baai.ac.cn/paper/536d44c1-16c1-4dcf-aa7c-e759c2a2a9e7

Sliding Window Attention Training for Efficient Large Language Models

https://hub.baai.ac.cn/paper/ef85d092-bbc8-47c7-a72c-ba796efaf1a6#introduction

LangChain核心组件Memory实战指南:从原理到代码的深度解析

https://developer.baidu.com/article/detail.html?id=5316292

彻底戳穿AI「失忆症」!超越OpenAI全局记忆,中国队开源LLM记忆操作系统

https://hub.baai.ac.cn/view/47118

MemGPT:大语言模型长时记忆与动态交互应用指南

https://developer.baidu.com/article/detail.html?id=5281156

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐