一、上下文压缩是什么
大模型(LLM)每次回答问题,都要依赖你发给它的上下文(Context)——比如历史聊天记录、参考文档、系统提示词等。
随着对话轮数变多、或者从知识库检索出的背景资料变长,直接把所有原始内容一股脑塞给大模型,不仅很贵、很慢,而且大模型容易“看花眼”。
上下文压缩,就是在尽量不丢失关键信息的前提下,把冗长复杂的上下文“挤出水分”,用更少的字数/Token 把核心意思表达清楚,然后再喂给大模型。
一句话理解
就像老板让你汇报 50 页的项目进展,你不会把 50 页逐字念给老板,而是先提炼出一份 2 页的“核心要点小抄” 给老板看。
二、为什么需要上下文压缩?
很多新手会问:“现在大模型的上下文窗口不是动辄 128K 甚至 100 万 Token 了吗,为什么还要费劲压缩?”
主要解决 4 大痛点:
| 痛点 | 不压缩的问题 | 压缩后的效果 |
|---|---|---|
| 1. 太烧钱(成本高) | 每次发 10 万 Token 输入,按量计费钱包扛不住 | 压缩到 2 万 Token,API 成本直接下降 70%~80% |
| 2. 太慢(响应延迟高) | 首字响应时间(TTFT)随输入长度增加而明显变慢 | 输入变短,模型首字吐出速度大幅提升 |
| 3. 容易“中间迷失”(Lost in the Middle) | 输入太长时,大模型容易忽略夹在中间的关键细节 | 去除无关噪音后,模型注意力更集中,回答更精准 |
| 4. 历史记录无限膨胀 | 多轮 Agent 交互或超长对话总会超出窗口上限 | 滚动压缩历史,实现长久连续的记忆与对话 |
三、上下文压缩是怎么做的?(常见 4 种手段)
从最简单的“拿剪刀裁”到高阶的“小模型精炼”,常见有以下几种做法:
1. 规则裁剪与滑动窗口(最省事、硬切)
- 做法:只保留最近的 N 轮对话,或者用正则去除网页中的 HTML 标签、广告文本、重复空格与无用标点。
- 比喻:手机相册容量不够了,直接删掉 3 个月前的照片,或者把图片批量转成低画质格式。
- 优缺点:零计算成本、速度极快,但容易“一刀切”丢掉早期发生的关键信息。
2. 小模型摘要(Summary / 滚动总结)
- 做法:当对话过长时,后台派一个便宜快速的“小模型”(如轻量级开源模型或 Flash 档 API),把前 20 轮对话浓缩总结成一段《背景纪要》,替换掉原本臃肿的对话流水账。
- 比喻:请一个速记员,把 3 小时的会议录音整理成 200 字的会议纪要。
- 应用场景:AI 伴侣、客服长对话、多步骤 Agent 的任务记忆维护。
3. 信息抽取与相关性过滤(RAG 场景最常用)
- 做法:在知识库检索(RAG)召回了 10 篇相关文档后,压缩器根据用户的具体问题,只把文档中真正能回答问题的句子提取出来,把无关的上下文直接剔除。
- 代表工具:
- LangChain 的
ContextualCompressionRetriever(基于小模型或重排序模型过滤文档); - 微软开源的
LLMLingua(通过轻量模型计算每个词的信息熵,把冗余词、低信息量词剔除,实现 Prompt 级高保真压缩)。
- LangChain 的
- 比喻:从厚厚的《民法典》里,只把与“租房违约”相关的两条法条圈出来,而不是整本书递给法官。
4. 向量 / 软 Token 压缩(模型底层学术方案)
- 做法:在模型张量和 Embedding 层面,将几百个 Token 映射压缩为极少数包含高密度语义的 Soft Token / 向量(如 AutoCompressor、ICA 等研究)。
- 比喻:类似 zip 压缩包,直接在二进制层面压缩数据,主要用于模型内部推理加速与定制架构。
四、上下文压缩 vs 前缀缓存 vs RAG
这三个概念在 AI 系统架构中经常一起出现,它们的分工如下:
| 技术 | 它在干什么? | 文本变少了吗? | 核心目的 |
|---|---|---|---|
| RAG (检索增强) | 从海量知识库中大海捞针 | 否(把相关资料找出来) | 解决模型知识过时、缺少私有专业知识的问题 |
| 上下文压缩 | 对找出的资料或长对话挤水榨汁 | 是(输入变精炼了) | 降低 Token 成本、提速、降噪、防止模型迷失 |
| 前缀缓存 (Prefix Caching) | 对固定不变的前缀存下草稿纸 | 否(原文原封不动) | 避免 GPU 重复计算相同的输入,省钱提速 |
经典黄金组合
在实际的高性能 RAG / Agent 系统中,三者通常配合使用:
- RAG 先从知识库召回 15 篇相关文档片段;
- 上下文压缩 将这 15 篇文档过滤精炼成 2 篇核心干货;
- 前缀缓存 将固定不变的 System Prompt 与高频规则缓存起来,加速每次调用。
五、上下文压缩有什么代价?(避坑指南)
上下文压缩虽然好处多,但也有实际工程权衡:
- 关键信息丢失风险(最致命)
- 比如用户的要求包含细微约束条件(“预算不超过 500 元”、“不使用某个特定库”),如果压缩器误把这些细节当成修饰词剪掉了,大模型就会给出错误答案。
- 压缩自身的时间与算力开销
- 运行小模型摘要或计算 Token 熵需要消耗额外的算力和毫秒级时间。如果原本 Prompt 就只有几百字,再跑一次压缩反而是“杀鸡用牛刀”。
- 压缩比例不是越高越好
- 实践经验中,压缩率在 30%~60% 时性价比和效果最好;如果强行压缩到 80%~90% 以上,模型的推理质量通常会断崖式下降。
六、极简总结
- 一句话定义:给发给大模型的长篇大论“去粗取精、挤出水分”。
- 核心价值:更省钱(少付 Token 费)、更快(首字吐得快)、更聪明(少受无关噪声干扰)。
- 常见招式:
- 聊天记录太长 → 滚动小模型摘要 / 滑动窗口
- RAG 检索废话太多 → 句子级相关性过滤 / LLMLingua 剪枝
- 关键重要指令 → 保留原文,避免误删