工具
SALT:用字典树做主题均衡的 LLM 长文档压缩器
开源工具 SALT 通过字典树映射文档主题并按主题分配预算,避免主流主题吞掉全部 token,从而在固定预算内保留更多样…
2026.07.21 · 周二约 4 分钟阅读
SALT 是一款面向大语言模型的长文档压缩器,目标是在固定 token 预算下,把一篇长文档精简成更短的纯文本提示词,再交给任意 LLM 处理,从而降低长输入带来的算力、显存与延迟开销。该项目目前正在寻找贡献者,作者在文档中描述了它的核心机制与下一步路线。
核心问题:主题塌缩
现有压缩器通常给每个句子打一个相关性分数,然后在预算内保留分数最高的句子,直到预算耗尽。这种策略在预算紧张时容易被文档的「主旋律」占满——主主题相关的句子拿走几乎所有配额,而次要但仍重要的观点被丢弃,这一现象被称为「主题塌缩(theme collapse)」。在多跳问答场景下,这种塌缩会导致模型虽然看到主实体的大量段落,却丢掉那个把主实体与第二实体串联起来的关键句子。
解决方案:字典树 + 主题预算分配
SALT 的做法分两步:
- 索引阶段(一次性):先用 BGE-small 的 [CLS] 注意力配合拐点截断提取每句关键词,再用主题显著性(SF,即保留某词的句子数,取上分位)把句子的关键词组织成一条 SF 顺序的路径,多条路径共同构成一棵以「主题」为分支的字典树(keyword trie)。
- 选择阶段(每次预算):在预算内用 CELF 懒贪心算法最大化主题覆盖——一个句子被选走后,其所在主题分支的边际价值随之下降,从而把预算「摊薄」到各个主题,避免被某一主题吃满。如果带查询,则用词面 + BGE 语义分数对字典树重新加权,但不需要重建。
因为主题映射只建一次,它可以在多轮对话中重复使用,无需每轮重读文档。
系统架构要点
SALT 的整体设计围绕 KV-cache 友好的提示词布局展开:
- 稳定前缀 + 追加尾部:系统提示、文件清单、attach@ 的完整文档构成稳定前缀,可复用 KV-cache;最近若干轮对话以追加方式写入尾部,按块压缩。
- 逐轮预算:每一轮从尾部未压缩区和新用户消息中各分得约 20% 的预算,通过跨轮覆盖、半衰期衰减、近重复过滤和后台摄入维持会话级字典树。
- 后端可选:默认走 Hugging Face 流式推理;可选启用 vLLM 与 APC(自动前缀缓存),或通过 vllm-serve 客户端接入远端服务,模型注册表负责把模型固定在 GPU 上。
- 文档摄入:通过 salt@ 文件与 salt --doc 入口接入文档,使用 pypdf 抽取文本,清洗页眉页脚等「家具」内容,跨浮动的段落重新拼接,表格与伪代码按标题归组,参考文献列表默认丢弃。
路线图
作者在「What is next」中列出了下一阶段重点:
- 提供 salt-mcp 入口,让 AI 客户端无需 REPL 即可把 SALT 当作对话记忆使用;
- 尾部感知的记忆选择,避免把预算花在模型刚看过不久的最近消息上;
- 增量压缩,复用上一轮的工作而不是每轮重建;
- 用真实会话数据决定哪些「默认关闭」的开关应该转默认开启;
- 围绕 --turns 丰富脚本化对话运行与评分工具,方便驱动和评估长对话。
对于关注长上下文成本与提示词工程的人来说,SALT 提供了一个可复用、KV-cache 友好的压缩路径;对于希望参与贡献的开发者,项目也明确给出了索引、选择、会话字典树与提示词组装等模块的蓝图。
