长下文技术
现代LLM长上下文不是单一技术,而是组合:
用户输入(超长)
↓
RAG检索(筛选相关)
↓
compression(压缩)
↓
attention model(处理)
↓
KV cache(推理优化)
长上下文能力 ≠ attention真的看完所有token
系统在"让模型看起来像看完了所有信息",但实际上只处理了"精选后的信息子集"
① Attention结构优化(让"能算更长")
这是最"模型层"的改进。
1️⃣ Sparse Attention(稀疏注意力)
不是全连接,而是:
- 局部窗口
- 少量全局token
例如:
- Longformer
- BigBird
👉 思想:
不让每个token看所有token,只看"重要部分"
2️⃣ Sliding Window Attention(滑窗)
代表:LLaMA 3 / Mistral 系列(部分实现)
机制:
token i 只看:
- 前k个token
- 后k个token
👉 优点:
- O(n) 级别
- 适合超长文本
👉 缺点:
- 全局信息丢失(需要补偿机制)
3️⃣ KV Cache + Chunk Attention
用于推理阶段:
- 之前token的K/V缓存下来
- 新token只计算增量
👉 本质:
"避免重复计算"
在Chunk + Global Tokens的结构中,跨chunk的attention通常是通过少量global tokens来实现的,而不是让所有token之间全连接,从而降低计算复杂度。这些global tokens通常不是从原始token中选取的,而是额外引入的learnable embeddings,类似于CLS token,用于聚合chunk内部信息并在不同chunk之间传递;在一些变体中,也可以通过attention或pooling生成summary tokens,但主流设计是使用独立的global tokens作为信息桥梁。
4️⃣ Linear Attention / Kernel Attention(研究路线)
把:
O(n2)→O(n)O(n^2) \rightarrow O(n)O(n2)→O(n)
通过核函数近似softmax attention
👉 还没完全主流,但在研究中很活跃
② Context Compression(压缩上下文)
这是现在工业界最重要的方向之一(非常关键)
1️⃣ Chunk + Summary(分块总结)
流程:
长文本
→ 分块
→ 每块总结
→ 再总结总结
👉 类似:
"读书笔记系统"
2️⃣ Token pruning(剪枝)
- 删除低重要token
- 保留关键语义
3️⃣ Learned Compression(学习压缩)
例如:
- Perceiver-style memory
- Q-Former-style compression
👉 把:
10000 tokens → 100 tokens
③ Retrieval-Augmented Context(RAG)
这是最主流工程方案 ⭐⭐⭐
核心思想:
不让模型"记住所有上下文",而是"按需查"
流程:
超长文档
→ embedding index
→ 检索相关片段
→ 只把相关部分喂给LLM
👉 优点:
- 几乎无限扩展上下文
- 成本低
- 可更新知识
④ Memory System(你提到的)
你说的 memory 属于这一类:
两种 memory:
1️⃣ short-term memory
- 当前对话窗口
2️⃣ long-term memory
- 外部数据库 / vector DB
为什么不能只靠"扩大attention窗口"?
1️⃣ 成本爆炸
O(n^2)
2️⃣ 信息冗余
90% token不重要
3️⃣ 模型会"迷失"
太长context会:
- attention dilution
- 关键token被稀释
当前LLM长上下文能力并不是单纯通过扩大attention窗口实现的,而是通过注意力机制优化(如稀疏或滑窗attention)、上下文压缩(summary或token pruning)以及检索增强(RAG和memory系统)等多种方法协同实现,使模型能够在计算可控的情况下处理"逻辑上很长"的输入。