【开源推广】一个 token 节省器 CCA,类似于 RTK

linger 2026-06-21 22:42 1

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:



  • 我的帖子已经打上 开源推广 标签:

  • 我的开源项目完整开源,无未开源部分:

  • 我的开源项目已链接认可 LINUX DO 社区:

  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出:

  • 以上选择我承诺是永久有效的,接受社区和佬友监督:


以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出




总的来说


先给完全不了解的小伙伴介绍一下 RTK,它专门优化常用命令如 ls, find, git,让它们的输出更紧凑与高效(删除重复,聚合相似,删除冗余,过滤噪音)从而达到减少输入token的目的,由于上下更短,模型也会更“专注”,从而达到模型性能的进步。

在我日常 coding 的过程中,从 codex 的对话记录可以看到大量的低效输出(做大模型推理/训练有很多进度条,它们甚至占据长上下超过30%),我也非常希望有一个更通用的压缩器把这些专门为人类交互设计但是信息密度极低的信息给删除,恰巧看到有人发了个相关论文TACO,它通过自学习的压缩策略在多个测试集上完成了更低的 token 开销/更高的分数,所以我基于它的思想使用TerminalTraj(通用)和我历史的聊天记录(大模型)作为数据集做了离线的 token 压缩器 Command Compressor for Agent,希望各位佬友能点个 star 鼓励一下(现在仍处于实验阶段,希望各位佬友能多反馈一下)。


细节


训练总是简单的,难得是如何评估 CCA 的有效性,一开始想用 DeepSWE这个比较新潮的排行榜,有区分度,但是后面发现题目太难了,DeepSeek 大部分题目做不出来也就无从测试了,转用 Terminal 2.0,也比较有区分度(deepseek v4 flash 56.9/deepseek-v4-pro 67.9),不会像 SWE-verified 全部都是满分,能力升降可能不会对分数产生影响,同时也不太难以至于都做不出来。

claude code 和 codex 中只有 claude code 的 hook 支持劫持命令输出并替换,所以当前版本只支持 claude code 并且基于 claude code 做实验,模型则使用 deepseek-v4-pro,具体的实验报告参见1,总的来说就是有积极信号但是模型的不稳定性导致实验结果在当前测试样本下没有统计学意义,对大部分负面案例完全无法复测,因为可能第一遍压缩后开销更高第二遍就更低了,模型的决策轨迹对开销有着决定性影响,考虑到目前测试平均开销更高了,所以压缩整体而言是相对保守的,原始压缩率高达 60+%,经过人工调整现在在 10% 附近,更高的压缩率需要后续更广泛的数据集与实验。


case


目前对大模型领域的开发当前压缩机制应该问题不大,并且有着比较好的压缩率,提供一个压缩案例:




  • 原始 stdout token 估算: 3735




  • 压缩后输出 token 估算: 424




  • observation 估算压缩率: 88.73%




  • 压缩强度: xhigh




  • 命中的规则: ansi_strip + progress_strip + repeat_fold + progress_bar_strip + dl_training_static_keep + generic_long_progress_static_keep




压缩后:


[command-compressor]
status: compressed static output
command: CONDA_NO_PLUGINS=true conda run -n eagle-cu130 python /tmp/eagle_plain_test.py
exit_code: 0
raw_ref: /var/folders/29/t8zzlc5s2jsfhw388hmp6tm80000gn/T/cca-compare-raw-aO2AD9/20260621T123807Z-6a2f04f07fb0.log
fallback: use raw_ref only if a required fact is missing from retained output; do not read it for routine confirmation

[compressed] retained 17 of 133 output lines; omitted 116 low-signal lines.
[progress] omitted 113 progress/status lines before head/tail retention.
[progress samples retained]
first: Loading weights: 0%| | 0/291 [00:00<?, ?it/s]
first: Loading weights: 0%| | 1/291 [00:00<00:00, 12945.38it/s, Materializing param=lm_head.weight]
last: Loading weights: 100%|██████████| 291/291 [00:02<00:00, 124.82it/s, Materializing param=model.norm.weight]
last: Loading weights: 100%|██████████| 291/291 [00:02<00:00, 121.31it/s, Materializing param=model.norm.weight]
[retained output]
`torch_dtype` is deprecated! Use `dtype` instead!

The following generation flags are not valid and may be ignored: ['temperature', 'top_p']. Set `TRANSFORMERS_VERBOSITY=info` for more details.
Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.

new_len 64
ids_head [8586, 596, 279, 8308, 2082, 1473, 74694, 12958, 198, 755, 3770, 22616, 47146, 25, 1160, 11, 12447, 25, 528, 8]
text_repr 'Here\\'s the completed code:\
```python\
def below_threshold(lst: list, threshold: int) -> bool:\
\"\"\"Return True if all numbers in the list lst are below threshold threshold.\
Args:\
lst (list): A list of numbers.\
threshold (int): The threshold value.\
Returns'

"

原始输出:


`torch_dtype` is deprecated! Use `dtype` instead!

Loading weights: 0%| | 0/291 [00:00<?, ?it/s]
Loading weights: 0%| | 1/291 [00:00<00:00, 12945.38it/s, Materializing param=lm_head.weight]
Loading weights: 0%| | 1/291 [00:00<00:00, 6887.20it/s, Materializing param=lm_head.weight]
Loading weights: 1%| | 2/291 [00:00<00:19, 14.56it/s, Materializing param=lm_head.weight]
Loading weights: 1%| | 2/291 [00:00<00:19, 14.56it/s, Materializing param=model.embed_tokens.weight]
Loading weights: 1%| | 2/291 [00:00<00:19, 14.56it/s, Materializing param=model.embed_tokens.weight]
Loading weights: 1%| | 3/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.input_layernorm.weight]
Loading weights: 1%| | 3/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.input_layernorm.weight]
Loading weights: 1%|▏ | 4/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.down_proj.weight]
Loading weights: 1%|▏ | 4/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.down_proj.weight]
Loading weights: 2%|▏ | 5/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.gate_proj.weight]
Loading weights: 2%|▏ | 5/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.gate_proj.weight]
Loading weights: 2%|▏ | 6/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.up_proj.weight]
Loading weights: 2%|▏ | 6/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.mlp.up_proj.weight]
Loading weights: 2%|▏ | 7/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.post_attention_layernorm.weight]
Loading weights: 2%|▏ | 7/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.post_attention_layernorm.weight]
Loading weights: 3%|▎ | 8/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.k_proj.weight]
Loading weights: 3%|▎ | 8/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.k_proj.weight]
Loading weights: 3%|▎ | 9/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.o_proj.weight]
Loading weights: 3%|▎ | 9/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.o_proj.weight]
Loading weights: 3%|▎ | 10/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.q_proj.weight]
Loading weights: 3%|▎ | 10/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.q_proj.weight]
Loading weights: 4%|▍ | 11/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.v_proj.weight]
Loading weights: 4%|▍ | 11/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.0.self_attn.v_proj.weight]
Loading weights: 4%|▍ | 12/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.input_layernorm.weight]
Loading weights: 4%|▍ | 12/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.input_layernorm.weight]
Loading weights: 4%|▍ | 13/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.mlp.down_proj.weight]
Loading weights: 4%|▍ | 13/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.mlp.down_proj.weight]
Loading weights: 5%|▍ | 14/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.mlp.gate_proj.weight]
Loading weights: 5%|▍ | 14/291 [00:00<00:19, 14.56it/s, Materializing param=model.layers.1.mlp.gate_proj.weight]
Loading weights: 5%|▌ | 15/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.mlp.gate_proj.weight]
Loading weights: 5%|▌ | 15/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.mlp.up_proj.weight]
Loading weights: 5%|▌ | 15/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.mlp.up_proj.weight]
Loading weights: 5%|▌ | 16/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.post_attention_layernorm.weight]
Loading weights: 5%|▌ | 16/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.post_attention_layernorm.weight]
Loading weights: 6%|▌ | 17/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.k_proj.weight]
Loading weights: 6%|▌ | 17/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.k_proj.weight]
Loading weights: 6%|▌ | 18/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.o_proj.weight]
Loading weights: 6%|▌ | 18/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.o_proj.weight]
Loading weights: 7%|▋ | 19/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.q_proj.weight]
Loading weights: 7%|▋ | 19/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.q_proj.weight]
Loading weights: 7%|▋ | 20/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.v_proj.weight]
Loading weights: 7%|▋ | 20/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.1.self_attn.v_proj.weight]
Loading weights: 7%|▋ | 21/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.input_layernorm.weight]
Loading weights: 7%|▋ | 21/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.input_layernorm.weight]
Loading weights: 8%|▊ | 22/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.down_proj.weight]
Loading weights: 8%|▊ | 22/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.down_proj.weight]
Loading weights: 8%|▊ | 23/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.gate_proj.weight]
Loading weights: 8%|▊ | 23/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.gate_proj.weight]
Loading weights: 8%|▊ | 24/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.up_proj.weight]
Loading weights: 8%|▊ | 24/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.mlp.up_proj.weight]
Loading weights: 9%|▊ | 25/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.post_attention_layernorm.weight]
Loading weights: 9%|▊ | 25/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.post_attention_layernorm.weight]
Loading weights: 9%|▉ | 26/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.k_proj.weight]
Loading weights: 9%|▉ | 26/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.k_proj.weight]
Loading weights: 9%|▉ | 27/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.o_proj.weight]
Loading weights: 9%|▉ | 27/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.o_proj.weight]
Loading weights: 10%|▉ | 28/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.q_proj.weight]
Loading weights: 10%|▉ | 28/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.q_proj.weight]
Loading weights: 10%|▉ | 29/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.v_proj.weight]
Loading weights: 10%|▉ | 29/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.2.self_attn.v_proj.weight]
Loading weights: 10%|█ | 30/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.3.input_layernorm.weight]
Loading weights: 10%|█ | 30/291 [00:00<00:03, 69.08it/s, Materializing param=model.layers.3.input_layernorm.weight]
Loading weights: 11%|█ | 31/291 [00:00<00:03, 69.08it/s, M…17141 tokens truncated…ing param=model.layers.29.post_attention_layernorm.weight]
Loading weights: 92%|█████████▏| 268/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.post_attention_layernorm.weight]
Loading weights: 92%|█████████▏| 269/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.k_proj.weight]
Loading weights: 92%|█████████▏| 269/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.k_proj.weight]
Loading weights: 93%|█████████▎| 270/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.o_proj.weight]
Loading weights: 93%|█████████▎| 270/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.o_proj.weight]
Loading weights: 93%|█████████▎| 271/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.q_proj.weight]
Loading weights: 93%|█████████▎| 271/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.q_proj.weight]
Loading weights: 93%|█████████▎| 272/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.v_proj.weight]
Loading weights: 93%|█████████▎| 272/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.29.self_attn.v_proj.weight]
Loading weights: 94%|█████████▍| 273/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.30.input_layernorm.weight]
Loading weights: 94%|█████████▍| 273/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.30.input_layernorm.weight]
Loading weights: 94%|█████████▍| 274/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.30.mlp.down_proj.weight]
Loading weights: 94%|█████████▍| 274/291 [00:02<00:00, 126.58it/s, Materializing param=model.layers.30.mlp.down_proj.weight]
Loading weights: 95%|█████████▍| 275/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.mlp.down_proj.weight]
Loading weights: 95%|█████████▍| 275/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.mlp.gate_proj.weight]
Loading weights: 95%|█████████▍| 275/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.mlp.gate_proj.weight]
Loading weights: 95%|█████████▍| 276/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.mlp.up_proj.weight]
Loading weights: 95%|█████████▍| 276/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.mlp.up_proj.weight]
Loading weights: 95%|█████████▌| 277/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.post_attention_layernorm.weight]
Loading weights: 95%|█████████▌| 277/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.post_attention_layernorm.weight]
Loading weights: 96%|█████████▌| 278/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.k_proj.weight]
Loading weights: 96%|█████████▌| 278/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.k_proj.weight]
Loading weights: 96%|█████████▌| 279/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.o_proj.weight]
Loading weights: 96%|█████████▌| 279/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.o_proj.weight]
Loading weights: 96%|█████████▌| 280/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.q_proj.weight]
Loading weights: 96%|█████████▌| 280/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.q_proj.weight]
Loading weights: 97%|█████████▋| 281/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.v_proj.weight]
Loading weights: 97%|█████████▋| 281/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.30.self_attn.v_proj.weight]
Loading weights: 97%|█████████▋| 282/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.input_layernorm.weight]
Loading weights: 97%|█████████▋| 282/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.input_layernorm.weight]
Loading weights: 97%|█████████▋| 283/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.down_proj.weight]
Loading weights: 97%|█████████▋| 283/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.down_proj.weight]
Loading weights: 98%|█████████▊| 284/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.gate_proj.weight]
Loading weights: 98%|█████████▊| 284/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.gate_proj.weight]
Loading weights: 98%|█████████▊| 285/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.up_proj.weight]
Loading weights: 98%|█████████▊| 285/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.mlp.up_proj.weight]
Loading weights: 98%|█████████▊| 286/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.post_attention_layernorm.weight]
Loading weights: 98%|█████████▊| 286/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.post_attention_layernorm.weight]
Loading weights: 99%|█████████▊| 287/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.k_proj.weight]
Loading weights: 99%|█████████▊| 287/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.k_proj.weight]
Loading weights: 99%|█████████▉| 288/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.o_proj.weight]
Loading weights: 99%|█████████▉| 288/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.o_proj.weight]
Loading weights: 99%|█████████▉| 289/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.q_proj.weight]
Loading weights: 99%|█████████▉| 289/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.q_proj.weight]
Loading weights: 100%|█████████▉| 290/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.v_proj.weight]
Loading weights: 100%|█████████▉| 290/291 [00:02<00:00, 124.82it/s, Materializing param=model.layers.31.self_attn.v_proj.weight]
Loading weights: 100%|██████████| 291/291 [00:02<00:00, 124.82it/s, Materializing param=model.norm.weight]
Loading weights: 100%|██████████| 291/291 [00:02<00:00, 124.82it/s, Materializing param=model.norm.weight]
Loading weights: 100%|██████████| 291/291 [00:02<00:00, 121.31it/s, Materializing param=model.norm.weight]
The following generation flags are not valid and may be ignored: ['temperature', 'top_p']. Set `TRANSFORMERS_VERBOSITY=info` for more details.
Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.

new_len 64
ids_head [8586, 596, 279, 8308, 2082, 1473, 74694, 12958, 198, 755, 3770, 22616, 47146, 25, 1160, 11, 12447, 25, 528, 8]
text_repr 'Here\\'s the completed code:\
\
```python\
def below_threshold(lst: list, threshold: int) -> bool:\
\"\"\"Return True if all numbers in the list lst are below threshold threshold.\
\
Args:\
lst (list): A list of numbers.\
threshold (int): The threshold value.\
\
Returns'

"
最新回复 (8)
  • xunxun 06-21 22:45
    1

    和context mode那个差不多吗?

  • cumquat 06-21 22:48
    2

    那跟rtk 相比较的优势是啥呢,佬能介绍下吗

  • linger 楼主 06-21 22:50
    3

    context mode



    我先研究下这东西,感觉它的范围比我大很多

  • linger 楼主 06-21 22:55
    4

    和 RTK 是兼容的,RTK 是针对指定命令的优化,我是通过识别无效信息特征对所有命令的压缩,但是会对 RTK,阅读命令和短响应做豁免以免压缩重要信息

  • 重剑无锋 06-21 23:01
    5

    支持下,可以看出佬是有用科研思维在做这个项目的,看着就比较靠谱。站里我看到的开源项目好多都是拍脑袋觉得咋样咋样好然后让ai做个东西出来,一点评估实验数据都没有,点进去都是长篇累牍的今天更新了啥明天更新了啥,结果到最后我也不知道项目到底有啥用,实际效果咋样

  • Shilin Zhou 06-21 23:08
    6

    哇看起来非常不错呢!白墨决定明天试一下,到时候给个反馈~

  • linger 楼主 06-21 23:31
    8

    思路不一样吧,目的差不多,它是想要构建整个上下文,我只是想要压缩模型返回的输出,它是通过让模型写命令分析原始数据模型只接受分析结果而不接收原始数据,我是模型接收原始数据但是删去无效信息,它的理论压缩上限更高,但是对 Agent 流程的侵入性更强,对模型的要求也更高,感觉它有点类似于 subagent

  • xunxun 06-21 23:33
    9

    能一起用不 最大限度的各种压缩法

* 帖子来源Linux.do
返回