Back to blog

SALT: Salience-Aware Lexical Trie for Long-Context Compression

Model-agnostic extractive prompt compression framework using sentence-frequency-ordered lexical trie to prevent theme collapse under tight budgets

SALT: Salience-Aware Lexical Trie for Long-Context Compression

一、论文概述

项目内容
标题SALT: Salience-Aware Lexical Trie for Long-Context Compression
作者Oteo Mamo, Hyunjin Yi, Joydhriti Choudhury, Shangqian Gao, Weikuan Yu
机构Florida State University
论文arXiv:2607.17486
代码GitHub (paper 提到提供代码,具体仓库待确认)
发布20 Jul 2026 (v1), 3,473 KB
许可CC BY 4.0
SubjectsPerformance (cs.PF); Artificial Intelligence (cs.AI); Machine Learning (cs.LG)

二、核心思想

问题定义:主题坍塌 (Theme Collapse)

大语言模型处理越来越长的 prompt 时,计算和 KV cache 内存成本成为推理系统的重大瓶颈。现有的输入级 prompt 压缩方法(如 RECOMP、EXIT、CPC、Sentinel、LLMLingua 等)通过标量相关性分数对每个句子排名,将文档视为无结构的词/句子池。在严格预算下,这会导致主题坍塌——文档的主导主题消耗了大部分预算,丢弃了低频但任务相关的主题。例如在多跳 QA 中,可能保留多个关于主实体的段落,而丢弃连接第二实体的桥接句子。

解决方案概述

SALT 是一个模型无关的提取式压缩框架,核心理念是:压缩预算应在文档衍生的词汇主题间分配,而非孤立地对句子打分。

SALT 将每句关键词组织到一个按句子频率 (Sentence Frequency, SF) 排序的词缀树 (lexical trie) 中。SF 是文档主题结构的轻量级、可复用代理。这种基于 trie 的组织方式平滑了内存分配,防止主导主题垄断预算。

SALT 包含两个阶段:

  1. 索引阶段 (Indexing):使用 BGE-small-en-v1.5 从每个句子中提取关键词,构建 SF 有序的词缀树
  2. 选择阶段 (Selection):在目标词预算下遍历 trie 选择句子子集,支持摘要模式 (summary mode) 和查询模式 (query mode)

Trie 跨对话轮次持久化,支持多轮使用而无需重新编码文档。SALT 输出纯文本 prompt,与任何下游 LLM 兼容,且可与针对解码延迟和内存的 KV cache 方法组合使用。

三、技术架构

整体框架图

SALT Pipeline Overview

┌─────────────────────────────────────────────────────────────┐
│                     SALT Pipeline Overview                   │
│                                                              │
│  Phase 1: Indexing (once per document)                      │
│  ┌──────────┐    ┌──────────────┐    ┌──────────────────┐   │
│  │ Document  │ →  │ BGE Encoder  │ →  │ Per-Sentence     │   │
│  │ D = {s_i} │    │ (512-token   │    │ Keyword Extraction│   │
│  │          │    │  dense pack)  │    │ via [CLS] attn   │   │
│  └──────────┘    └──────────────┘    └──────────────────┘   │
│                                                    │         │
│                                                    ▼         │
│  ┌──────────────────────────────────────────────────────┐   │
│  │ Compute Sentence Frequency (SF) for each keyword      │   │
│  │ Filter salience set S (top 10% quantile, p=0.9)      │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                    │         │
│  ┌──────────────────────────────────────────────────────┐   │
│  │ Build Keyword Trie T:                                │   │
│  │ - Each sentence s_i → sorted path by decreasing SF   │   │
│  │ - Shared prefixes for sentences with common anchors  │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
│  Phase 2: Selection (per query / per budget)                │
│  ┌──────────────────────────────────────────────────────┐   │
│  │ Summary Mode:                                         │   │
│  │   BranchAllocate → select within branches by Eq.(5)   │   │
│  │   GlobalFill → assign unused budget                    │   │
│  │                                                       │   │
│  │ Query Mode:                                           │   │
│  │   QueryKeywords → activate trie nodes at any depth    │   │
│  │   AnchorPhase → admit top candidates + neighbors      │   │
│  │   BranchAllocate + GlobalFill → as summary mode       │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
│  Output: Sentence subset R in original document order        │
│  → Plain-text prompt → Any downstream LLM                    │
└─────────────────────────────────────────────────────────────┘

核心公式

关键词提取与句子频率

[CLS] Attention 关键词排序: 对每个句子 sis_i,使用 BGE encoder 的 [CLS] token attention 对内容词降序排列。

Knee Detection 关键词数量确定:

余弦相似度累积曲线 (Eq. 1):

cˉt=max⁡τ≤tcτ,t=1,…,ni(1)\bar{c}_t = \max_{\tau \leq t} c_\tau, \quad t = 1, \ldots, n_i \tag{1}

其中 ctc_t 是前 tt 个词的均值嵌入与完整句子均值嵌入的余弦相似度。cˉt\bar{c}_t 是单调包络线。Kneedle 算法找到 knee 点 kik_i,限制最多选择 40%40\% 的内容词。

句子频率 (Sentence Frequency) (Eq. 2):

SF(w)=∣{i:w∈Ki}∣(2)\text{SF}(w) = |\{ i : w \in K_i \}| \tag{2}

其中 KiK_i 是句子 sis_i 的关键词集合。SF 衡量一个关键词作为选中锚点出现在多少个句子中。

Salience Set 过滤: 保留 SF\text{SF} 高于 pp-th 分位数(默认 p=0.9p = 0.9)的关键词。

归一化显著性权重:

SF^(w)=SF(w)SFmax⁡,SFmax⁡=max⁡u∈SSF(u)(3)\widehat{\text{SF}}(w) = \frac{\text{SF}(w)}{\text{SF}_{\max}}, \quad \text{SF}_{\max} = \max_{u \in \mathcal{S}} \text{SF}(u) \tag{3}

词缀树结构

子树关键词签名: 对于 trie 节点 vv,令 D(v)\mathcal{D}(v) 为其后代句子,Γ(v)=⋃si∈D(v)Ti\Gamma(v) = \bigcup_{s_i \in \mathcal{D}(v)} T_i 为其关键词签名。

已覆盖关键词:

Cv(R)=Γ(v)∩⋃si∈R∩D(v)Ti(4)C_v(\mathcal{R}) = \Gamma(v) \cap \bigcup_{s_i \in \mathcal{R} \cap \mathcal{D}(v)} T_i \tag{4}

未覆盖质量 (Uncovered Mass) (Eq. 3):

Uv(R)=∑w∈Γ(v)∖Cv(R)SF^(w)(5)U_v(\mathcal{R}) = \sum_{w \in \Gamma(v) \setminus C_v(\mathcal{R})} \widehat{\text{SF}}(w) \tag{5}

预算约束选择

边际增益 (Eq. 4):

Δb(si∣R)=Ub(R)−Ub(R∪{si})(6)\Delta_b(s_i \mid \mathcal{R}) = U_b(\mathcal{R}) - U_b(\mathcal{R} \cup \{s_i\}) \tag{6}

句子评分 (Eq. 5):

scoreb(si∣R)=Δb(si∣R)L(ni)⋅I(si)(7)\text{score}_b(s_i \mid \mathcal{R}) = \frac{\Delta_b(s_i \mid \mathcal{R})}{L(n_i) \cdot I(s_i)} \tag{7}

其中 L(ni)L(n_i) 偏好中等长度句子,I(si)I(s_i) 编码句子级先验(位置和查询模式下的词匹配)。

Branch Allocate 策略

分支配额 = 固定下限 + 剩余份额 ∝(Mb+ϵ)α\propto (M_b + \epsilon)^\alpha,其中 0<α<10 < \alpha < 1。MbM_b 是分支的剩余未覆盖质量。次线性指数压缩高质量分支,下限为低质量分支保留容量。

查询模式

有效显著性集合:

Seff=S∪(Kq∩⋃iKi)(8)\mathcal{S}_{\text{eff}} = \mathcal{S} \cup (K_q \cap \bigcup_i K_i) \tag{8}

其中 KqK_q 是查询关键词。查询关键词在计算 UbU_b 时被赋予更大质量。

注意力源重归一化 (Appendix B.2)

Span-local Renormalization (Eq. 6):

a^j(si)=aj∑k=se−1ak,j∈[s,e)(9)\hat{a}^j(s_i) = \frac{a_j}{\sum_{k=s}^{e-1} a_k}, \quad j \in [s, e) \tag{9}

其中 [s,e)[s, e) 是句子在 chunk 中的 token 跨度。

Kneedle 截止 (Appendix B.3) (Eq. 7):

t∗=arg⁡max⁡t≤⌊rmax⁡⋅Mi⌋∣c~t−t~∣2(10)t^* = \arg\max_{t \leq \lfloor r_{\max} \cdot M_i \rfloor} \frac{|\tilde{c}_t - \tilde{t}|}{\sqrt{2}} \tag{10}

其中 rmax⁡=0.4r_{\max} = 0.4。

模型组件

组件说明关键参数
BGE EncoderBAAI/bge-small-en-v1.5, 6层 BERT, d=384d=384, 33M 参数512-token dense packing, 2-sentence overlap
[CLS] Attention最终层 [CLS] token 的 attention row 用于关键词排序Span-local renormalization (Eq. 9)
Kneedle Cutoff基于余弦累积曲线的 knee 检测确定关键词数量rmax⁡=0.4r_{\max} = 0.4, 即最多选 40% 词
Sentence Frequency关键词在句子关键词集中出现的次数SF 分布的 p=0.9p=0.9 分位数阈值
Keyword Trie内部节点由 salience set 关键词标记,叶子存储句子 ID根到叶路径按 SF 降序排列
Branch Allocate按未覆盖质量 (Mb+ϵ)α(M_b+\epsilon)^\alpha 分配预算给分支0<α<10 < \alpha < 1 (次线性)
Anchor Phase查询模式下,激活匹配查询关键词的 trie 节点βq\beta_q 控制相关性-覆盖率权衡

训练流程

SALT 不需要训练。它是一个免训练的提取式框架:

  1. 一次性索引:对文档运行 BGE-small-en-v1.5 (33M 参数) 进行关键词提取和 trie 构建
  2. 可复用:trie 对压缩预算和查询模式不变,可跨多轮对话重复使用
  3. 两种模式:
    • 摘要模式: 无条件从根遍历,按分支未覆盖质量分配预算
    • 查询模式: 提取查询关键词,激活匹配的 trie 节点,βq\beta_q 控制相关性-覆盖率权衡

四、核心创新

创新点说明理论/实验依据
发现主题坍塌问题首次明确指出标量排名压缩方法在严格预算下导致主导主题垄断预算、丢弃低频主题的问题Appendix A: 诊断性 ROUGE-L 实验证明仅选 top-ranked centroid candidates 并非始终最优
SF 有序的关键词 Trie用句子频率 (SF) 作为文档衍生的主题结构代理,将关键词组织到可复用的 trie 中,预算先在主题分支间分配再选择句子Section 3.2: 子树未覆盖质量 UvU_v 度量分支代表性,branch allocate 防止主导主题垄断
多锚点检索 (Multi-anchor Retrieval)查询关键词可在 trie 中任意深度激活节点,不仅限于前缀下降,支持查询相关关键词作为主锚点或次共现Section 3.2: Seff\mathcal{S}_{\text{eff}} 扩展显著性集,恢复被剪枝但在某些句子中存在的查询关键词
跨轮次可复用索引索引独立于查询,多轮对话中只需遍历 trie,摊销编码成本Section 4.4: QuALITY 19 轮对话中,SALT 总成本 0.91s vs RECOMP 1.88s vs 基线 3.71s

五、代码实现分析

实现细节

  • 框架: PyTorch 2.6.0 / 2.7.1
  • Encoder: BAAI/bge-small-en-v1.5 (33M 参数, 6 layers, d=384d=384)
  • 密集打包: 连续句子贪婪拼接至 512-token chunk,相邻 chunk 重叠 2 句
  • Span-local Renormalization: 对每个句子 token 跨度内的 [CLS] attention 做局部归一化 (Eq. 9)
  • 输出格式: 每个句子产生 5-7 个内容词(中位数 6 个,平均句长 28 词),附带 attention 权重和 final layer hidden-state embeddings

与其他方法的对比配置

方法配置
SnapKV默认 20% 预算
FastKV60% prefill + 20% decode 预算
DuoAttention20% (论文最佳为 50%,此处调低以对齐预算)
SentenceKV原始实现不变
H2OChunked prefill at 8k
EXITspaCy 分句 + LoRA-tuned Gemma-2B classifier, threshold 0.5
RECOMP原始实现不变
CPC预训练 LoRA + local Llama-3.1-8B-Instruct answer generator
SentinelQwen-2.5-0.5B proxy + trained detector

六、实验结果

实验设置

  • 模型: LLaMA-3.1-8B-Instruct (主), Ministral-8B-Instruct-2410 (附录)
  • 硬件: NVIDIA H100 (主), 跨代验证: V100, A100, B200
  • 数据集: PG19 (latency/memory profiling), LongBench (accuracy), QuALITY (multi-turn), RULER/NIAH (retrieval)
  • 上下文长度: 16k – 256k tokens
  • KV Cache 保留率: 20%

基准测试: LongBench 准确率 (Table 1)

LLaMA-3.1-8B-Instruct, 20% KV cache retention:

MethodSingle-Doc QAMulti-Doc QASummarizationFew-ShotSyntheticCodeAvg.
Full-context43.5844.6529.2269.4854.2160.0150.19
KV Cache Methods (20%)
SnapKV43.2943.9226.5967.9553.7558.7449.04
FastKV43.3144.1026.6168.3653.7259.2649.23
SentenceKV39.2543.8228.1869.2653.2447.3346.85
DuoAttention34.7136.6724.3058.0250.8154.3343.14
Preprocessing Methods (20%)
EXIT31.5023.7724.9458.8913.5037.4531.68
RECOMP35.8841.0924.1652.0650.7737.3740.22
CPC38.9139.4224.9751.6751.5021.8438.05
Sentinel39.8541.6626.1538.7851.5538.8339.47
SALT40.0541.4226.9562.2153.3737.0643.51

关键观察:

  • SALT 在预处理方法中平均准确率最高 (43.51),仅次于全上下文 (50.19) 和 SnapKV/FastKV (~49)
  • SALT 在 Few-Shot (62.21) 上显著领先所有压缩方法
  • Code 是所有预处理方法的共同弱点(句子级粒度无法区分代码行边界)
  • KV cache 方法 (SnapKV/FastKV) 最接近全上下文基线,但 SALT 在多数类别上表现更好

Ministral-8B 结果 (Appendix D, Table 5): SALT 平均 45.42,同样在预处理方法中领先。

端到端效率 (Section 4.2, Figure 3)

在 16k–256k 上下文长度上的 walltime 和峰值 GPU 内存:

Walltime (s) at 20% budget (Table 7):

Method16k32k64k128k256k
SALT1.922.614.015.9911.51
EXIT5.8316.3060.60OOMOOM
RECOMP2.002.293.346.2711.95
FastKV1.732.354.2210.7734.29
SnapKV2.003.086.4318.1361.75

SALT 在预处理方法中 latency 最低(与 RECOMP 相当),且远低于 EXIT/CPC。在 KV cache 方法中,SALT 与 FastKV 相当,远低于 SnapKV/SentenceKV。

Peak GPU Memory (GB) at 20% budget (Table 8):

Method16k32k64k128k256k
SALT16.7017.9020.2023.3032.80
DuoAttention16.8017.8519.8523.8531.86
FastKV17.3719.3923.4331.5247.67
EXIT23.7045.4073.20OOMOOM

SALT 的峰值内存与 DuoAttention 相当(~31.86–32.80 GB),远低于需要完整 prefill 的方法(EXIT 在 64k 就 OOM)。

跨硬件平台可移植性 (Section 4.3, Table 2)

Peak GPU Memory (GB) of SALT across NVIDIA generations at 20% retention:

GPU32k64k128k256kScaling (256k/32k)
V100 (Volta, 2017)20.1022.5027.8740.222.00×
A100 (Ampere)18.3020.6524.1433.291.81×
H100 (Hopper)17.9020.2023.3032.801.83×
B200 (Blackwell)16.4117.8620.6725.721.57×

关键发现:V100(2017 年 Volta)成功处理 256k 上下文,证明 SALT 不依赖特定加速器库(如 FlashAttention),可在旧 GPU 上运行。

多轮交互成本 (Section 4.4, Table 6)

QuALITY @ 20% budget, 50 articles, 972 turns:

MethodTTFT (ms)Comp. (ms/turn)Acc.HARD Σ19\Sigma_{19} (s)
No compression195—0.7413.71
FastKV138—0.7392.62
RECOMP53460.6151.88
SALT38110.7260.91

SALT 在 19 轮对话中总成本仅 0.91s,比基线快 4×,比 RECOMP 快 2×,且准确率 (72.6%) 远高于 RECOMP (61.5%),接近无压缩基线 (74.1%)。

Needle-in-a-Haystack (NIAH, Section 4.5, Figure 6)

SALT 在所有上下文长度上保持 NIAH 准确率,与无压缩基线匹配。在最长的设置下,基线因 tokenized prompt 超出模型窗口而无法运行,但 SALT 的压缩 prompt 仍可容纳。

诊断性 ROUGE-L 实验 (Appendix A, Table 3)

在 20% token budget 下的诊断性摘要实验:

MethodGov.QMS.MNewsAvg.
Full context35.1425.7826.7329.22
Random29.6321.7322.0224.46
kNN30.2320.9522.5024.56
Centroid29.6420.4521.6223.90
SALT (Trie)32.7723.9924.0826.95

SALT 在所有数据集上均优于其他选择策略,证明 trie-based 主题分配优于标量排名。

Trie 规模与可扩展性 (Appendix C, Table 4)

Metric32k64k128k256k
Sentences1,7833,3657,73815,411
∥S∥\|\mathcal{S}\|1763887701,164
Trie nodes2,1633,5469,67920,582
Nodes/sentence1.211.051.251.34
Depth-1 branches1493276371,007
Median path depth2.22.12.12.4
Max path depth7.46.78.18.3

Trie 规模随上下文长度近线性增长,但路径深度与长度无关(中位数 2.1–2.4,最大 < 8.5)。256k 文档仅 ~20.6k 节点。

七、相关工作

Input-level Prompt Compression

  • 句子级: RECOMP (Xu et al. 2024), EXIT (Hwang et al. 2025), CPC (Liskavets et al. 2025), Sentinel (Zhang et al. 2025)
  • Token 级: LLMLingua (Jiang et al. 2023), LLMLingua-2 (Pan et al. 2024)
  • SALT 的区别:不在标量排名后添加多样性修正,而是在句子选择之前先在主题分支间分配预算

KV Cache / Attention-side Methods

  • SnapKV (Li et al. 2024), FastKV (Jo et al. 2025), DuoAttention (Xu et al. 2025), SentenceKV (Zhu et al. 2025), H2O (Zhang et al. 2023)
  • SALT 的区别:在 prefill 之前压缩输入,降低 prefill 计算和 KV cache 大小,与这些方法互补

Diversity-aware Retrieval & Summarization

  • MMR (Carbonell & Goldstein 1998), Submodular summarization (Lin & Bilmes 2011)
  • SALT 的区别:多样性不是候选选择后的后处理修正,而是首要的分配目标

八、总结

核心贡献

  1. 识别主题坍塌问题: 揭示标量排名压缩方法在严格预算下导致主导主题垄断预算的结构缺陷,将提取式压缩重构为先在文档衍生的词汇主题间分配预算、再进行句子选择
  2. 提出 SALT 框架: 模型无关的提取式压缩方法,使用 BGE encoder 提取关键词,构建 SF 有序的词缀树,在分支间分配预算后再选择句子
  3. 多模式支持: 摘要模式无条件遍历 trie,查询模式通过多锚点激活支持跨轮次对话,trie 可复用无需重新编码
  4. 精度-效率综合最优: 在 LongBench 上匹配 SOTA KV cache 技术的延迟和内存表现,同时在多轮对话中实现 4× 端到端加速

技术影响

SALT 将 prompt 压缩从”标量排名 + 后处理多样性”范式转向”主题结构感知 + 预算预分配”范式。其 trie 索引的跨轮次可复用特性使其特别适合 RAG 和多轮对话场景,其中同一文档会被反复查询。

局限性

  1. 代码任务表现弱: 句子级粒度无法可靠地区分代码单元边界,关键词提取对源代码中的标识符/运算符/结构 token 无效。这是所有预处理方法的共同弱点
  2. 20% 预算下限: 任务相关片段通常占输入的 5–20%,因此设 20% 为保守下限。Token 级 KV cache 方法可以压缩得更激进
  3. 英文专注: 当前仅评估英文数据集(LongBench English subset, QuALITY, PG19)
  4. BGE 依赖: 虽然仅需一次编码,但 BGE encoder 仍是额外模型依赖

九、参考资源