乐于分享
好东西不私藏

github 4w星工具 rtk:节约AI工具消耗token的原理及使用教程,能节约80%token

github 4w星工具 rtk:节约AI工具消耗token的原理及使用教程,能节约80%token

当你让AI帮你debug时,它先花了800个token读了一堆你根本不会看的垃圾输出。


用AI写代码的时候,你应该遇到过这种场景。

修一个简单bug,改着改着,AI开始胡言乱语。十分钟前你刚跟它说过的架构约束,它失忆了一样全忘了。只能耐着性子重新解释一遍,它才恢复正常。

AI没变蠢,模型也没降级,更不是什么”AI变懒了”的都市传说。原因一句话就能说清楚:上下文窗口被垃圾数据塞满了。


你在终端敲 git status。屏幕刷出十几行,扫一眼就知道:改了3个文件,1个没track。

AI不吃这一套。

它读到的是完整的原始输出,空行、提示文字、颜色转义码、中文翻译的冗余措辞,一个不落。同一个信息,你20个字能理解,它要吞2000个token。

再跑个测试。200行输出,190行绿油油的 passed。你只关心那10行红的,AI把200行全吃了,又干掉25000个token。

翻了一下实际数据。一次30分钟的中等规模编码会话,大概执行80多次shell命令:

操作
频次
原始token
RTK处理后
git status
10次
3,000
600
cat/read

 读文件
20次
40,000
12,000
grep/rg

 搜索
8次
16,000
3,200
git diff
5次
10,000
2,500
npm test
5次
25,000
2,500
ls/tree
10次
2,000
400
其他git操作
18次
7,000
1,220
合计 86次 118,000 23,900

一次对话,11.8万token。将近10万是垃圾。

按Claude Opus的API价格,光垃圾输出一次会话就烧1.5美元。重度使用,一个月多花几百块。但钱还不是最疼的。

最疼的是上下文污染。垃圾塞满窗口后,AI开始”遗忘”。你以为它在推敲你的架构,实际上它正逐字阅读 node_modules 里第47层调用栈,那些你一辈子不会点开看的东西。


这不是bug,是设计盲区

所有AI编程工具,Claude Code、Cursor、Copilot、Codex,套路一样:shell命令的原始输出原封不动丢进LLM上下文。

出发点没毛病,宁多勿少,万一漏了重要信息呢。但副作用极大。命令输出是给人看的,塞满了人类大脑自动过滤、AI照单全收的结构性噪音:

  • • 每次 npm install 吐出几百行依赖树,有用信息在最后三行
  • • ASCII表格、分割线、装饰性空行,你扫一眼跳过,AI逐token读
  • • 测试框架把同一类错误打几十遍,AI老老实实看几十遍
  • • git push 那串 “Enumerating objects… Counting objects… Compressing objects…” 你从来没读过,AI每次读完

打个比方:新来的实习生,你让他看看项目怎么样了,他把整个 /var/log 打印出来给你朗读。你只想知道服务还活着吗。


RTK:一个夹在中间干脏活的东西

RTK[1],全称 Rust Token Killer,就是来解决这件事的。

Rust写的CLI代理,单二进制文件,零外部依赖。工作方式粗暴:

没有RTK:Claude → 执行 git status → shell吐2000行 → Claude全吞有了RTK:Claude → 执行 rtk git status → RTK拦截 → 过滤压缩 → 吐200行 → Claude只吃200token

它不懂你的代码。它只认一条:不同命令有不同类型的噪音,按类型过滤。

  • • git status → 砍掉空行和啰嗦提示,只留文件路径和状态
  • • npm test → passed 全部折叠,只保留失败用例和错误摘要
  • • git push → 15行压成三个单词:”ok main”
  • • cargo build → 去掉进度条和中间产物,只剩报错和警告
  • • ls -la → 45行800token压到12行150token,树状呈现

举三个实际例子,差距一目了然。

git status,过滤前(~35行,约500 token):

On branch mainYour branch is up to date with &#x27;origin/main&#x27;.Changes to be committed:  (use "git restore --staged <file>..." to unstage)        modified:   src/components/Header.tsx        modified:   src/pages/dashboard/index.tsx        new file:   src/utils/formatDate.tsChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)        modified:   src/api/client.ts        modified:   package.jsonUntracked files:  (use "git add <file>..." to include in what will be committed)        src/hooks/useAuth.ts        src/types/user.ts

过滤后(~5行,约60 token):

Staged:  M src/components/Header.tsx  M src/pages/dashboard/index.tsx  A src/utils/formatDate.tsUnstaged:  M src/api/client.ts  M package.jsonUntracked:  src/hooks/useAuth.ts  src/types/user.ts

npm test,过滤前(200+行,约25,000 token):

PASS  src/components/Button.test.tsx  ✓ renders correctly (12ms)  ✓ handles click events (8ms)  ✓ applies variant classes (5ms)  ✓ shows loading state (3ms)  ... (180行 passed)FAIL  src/utils/validation.test.ts  ✕ email validation rejects invalid format (15ms)    Expected: false    Received: true  ✕ empty string should fail (2ms)    Expected: ValidationError    Received: undefinedTest Suites: 1 failed, 12 passed, 13 totalTests:       2 failed, 47 passed, 49 total

过滤后(~15行,约600 token):

FAIL  src/utils/validation.test.ts  ✕ email validation rejects invalid format    Expected: false, Received: true  ✕ empty string should fail    Expected: ValidationError, Received: undefinedSummary: 2 failed, 47 passed (13 suites)

git push,过滤前(约200 token):

Enumerating objects: 14, done.Counting objects: 100% (14/14), done.Delta compression using up to 8 threadsCompressing objects: 100% (8/8), done.Writing objects: 100% (8/8), 1.23 KiB | 1.23 MiB/s, done.Total 8 (delta 6), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (6/6), completed with 6 local objects.To github.com:user/repo.git   abc1234..def5678  main -> main

过滤后(~5 token):

ok main

80%的节省就是这么来的。没魔法,就一条:去噪,保信号。

集成方式更舒服。RTK通过Bash hook自动工作,你该怎么敲命令还怎么敲,hook在背后静默把 git status 重写成 rtk git status。AI工具完全无感,它拿到的就是压缩后的干净版本。不用改任何习惯,装好就生效。


压缩输出,AI会不会变蠢?

压缩了输出,会不会把关键信息也压没了?AI判断出错谁负责?

不会。RTK去掉的是噪音,不是信号。

你让同事看服务器状态,他要回你”CPU 70%,内存正常,三个服务都在跑”,还是甩你一份200行的 top 完整输出?你要前者。RTK就是把后者翻译成前者。人类靠这些就够了,AI一样可以。

RTK还留了保底。Tee模式,命令执行失败时,完整原始输出自动存到日志,AI随时能读。日常极致压缩,关键时刻不丢信息。

41.9k Star不是刷出来的。大量实际反馈指向同一个结论:RTK不会降低AI编程质量,反而因为上下文干净了,AI推理更聚焦,遗忘更少。你想想,看会议纪要和看逐字稿,哪个更容易抓住重点。


装一下,然后忘掉它

支持 macOS、Linux、WSL。一行搞定:

curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh# 或者 brew install rtk

根据你用的AI工具,选一条:

rtk init -g                    # Claude Codertk init -g --agent cursor     # Cursorrtk init -g --copilot          # GitHub Copilot

装完就忘掉。想看省了多少,敲 rtk gain,累计节省的token和钱列得明明白白。


收尾

AI编程工具越来越强,反而容易忽略最基础的事:效率不光看算得多快,还看读得够不够精准。

RTK不做什么惊天动地的事。在shell和AI中间加了一个过滤层,让AI只读它需要读的。0成本,延迟不到10ms,100多种命令支持。

上下文窗口就那么点。别浪费在读垃圾上。


项目地址:github.com/rtk-ai/rtk[1]

官方指南:rtk-ai.app/guide[2]

装完回来告诉我省了多少。

引用链接

[1] RTK: https://github.com/rtk-ai/rtk[2] rtk-ai.app/guide: https://www.rtk-ai.app/guide