上下文压缩:在有限窗口塞进更多
即使上下文窗口已越来越大,真实任务里的材料(长文档、多轮对话、海量检索结果)仍常常超出上限。直接截断会丢掉信息,全部塞入则推高成本且稀释注意力。上下文压缩(context compression)的思路是:在不丢失关键语义的前提下,把长内容压缩成更短、更聚焦的表示,再交给模型。
为什么要压缩
两个主要动机:
- 窗口限制:超过上限的内容会被截断,早期或中段的重要信息可能无声消失。
- 成本与效果:token 越多,推理越贵;同时过长上下文会让模型更难聚焦真正相关的部分,注意力被稀释。
压缩的目标不是无差别缩短,而是「保真地浓缩」:保留决策所需的要点,舍弃冗余与离题部分。
常见方法
- 摘要压缩:用模型对长片段生成一句话或段落级摘要,适合背景材料。
- 关键句抽取:从原文挑出最关键句子拼接,优点是可追溯、不易引入幻觉。
- 检索式压缩:先用向量检索只取与当前问题最相关的片段,相当于「按需压缩」,与 RAG 天然契合。
下面是一段基于关键句打分抽取的思路示例:
def compress_by_extract(sentences, query_vec, top_k=3):
scored = []
for s in sentences:
sim = cosine(sentence_vec(s), query_vec) # 与当前问题的相关性
scored.append((sim, s))
scored.sort(reverse=True)
return " ".join(s for _, s in scored[:top_k]) # 仅保留最相关的几句
与 RAG 的关系和区别
检索式压缩与 RAG(检索增强生成)关系密切:RAG 先检索再生成,本质上只把相关片段送进上下文,就是一种压缩。区别在于,RAG 以「检索」为第一动作,而上下文压缩可以是检索之后的再加工,例如把检索到的多篇长文先各自摘要,再合并进提示。两者常常串联:检索负责「找得到」,压缩负责「放得下」。
精度与成本的权衡
压缩不是免费的:
- 摘要压缩可能引入模型自身的概括偏差,甚至幻觉,关键信息被改写后失真。
- 关键句抽取更保真但可能遗漏跨句才成立的隐含逻辑。
- 压缩层级越深,成本越低、但信息损失越大,需要按任务敏感度调节。
实践中常以「先检索、再按需摘要、最后留关键原文」的分级策略,在成本与保真之间取平衡。
小结
上下文压缩在固定窗口与成本约束下,用摘要、关键句抽取或检索式方法把长内容浓缩为保留要点的形式,与 RAG 的「先检索后生成」思路相通且常可串联。它在降低 token 成本、缓解截断上效果明显,但会引入概括偏差或遗漏风险,需要按任务敏感度在压缩深度与信息保真之间权衡。
参考与延伸阅读
- 检索式压缩与 RAG 的协同可参考各向量数据库与 LangChain 等框架的「上下文压缩检索器」文档;具体实现以官方为准。待核实。
- 长上下文模型兴起后,压缩与「更长窗口」是互补而非替代关系,相关讨论见多篇关于高效注意力与检索增强的综述。待核实。
本文累计阅读 — 次