起源
AI 对话越长,上下文越臃肿。50 层楼之后,每次 API 调用光上下文就要 150K+ tokens——其中 70% 是过期的终端输出、重复的文件内容、再也用不到的搜索摘要。
早期方案尝试让 AI 自己压缩上下文(V3-V10),结果:AI 语义压缩质量不稳定、JSON 输出格式经常出错、thinking 过程吃掉大量预算、压缩结果污染前缀缓存。结论:大键入 + AI 语义压缩 = 死路。
V11 转向纯本地机械筛——每层楼完结时自动把对话摘要成 Q/A/工具行,零网络零费用。V12 修复了 splice 导致的前缀缓存断裂。V13 引入双包装盒体系(温柔盒 + 绝对盒)和阀值压缩。V14 修复了 biscuit 重排序带来的缓存全断 bug。V15 引入三按钮压缩体系 + fx 记忆区域。V16 强制 biscuit 唯一性(去重→先合并孤儿内容再删除),修复 Z 消息阻断 _findDynamicMsg 搜索的 bug。
背包结构(小白视角)
每次你按回车发送消息 = 一层"楼floor"。一楼可能包含多次 AI 调用(房子house)和多次工具调用(房间room)。
楼层完结后,qqqide 自动把你的对话机械压缩成"压缩饼干":
=== F1 2026-07-18 13:26:08 UTC+8 ===
Q: 你查查数据库里那个用户激活没有?
[A → run_command] ssh q@47 psql ... 2318c
[A → read_file] /server-app/foo.js L:1-50/200
A: 已激活,用户 8615802858204 在 2026-07-17 完成激活。
- Q: = 你说的原话
- [A → xxx] = AI 调用了什么工具,结果摘要
- ╔K...╚ = "绝对包装盒"——无法从磁盘复现的工具输出(如终端命令结果),用盒子包起来
- A: = AI 的最终回复
这里滴"原话"不含子弹按钮:子弹注入的是你的消息附件,压缩时剥掉原文、不进饼干。
饼干逐层追加,永不重写旧内容。这意味着前 20 层楼的饼干在 API 缓存中一字不变 → 前缀缓存命中率 ~90%。
背包管理窗口(点「上下文」→「管理」进入)
背包格子排序:Z → fx → 压缩饼干 → 当前楼层。
格子列表
| 英文(UI 显示) | 分组 | 含义 |
|---|---|---|
| Server Guard | 注入 | 服务端甲壳提示词(同图解) |
| Tools Definition (N tools) | 注入 | 工具定义 JSON(N = 工具数) |
| msg[0] · Client Rules | 客户端规则 | Z 消息全文 |
| 压缩 · 事实 (fx) | 压缩上下文 | fx 消息本体(only facts 提取的事实清单,永远 1 条、增量追加) |
| 压缩饼干 (biscuit) | 压缩上下文 | 饼干消息本体 |
| User #N | 用户消息 | 用户消息(N = 序号) |
| AI text #N | AI 回复 | AI 纯文本回复 |
| AI tool_calls #N | AI 回复 | AI 工具调用轮(文本 + tool_calls 合并展示) |
| AI Error #N | 错误 | 错误回复 |
| Tool Result #N | 工具结果 | 工具执行结果 |
| 压缩 · 事实 × N | 压缩上下文 | fx 摘要格(N = 事实条数,每条一行) |
| 压缩饼干 × N floors | 压缩上下文 | 饼干摘要格(N 楼层 + 总字符数) |
| System #N (动态) | 压缩上下文 / 系统消息 | 防御性分支,当前通常为空(biscuit / fx 均有独立标签,不再落入此格) |
顶栏统计
| 统计 | 含义 |
|---|---|
| 格子 | 当前格子总数 |
| 字符 | 全部格子字符数总和 |
| 估算 | 字符 ÷ 2.5 的 token 估算 |
| API | 最近一次 API 调用的精确 prompt_tokens(无调用时显示 --) |
三按钮速查(按钮上数字 = 点它可回收的 token 收益)
| 按钮 | 动作 | 数字含义 |
|---|---|---|
| absolut | 剥离全部绝对包装盒体部(╔K…╚),保留头行 | 剥离后能省多少 tokens(本地立即执行) |
| edit only | absolut + 只保留 5 种写工具头行 | 同上 |
| only facts | 压缩 + 调 AI 提取事实注入 fx | 同上(收益 < 32K tokens 拒绝执行;点击后 aq 显示压缩前重量,动画仅播一次) |
压缩动画(点击压缩按钮后上下两根进度条)
上面那根 = 压缩前整个上下文背包,下面那根 = 压缩后整个背包。
“整个背包” = 服务端甲壳 + 工具定义 + 客户端规则 + fx 事实 + 压缩饼干 + 当前楼层——与右下角压缩按钮上滴数字、背包图解滴 Local sum 同口径。你滴任何地方看到滴“背包大小”都是同一个值,不存在两套数字。
格子角色颜色(便于快速辨认)
| 颜色 | 角色 |
|---|---|
| 橙 | user(用户消息) |
| 青 | assistant(AI 回复) |
| 红 | tool(工具结果) |
| 紫 | system(系统消息) |
| 品红 | guard(服务端甲壳) |
| 黄 | toolsdef(工具定义) |
三个压缩按钮怎么用
打开方式:AI 面板右下角点「上下文」→「管理」→ 打开 X 区背包标签页。
背包页面有三个按钮,按性价比从高到低排列:
1. absolut — 剔除绝对包装盒
做什么:把 ╔K...╚ 盒子里的内容删掉(通常是终端输出),但保留盒子头行(命令本身)和一切温柔包装盒。
如果没有:饼干里塞满过期 SQL 输出、build log、40KB 的 JSON 响应——这些内容 5 层楼之后就没用了,但永远留在饼干里,每次 API 调用都带着。
什么时候用:只要感觉重量上来了,可以放心常用;如果在个人偏好里设置了自动压缩阀值,当能剔除滴 absolut 尺寸超过阀值,也会被自动调用 absolut 剔除。
2. edit only — 仅保留写操作
做什么:在 absolut 基础上,进一步去掉一切读操作(read_file、search_text、find_files…)的头行,只保留真正改了文件的操作(edit_file、write_file、create_file、delete_file、revert_file)。
如果没有:饼干里有几百行 [A → read_file] /foo.js L:60-70/200——这些信息对后续对话几乎没用(AI 可以重新读)。
什么时候用:长对话后期,饼干臃肿但你只关心「改了什么文件」。
3. only facts — AI 提取关键事实
做什么:在前两者基础上,把对话原文砍掉一半(只保留最近的一半),让 AI(tier 4)从老的那一半里提取关键 facts,存为 fx(记忆区域)。之后 AI 既能看到最近的完整对话,又能快速回顾早期的关键事实。
原料真相:喂给 AI 的既不是「大A+大Q 原样集合」,也不是「整个压缩饼干原样」,而是饼干前半段的骨架行——剥离绝对盒体部、删除温柔盒正文行后,只剩 Q:/A:/楼层分隔/写工具头行的精简文本。详见底部「only facts」章节。
如果没有:100+ 层楼的对话,AI 很容易"遗忘"早期做出的关键决策。
什么时候用:长对话(50+ 层楼),或者跨多个相关问题的对话。
进一步掰开看: 三种压缩分别失去什么、保留什么
absolut — 剔除绝对包装盒体部
失去:5 种不可复现工具的完整输出体——终端命令的输出内容、AI 生成的图片描述/风格信息、图片视觉分析的全部结果、抠图结果。
保留:
- 上述 5 种工具的头行(工具名 + 参数 + 结果长度摘要)——AI 仍然知道「调了什么工具、传了什么参数、输出有多长」
- 全部 15 种温柔包装盒(读/写/搜索/网络等)——毫发无损
- Q/A/楼层分隔等全部对话结构
有影响的场景:
- 你在上一个楼层看到一份巨大 JSON 响应(比如
psql查表结构),下一层想让 AI 引用其中的某个字段名 —— absolut 后 AI 看不到那份 JSON 了 - 你让 AI 分析一张图片 → AI 调用 analyze_image → 下一层想让 AI 基于之前的视觉分析继续工作 —— absolut 后分析结果没了
没影响的场景:命令本身还在,AI 可以重跑重新获取输出。
edit only — 仅保留写操作
在 absolut 基础上,再额外失去:
- 全部 15 种温柔工具的头行(read_file、search_text、fetch_webpage 等),包括它们的路径和结果摘要
- 5 种绝对工具的头行(run_command 等 "[A → xxx]" 那一行)
保留:
- 5 种写工具的头行(edit_file、write_file、create_file、delete_file、revert_file)——包括改了哪个文件、改了多少行、SHA256(基于自研timeline体系)
- Q/A/楼层分隔行
用户视角:整个对话的「调查过程」消失——AI 不知道之前读过哪些文件、搜过什么关键词、跑过什么命令 (读消失),AI 只知道最后改了什么文件(写保留)。你在编辑框里送出滴一切提问、AI 滴回复(一切结论)保留。
only facts — AI 提取关键事实
在 edit only 基础上,再额外失去:
- 一半的对话原文, 老的一半对话被砍掉(会尽量按字符数对半分),只剩 AI 提取的 facts。如果 AI 提取遗漏了关键信息,它就永远丢失了。这是不可逆的。
- 此外 only facts 需要一次 tier-4 AI 调用,正常计费。
保留:
- 最近一半对话的:大Q(用户编辑框送出滴原文)、5 种写工具的头行、大A(AI 滴最终回复即一切结论)。
- 如果压缩成功则新得到 AI 提取的 facts(任务级记忆区域 fx)
自限机制:h 原料(老的一半)必须 ≥32K tokens(≈ 80K 字符,字符 ÷ 2.5)才准许压缩。这意味着当一次压缩的收益小于 32K tokens 时,将不再能进行下一次“only facts” 压缩(自然收敛,无需额外规则),须知,每一次 only facts 压缩,都会导致背包重排序,显著降低当次请求(通常是一间 house)滴缓存命中率,那也正是自限机制存在滴原因之一。
进阶:底层设计原理
背包物理结构
[0] Z (铁律/index of 架构、skill等) — 永不压缩,100% 缓存命中
[1] fx (facts 记忆区域) — 手动触发,跨楼层持久
[2] 压缩饼干 (biscuit) — 逐层追加,前缀缓存命中
[3+] 当前楼层原始消息 — 唯一变化的部分
注:仅旧格式 quest(全量快照)restore 后可能翻转为 Z → biscuit → fx;新持久化模型(all.json 只存楼层自身消息)无此问题。
机械筛规则
| 原始消息 | 饼干格式 |
|---|---|
| user | Q: [全量内容](剥离文件注入块和 CURRENT TIME) |
| assistant 纯文本 | A: [全量内容] |
| assistant 含 tool_calls | 先 A: 行,再 [A → xxx] file1, file2 |
| tool 返回(可复现) | 摘要追加到上一工具行 |
| tool 返回(不可复现) | 摘要 + ╔K...╚ 完整输出 |
| system | [S] [全量内容] |
双包装盒体系
温柔包装盒(15 个工具 — 可复现):read_file、edit_file、write_file、create_file、delete_file、search_text、search_content、find_files、list_files、get_diagnostics、fetch_webpage、search_web、timeline_versions、diff_versions、revert_file。
结果可从磁盘重读或 sha256 引用复现 → 饼干仅保留一行摘要。
绝对包装盒(5 个工具 — 不可复现):run_command、generate_image、remove_background、analyze_image、get_vision_context。
结果不可精确复现(终端输出、模型随机、云端处理)→ ╔K...╚ 包裹,4K 硬帽。
三个按钮在底层干了什么
absolut(纯本地,零网络零费用)
遍历 biscuitLines,对每一层的 biscuit 文本执行正则 /\n╔K\n[\s\S]*?\n╚(?=\n|$)/g 精准剥离绝对盒体部。头行(如 [A → run_command] "ssh q@47 psql" 2318c)和温柔盒毫发无损。
替换 biscuit 消息 content 为剥离后的文本 → 持久化 ctx.json → 完成。
edit only(纯本地,零网络零费用)
在 absolut 基础上,逐行过滤 biscuit 文本。保留规则:
=== F... ===楼层分隔行Q:/A:行[S]系统行- 含 edit_file / write_file / create_file / delete_file / revert_file 的工具头行保留
其余工具头行(read_file、search_text、run_command 等 15 种)全部丢弃。╔K...╚ 体部已在 absolut 阶段剥离。
only facts(本地 + AI 调用,正常计费)
原料真相:既不是「大A+大Q 的原样集合」,也不是「整个压缩饼干原样」——是饼干前半段的骨架行。三级处理链:
| 步骤 | 操作 | 结果 |
|---|---|---|
| 取料 | 找 biscuit 消息全文(含所有 === F{n} 块,即各楼层大 Q + 大 A 的压缩形态) | ✅ 大 Q、大 A 都在(Q:/A: 行) |
| ① absolut 过滤 | 正则剥离 ╔K…╚ 体部 | ❌ 绝对包装盒体部全剥 |
| ② edit only 行过滤 | 逐行只留 Q:/A:/=== F/[S]/空行/5 个写工具头行 | ❌ 温柔盒工具结果正文、全部读工具头行、绝对盒头行(run_command 等)全删 |
| ③ 切半 | 按 === F 分块 → 累计字符过半 → 取前半段 _hText | 后半段留在饼干(新基座) |
_hText 写盘 _qqq/bullet/ → 📎 附件管线 → tier-4 noTools 提取 30-40 条事实(子弹目录只是内部载体,与子弹按钮功能无关)。
原料构成:✅ 大 Q、大 A(骨架行)· ✅ 5 个写工具头行 · ❌ 绝对盒体部 · ❌ 温柔盒正文 · ❌ fx(独立 _facts 消息,不在饼干里 → AI 看不到已有事实,这是「提取必然重复」的根因,见已知边界)
完整流程:
- 依次执行 absolut + edit only → 得到精简饼干
- 按
=== F分块、累计字符过半切半:下半保留为 r(新饼干基座),上半作为 h 原料 - h 原料 < 32K tokens(≈ 80K 字符,字符 ÷ 2.5)→ 拒绝(收益不足,自然收敛)
- h 原料写入子弹文件 → 建一层新楼(tier 4,noTools,外观与正常楼层一致,账单照常计费)
- AI 从 h 原料提取 facts → A 回复为 facts 列表(★ 2026-08-10 增量提取:提示词带上已有 fx 清单作参照,只提取新增/变化事实,已存在的不重复输出;首次提取(无 fx)才全量提取 30-40 条)
- 楼层完结 → 重建流程检测到这是提取楼层 → 楼层整体跳过(不进饼干),提取的 facts 注入 fx 区(Z 之后、biscuit 之前);原文按楼层起点全量截断灭迹(防残留漏进饼干)
- fx 消息格式:
═══ FACTS 2026-07-18 14:06:40 UTC+8 ═══\n- fact 1\n- fact 2 - 多次 only facts → 增量块
═══ FACTS timestamp ═══追加到同一 fx 消息尾部(全背包仅 1 条 fx 消息,去重保尾;增量模式下新块只含新增/变化事实,不再堆叠全量副本)
已知边界与已修复项(2026-08-10 核验)
- ✅ 多次提取不再重复(已修复):增量提取——提示词带上已有 fx 清单作参照(「已有事实清单 + 新对话历史」),只输出新增/变化的事实,无新增时回复「无新增事实」;此前实测中连续两次提取结果首行雷同的情况已不可能复现。
- ✅ UI 摘要格顺序(已修复):
压缩 · 事实 × N格移至 biscuit 摘要格之前,对齐真实背包容序 Z → fx → biscuit;fx 消息在背包窗口有专用标签「压缩 · 事实 (fx)」。 - ✅ fx 重启后仍在对话(已修复):重启恢复时从持久化记录重建 fx 消息(Z 后、biscuit 前定序),事实上下文不会丢失。
- ✅ 历史数据污染(已清理):早前版本曾把普通楼层内容误写入事实区、并把全量事实误压进饼干,已一次性清理(有备份可恢复);现版本机制不再产生此类污染。
- ✅ fx 内部冗余(增量模式根治):新提取只追加增量块,不再堆叠多份全量重叠内容;历史遗留冗余已一次性收敛,提示词声明「可能含历史重复,以内容为准」双保险。
缓存经济学
- Z 消息永不变化 → 100% 缓存命中
- 饼干逐层尾部追加,旧行字节不变 → 前缀缓存命中(仅最后一行新)
- fx 仅在手动 only facts 时变化 → 几乎 100% 命中
- 每层实际计费 ~2-4K tokens(仅饼干末行 + 用户新消息)
阀值压缩(自动)
每间 house 完结后检查饼干里 absolut 可回收的收益(╔K...╚ 体部总量,即按钮一上显示的数字),超过阈值(默认 100K tokens,齿轮设置中可调)→ 自动剥离绝对包装盒体部(同 absolut 按钮)。防止大楼层把饼干撑爆。