你每天用 ChatGPT 时,可能都会重复发送同一段系统提示:”你是一个专业的翻译助手,请将用户输入的中文翻译成英文,保持学术风格…”这段提示有几十甚至上百个 token,每次请求都要被完整处理一遍。模型会逐层计算这些 token 的激活值,最终在第 32 层生成一个包含任务指令的内部表示。
但你有没有想过:这段提示经过 32 层处理后,最终承载的任务信息到底有多大?能不能用一个向量装下它,下次直接注入,跳过那几十层重复计算?
柏林自由大学的 Thibaud Ardoin 等人做了一个非常优雅的实验(arXiv:2607.08399),证明这是可行的——把一个指令提示压缩成单个激活向量,精度损失不到 2%。
核心方法:抽取-加权-注入
整个流程分三步:
1. 抽取:让模型正常处理一次指令提示,在中间某层(比如第 16 层)抽取每个 token 的激活向量。 2. 加权:用一个小的 Weighting MLP 学一组权重,对所有 token 的激活做加权求和,得到一个单一的”补丁向量”(patch vector)。 3. 注入:把这个补丁向量注入到模型的早期某层(比如第 4 层)的一个占位符 token 位置上。之后用户查询正常输入,模型只需要处理查询本身,不再重复处理指令提示。
这就像你第一次读一份操作手册时,在脑子里把它消化成一条”任务指令”存在工作记忆里。之后每次执行任务,直接调用这条指令,不用重新读手册。
关键发现一:简单方法胜过复杂方法
论文对比了两种压缩器:
– W-MLP:就是一个简单的加权求和,用 MLP 学权重。 – TC(Transformer Compressor):用一个小 Transformer 来生成补丁向量,直接训练它重建 patch。
直觉上 TC 应该更好——它有更强的表达能力。但实验结果相反:W-MLP 在分布内任务上和全提示基线的差距不到 2%,而 TC 只有 70.63% 准确率(远低于 W-MLP 的 88.87%)。
为什么?因为 TC 是端到端训练去重建 patch 向量,容易过拟合到训练集的具体 patch 值,而不是学习通用的压缩策略。W-MLP 的结构简单到无法记忆具体值,反而学到了更通用的东西——哪些 token 重要,哪些不重要。
这和”简单模型泛化更好”的经典机器学习直觉一致。
关键发现二:权重学到了语义重要性
作者做了一个很漂亮的验证实验。他们用 LLM 对提示”这家公司从事什么行业?”生成了 100 种改写(表面形式不同但语义相同),然后看 W-MLP 学到的权重分布。
结果:在 85% 的改写中,权重最高的 token 是 “industry”、”field” 或 “sector”——正是任务的核心语义目标。在 10% 的情况中,最高权重给了句末标点(问号),但即使在那些情况里,问号也总是出现在权重第二高的位置(75% 的情况)。
这说明 W-MLP 不是在死记硬背某个 token 位置,而是真的学会了识别”哪个词承载了任务的核心语义”。
关键发现三:中间层抽取,早期层注入
论文系统测试了不同的”抽取层-注入层”组合,发现一个一致的模式:
– 抽取层:中间偏深的位置(如 L/2 到 2L/3)效果最好。太浅的层还没形成足够抽象的任务表示;太深的层开始和具体 token 位置绑定,泛化性差。 – 注入层:越早越好(如第 1-4 层)。注入得越早,补丁向量有越多层来和后续查询的表示融合。
这个模式暗示了一件事:LLM 的中间层是”任务语义”最浓缩的地方。早期层在做 token 级别的特征提取,晚期层在做任务特定的输出准备,中间层才是”这个任务是什么”的抽象表示所在。
关键发现四:一个向量能装多个任务
最让我惊讶的发现:作者尝试把多个任务的指令同时编码进一个补丁向量,发现可以同时编码 9 个任务家族而不出现明显的精度下降。
这意味着单个激活向量的信息容量远超预期。LLM 的激活空间存在大量冗余,一个几百维的向量就能区分”翻译”、”摘要”、”问答”、”分类”等完全不同的任务模式。
作者在讨论中把这和”叠加”(superposition)概念联系起来:LLM 的激活空间可能用方向而非位置来编码不同的任务,所以一个向量可以通过多个方向的叠加来同时携带多个任务的信息。
实际意义
这个方法的直接应用场景是固定指令前缀的批量推理。如果你的应用总是用同一段系统提示(比如”你是一个客服助手,请按以下规则回答…”),你可以:
1. 离线计算一次补丁向量。 2. 每次请求只发送用户查询 + 补丁向量。 3. 跳过指令提示的前向计算,节省计算量。
对于一个 8B 参数的模型,如果指令提示有 100 个 token,每次请求能省下 100×8B = 8000 亿次乘加运算。在大规模服务场景下,这是真金白银的节省。
局限与展望
作者诚实地讨论了几个局限:
– OOD 泛化:分布外任务上性能下降明显,尤其是难任务。压缩向量捕获的是训练分布的任务模式,遇到没见过的任务类型会失效。 – 依赖特定模型:补丁向量是模型特定的,换模型就得重新训练压缩器。 – 只压缩指令提示:不适用于需要动态变化的上下文(如 RAG 中的检索片段)。
未来方向包括:探索补丁向量的信息容量上限、把压缩器和模型联合训练、扩展到多模态模型。
我的看法
这篇论文最让我欣赏的是它的简洁性。在所有人都在堆复杂架构的时代,它用一个加权求和就解决了问题,而且效果比复杂方法更好。这本身就是对”更多参数=更好性能”思维的一个反驳。
更深层地看,这个工作触及了一个有趣的科学问题:LLM 的激活空间到底有多冗余? 如果一个 100-token 的指令提示可以被压缩成一个几百维的向量而不丢信息,那原始提示中大部分 token 到底在做什么?它们是在传递信息,还是只是在让模型”进入状态”?
作者在讨论中提出了一个大胆的猜想:LLM 的中间层表示可能存在信息瓶颈(information bottleneck)——虽然激活向量的维度很高,但真正承载任务信息的子空间维度可能很低。如果是这样,那我们当前很多关于”模型容量”的讨论可能都需要重新审视。我们以为模型需要 X 亿参数来理解任务,但也许大部分参数是在处理 token 序列的表面形式,真正的任务理解只需要一小部分维度。
这和 MAESTRO 论文里”25% 压缩反而变好”的发现有精神上的共鸣:模型比我们以为的更冗余。
—
论文链接:https://arxiv.org/abs/2607.08399 HTML 全文:https://arxiv.org/html/2607.08399
