学术论文 · 四川的梦科技有限公司 · 2026-07-27
摘要
大语言模型(LLM)的上下文窗口受限于固定容量,多轮对话中历史消息线性增长将迅速耗尽窗口。现有滑动窗口方案丢失早期关键信息,LLM 摘要方案费用高昂且不可复现,单一系统消息方案破坏前缀缓存。本文提出一种双消息体上下文压缩系统,通过"机械筛"(纯本地确定性转换)将对话历史压缩为两类独立消息体:biscuit(饼干消息,原地追加,保证前缀缓存高命中率)与 fx Grid(事实网格,AI 提取的不可变知识)。系统内置五种工具结果的"温柔/绝对"分类包装盒机制、三按钮渐进压缩控制器、以及自限收敛的 facts 提取流程。在 qqq-shell-v2 IDE 的 12 个月自举开发中,该系统将上下文总 token 数控制在 30K-60K 区间,月均 AI 费用降低 62%,前缀缓存命中率维持 85-90%。
1. 引言
大语言模型驱动的编程助手面临的核心挑战之一是上下文管理。一个典型的 AI 编程会话可能持续数小时、跨越数百轮对话,累积消息量远超模型上下文窗口(如 128K tokens)。若不做压缩,不仅费用线性增长,模型还会因上下文过长而出现"遗忘"现象。
现有方案存在以下不足:
| 方案 | 核心缺陷 |
|---|---|
| 滑动窗口 | 丢弃窗口外的关键信息(文件路径、架构决策) |
| LLM 摘要 | 额外 API 调用费用,摘要不可复现,两次压缩可能产生不同结果 |
| 单一系统消息 | 频繁修改系统消息破坏 LLM 前缀缓存,费用暴增 |
| 向量检索 | 需要额外 embedding 模型,检索精度依赖语义匹配质量 |
本文提出的双消息体上下文压缩系统(biscuit + fx Grid)在以下方面做出创新:
- 机械筛:纯本地确定性转换,零网络费用,零模型调用,结果 100% 可复现
- 双消息体分离:biscuit(高频追加,低频修改)与 fx Grid(低频追加,永不修改)物理分离,日常压缩不触碰 fx
- 五类绝对/十五类温柔包装盒:根据工具结果是否可复现,差异化处理
- 三按钮渐进压缩:absolut(纯本地)→ edit only(纯本地)→ only facts(AI 辅助),递进式降级
- 自限收敛:120K → 60K → 30K 拒绝,避免过度压缩致信息丢失
2. 系统架构
2.1 消息体模型
系统在 LLM 的 messages 数组中维护两条特殊的系统消息:
- _biscuit(饼干消息):role='system',存储经机械筛压缩的楼层摘要。对象永不变,仅原地追加内容。每层楼格式:
=== F{n} timestamp UTC+8 ===→ Q 摘要 → 工具包装盒 → A 摘要。 - _facts(事实网格):role='system',存储经 AI 提取的不可变知识事实。位于 biscuit 之后、当前楼层之前。仅在用户主动触发"only facts"压缩时追加内容。
二者的物理分离带来关键优势:日常自动压缩(每层楼完结触发)只修改 biscuit,fx 不受影响 → LLM 前缀缓存在 fx 之后的段落不受影响。
2.2 机械筛
机械筛(Mechanical Sieve)是系统的核心组件,执行纯本地确定性转换:
- 输入:conversation[] 消息数组
- 处理:
- 遍历每条消息,按角色分类为 Q(user)、A(assistant)、工具调用
- 对 15 种"温柔"工具(read/search/find/list/diag/edit/write/create/delete/revert/timeline_versions/diff_versions/fetch_webpage/search_web),仅保留一行头摘要
- 对 5 种"绝对"工具(run_command/generate_image/remove_background/analyze_image/get_vision_context),保留 ╔K...╚ 包裹的完整输出,但在 absolut 压缩时可剥离体部仅留头行
- 生成格式:
Q: user message (h=N)/📦 run_command: pwd/A: assistant reply (h=N)
- 输出:纯文本 biscuit 行
机械筛的确定性保证同一对话无论何时压缩,产生的结果完全一致。
2.3 三按钮压缩控制器
| 按钮 | 操作 | 费用 | 收益 |
|---|---|---|---|
| absolut | 剥离 ╔K...╚ 体部,保留头行 | 零(纯本地) | ~40-60% 体积缩减 |
| edit only | absolut 基础上仅保留 5 写工具头行 | 零(纯本地) | ~70-85% 体积缩减 |
| only facts | 前两步 → 按 F 切半 → h 原料 <32K 拒绝 → 建 _compressFloor → AI 提取 facts → 注入 fx Grid | ~¥0.30-1.50/次 | 120K → 60K → 30K 自限收敛 |
2.4 自限收敛机制
only facts 压缩必须满足自限条件:当前 biscuit 上半部分(h 原料)< 32K token 才允许进行。压缩后总 token 数下降至 ~60K。若再次压缩仍 >30K → 拒绝,防止过度压缩导致信息不可用。
3. 包装盒分类器
系统将 20 种工具按结果可复现性分为两类:
| 类别 | 成员 | 判断依据 | 处理方式 |
|---|---|---|---|
| 温柔盒 (15种) | read/search/find/list/diag/edit/write/create/delete/revert/timeline_versions/diff_versions/fetch_webpage/search_web | 结果可从磁盘重读、参数重跑或 sha256 引用复现 | biscuit 仅一行头,原文不进背包 |
| 绝对盒 (5种) | run_command/generate_image/remove_background/analyze_image/get_vision_context | 结果不可精确复现(终端输出/模型随机/云端处理) | ╔K...╚ 包裹完整输出,16K 硬帽 |
绝对盒的剥离正则:/\n╔K\n[\s\S]*?\n╚(?=\n|$)/g。前瞻 (?=\n|$) 不吞共享 \n,防止相邻盒子 9.5% 漏网。
4. 前缀缓存策略
biscuit 消息对象的不可变性是缓存策略的核心。由于 biscuit 仅追加新行到 content 尾部,LLM 提供商的前缀缓存(prefix cache)机制可以复用 biscuit 之前所有 token 的计算结果。实测数据显示:
- 常见路径(新楼层追加):前缀缓存命中率 ~85-90%
- 罕见路径(旧楼层插入导致重排):命中率下降但仍 >50%
相比之下,若将压缩结果直接替换系统消息,每次都会破坏缓存 → 命中率 ~0%。
5. 实验评估
5.1 费用分析
在 qqq-shell-v2 的 12 个月自举开发中:
| 指标 | 无压缩 | 仅 absolut | absolut + only facts |
|---|---|---|---|
| 月均 AI 费用 | ¥850 | ¥420 (-51%) | ¥320 (-62%) |
| 平均上下文 token | 85K | 45K | 35K |
| 前缀缓存命中率 | N/A | 88% | 85% |
| 信息丢失事件 | 0 | 0 | 2 (因自限收敛拒绝) |
5.2 压缩质量
随机抽取 50 个楼层人工评估:
- absolut 压缩后,95% 的楼层关键信息(文件路径、变量名、架构决策)完整保留
- only facts 压缩后,88% 的楼层关键信息可恢复
- 信息丢失主要集中在"绝对盒"体部被剥离的场景(如长时间 run_command 输出中的关键错误日志)
6. 结论
双消息体上下文压缩系统通过机械筛 + 双消息体分离 + 三按钮渐进压缩,在 LLM 编程助手场景中实现了低费用、可复现、高缓存命中的上下文管理。系统的确定性压缩保证可审计性,自限收敛机制防止过度压缩。未来工作方向包括:基于重要度排序的智能压缩策略、跨楼层语义去重、以及与 embedding 检索的混合方案。
参考文献
[1] Brown, T. et al. "Language Models are Few-Shot Learners." NeurIPS 2020. [2] Touvron, H. et al. "LLaMA: Open and Efficient Foundation Language Models." 2023. [3] Beltagy, I. et al. "Longformer: The Long-Document Transformer." 2020. [4] qqq-shell-v2 架构文档 §56 上下文压缩, 2026.