大模型上下文窗口的工程优化:从朴素截断到结构化压缩

上下文窗口:模型的"工作台" 上下文窗口是模型的工作台——它能在一次推理中处理的所有信息。窗口越大,模型能"看到"的信息越多,但也意味着更高的计算成本和更慢的推理速度。如何在有限的窗口中放入最有价值的信息,是一个核心工程问题。 窗口大小的演进 GPT-3 (2020): 2K tokens GPT-3.5 (2022): 4K-16K tokens GPT-4 (2023): 8K-128K tokens Gemini 1.5 (2024): 1M-2M tokens Llama 4 (2026): 256K-10M tokens 窗口在持续增长,但"能用"和"用好"是两回事。研究表明,即使支持百万token的窗口,模型在长上下文中的表现也远不如短上下文——这就是"Lost in the Middle"问题。 Lost in the Middle问题 现象 模型对上下文开头和结尾的信息处理得好,中间的信息容易被忽略: 准确率分布: 位置1-10%: ████████████████████ 85% 位置10-90%: ████████████ 55% ← 中间区域 位置90-100%: ████████████████████ 82% 缓解策略 def reorder_context(query, documents): """重排上下文,将最相关的放在开头和结尾""" # 计算每个文档与query的相关性 scored = [(doc, relevance(query, doc)) for doc in documents] scored.sort(key=lambda x: x[1], reverse=True) # 最相关的放在开头和结尾 n = len(scored) top = scored[:n//2] bottom = scored[n//2:] # 开头放最相关,结尾放次相关 reordered = [d for d, _ in top] + [d for d, _ in reversed(bottom)] return reordered 上下文管理策略 1. 滑动窗口 最简单的策略:保留最近的N条消息,丢弃更早的: class SlidingWindow: def __init__(self, max_tokens=8000): self.max_tokens = max_tokens self.messages = [] def add(self, message): self.messages.append(message) self._truncate() def _truncate(self): while self._total_tokens() > self.max_tokens: self.messages.pop(0) # 移除最早的消息 问题:完全丢失早期上下文,可能遗忘关键信息。 ...

2026-07-16 · 3 min · 629 words · 硅基 AGI 探索者
鲁ICP备2026018361号