工作原理
sift 按内容类型分发到专用压缩器(detectContentType 自动判断)。无损优先:规则 JSON 数组先尝试 CSV-schema(至少节省 15%),其他 JSON minify 与日志 Drain 模板化按原门槛短路;不够再走有损路径,原文入 stash store。整个流程守住三条安全底线:
- 只在消息内压缩,绝不跨消息丢弃内容 —— 每条消息独立处理,tool_use / tool_result 配对受保护。
- 冻结前缀字节不动 ——
cache_control标记以下的消息是 prompt cache 锚点,压缩绝不触碰。 - 有损压缩必须可恢复 —— 原文进 stash store,输出留
«stash:HASH»标记,端到端无损。
压缩管线
请求 body
│ detectRequestFormat ──→ anthropic / chat_completions / responses
│ (floor = cache_control 冻结下界)
▼
逐消息 text block
│ detectContentType ──→ json_array / build_output / search_results /
│ git_diff / source_code / plain_text / html /
│ structured_config / tabular
│ mixed_content:同一 block 内分段路由;嵌入 JSON span 递归处理
▼
无损重排(JSON CSV-schema ≥15% / minify / LogTemplate-Drain)─→ 短路返回
▼
有损压缩(OffloadTransform)── 原文写 stash store,输出留 «stash:HASH»
▼
token 估算校验 ── 不达预期则回退原 block(blocksReverted)压缩器类型
| 内容类型 | 压缩器 | 策略 | 无损? |
|---|---|---|---|
| json_array | JsonReformatter + SmartCrusher | 同构记录转 CSV-schema,异构记录可分桶;任意文档深度的数组/字符串化 JSON 递归紧凑化,且 >256 B opaque 值可独立 stash | 优先无损,否则有损可恢复 |
| build_output | LogCompressor | 错误 / 堆栈 / 摘要行保留,重复 warning 模板折叠 | 有损(可恢复) |
| search_results | SearchCompressor | grep / ripgrep 输出抽稀,保留匹配上下文 | 有损(可恢复) |
| git_diff | DiffNoise + DiffCompressor | lockfile / 纯空白变化摘要,unified diff hunk 采样,改动行保留 | 有损(可恢复) |
| plain_text | TextCrusher | 按 query 相关性、位置、显著信息与近重复抑制抽取代表句段 | 有损(可恢复) |
| source_code | CodeCompressor | tree-sitter AST,8 语言;保留签名和结构,按引用、fan-out、公开约定及 query 相关性分配最多 5 行完整语句;Python docstring 默认保留首行 | 有损(可恢复) |
| html | HtmlExtractor | 正文转 Markdown,移除脚本/样式/导航/侧栏/广告/页脚 | 有损(可恢复) |
| structured_config | ConfigCompressor | YAML/TOML/INI 保留全部键值与顺序,安全卸载整行注释/空行;保护 block scalar 与多行字符串 | 有损(可恢复) |
| tabular | TabularCompressor | 严格解析 CSV/TSV/Markdown 表格列,桥接 CSV-schema;采用时保留全部记录 | 信息无损,原表可从 stash 恢复 |
共用机制
- 相关性 query:支持相关性筛选的压缩器优先保留相关内容;纯文本默认也使用 query 参与 BM25 相关性评分。
- 纯文本抽取:长文本按句子或段落切分,综合相关性、靠后位置、数字/错误/标识符等显著信息打分,并抑制近重复片段。输出只包含原文片段,被省略的内容通过 stash 恢复。
- 高熵凭据保护:不再因一个疑似凭据而跳过整块压缩。纯文本会钉住含凭据句段,统一出口还会逐次核对所有高熵候选仍在可见输出中;缺失任一个就拒绝该有损结果。
- 保密检测:归一化 Shannon 熵 ≥0.85 且长度 ≥20 的片段(API key、凭证)强制不可丢弃。
- 标签保护:自定义 XML 标签先占位保护、压缩后恢复,不会被压坏。
- 混合内容:同一 block 内含多种类型时分段路由;fenced code 与连续
file:line:搜索块优先于普通检测,分别交给源码/搜索压缩器,重组时保留 Markdown 围栏和前后正文;嵌入 JSON span 走递归平衡匹配。 - 日志执行上下文:首个非空行、可识别的命令回显及显式续行强制可见,不参与模板化、去重或普通日志行数预算竞争;省略提示不能代替命令本身。
- stash 恢复:一切有损输出的原文都在 stash store,输出留
«stash:HASH»标记;retrieve(key)取回全文,retrieveLines(key, startLine, lineCount)按行取回分片。 - 内联切片提示:本地落盘模式下,源码、搜索、日志以及显式保守模式的整行纯文本可在省略点写入 stash 绝对文件路径、省略行数和 1-based 起始行。默认纯文本按句子抽取,无法可靠映射成原始行范围,因此只使用末尾 stash 标记。搜索在解析时保留输入坐标,输出按原序回放;可验证的混合整行分段累加偏移。diff 会比较逐段路径提示与原生文件/hunk 汇总的体积,避免短上下文空隙反而放大输出,完整原文仍由末尾 stash 标记恢复。
走一个真实例子
假设一段工具输出(tool_result)里有 2000 行构建日志,sift 会这样处理它:
输入(节选):
$ npm run build
[vite] building for production...
✓ 1420 modules transformed.
warning: chunk size exceeds 500 kB (vendor.js)
warning: chunk size exceeds 500 kB (utils.js)
warning: chunk size exceeds 500 kB (ui.js) ← 同类 warning 重复 47 次
ERROR in src/api/client.ts:52
TS2339: Property 'retry' does not exist on type 'Client'.
处理过程:
1. detectContentType → build_output → 路由到 LogCompressor
2. 先试无损(Drain 模板化)→ 仍 >80%,进入有损
3. 优先保留错误 / 堆栈行;抽稀同类 warning
4. 原文写入 stash 文件,每段省略位置附行坐标,末尾留恢复标记
输出(节选):
$ npm run build
✓ 1420 modules transformed.
warning: chunk size exceeds 500 kB (vendor.js)
[... 46 lines omitted from file "/home/agent/.sift/stash/HASH", starting at line 5]
ERROR in src/api/client.ts:52
TS2339: Property 'retry' does not exist on type 'Client'.提示中的行号始终对应 stash 文件。需要局部原文时,Agent 可直接分片读文件;需要全文时,仍可使用末尾的 stash 标记恢复。有损抽稀可能省略低相关内容,不会把这种省略冒充无损重排。
设计取舍
- 纯逻辑核心:压缩逻辑只进
sift,node 桥零逻辑 —— 核心可复用(wasm、CLI 皆可接)。 - 无损优先短路:能无损解决就不引入信息损失;同构 CSV-schema 至少节省 15% 即采用。异构数组可按 2–8 个分类值输出
__buckets:字段,完整原文同步进入 stash;其他重排沿用 20% 门槛。 - 单元格独立卸载:JSON schema 中超过 256 B 的长字符串、HTML 或 base64 可替换为
<<stash:HASH>>[类型,大小];发布前逐项确认写入,任一失败则整次回退。末尾 marker 仍对应完整输入。 - 递归 JSON table:对象数组单元格和字符串中编码的 JSON 数组会递归生成带
_compaction、_schema、_total与_rows的 table 对象;只有整体达到收益门槛才采用。 - 信息饱和预算:JSON、搜索结果和日志共享 SimHash、bigram Kneedle 与 zlib 校验;重复内容保留更少代表,高多样性内容自动保留更多。
- query 感知 JSON 采样:“最近/最早”类 query 会移动位置锚点,中段按字段稀有度、结构和长度选择信息密集记录,普通查询词通过批量 BM25 保留高相关项。
- token 校验兜底:有损结果要过 token 估算校验,不达预期自动回退原 block。
- 缓存成本感知:policy 含缓存成本乘数,压缩决策考虑 prompt cache 经济学。
首页演示里可以逐类型查看真实输入与压缩输出的左右对比。