RTK 的节省到底省在哪:Bash 输出压缩、Token 估算方法与成本换算全解析
【免费下载链接】rtkCLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies项目地址: https://gitcode.com/GitHub_Trending/rtk4/rtk
本文基于 RTK 官方文档docs/guide/resources/savings-explained.md展开,讲清 RTK 宣称的"最高 90% 节省"这个数字到底度量的是什么:它只压缩 Agent 读到的 shell 命令输出字节,绝不承诺等比例降低账单;同时结合 tracking 模块源码 与 never-worse 保护逻辑,剖析"为什么 token 数只是估算值、而百分比却是可信的"这一关键设计,帮助读者正确读取rtk gain数据并把它放进成本模型中。
RTK 只改变一件事:shell 命令回传的字节数
RTK 的定位是一个 CLI 代理(proxy),它横插在 Agent 与命令行之间。当 Agent 执行一条 shell 命令时,流程如下:
agent runs a shell command | v RTK filters the output | v agent reads the result也就是:Agent 发起命令 → RTK 负责实际执行 → RTK 压缩(filter)输出 → Agent 读到的是压缩后的版本。RTK 唯一修改的对象是shell 命令发回来的那部分字节。官方文档特别强调:RTK 报告的所有 "savings",度量单位都是这些字节,而不是 token、更不是美元。
从源码结构看,每条受支持的命令执行完成后都会经过统一的记账入口:TimedExecution会分别对"原始命令输出"和"RTK 过滤后输出"做 token 估算并写入记录(见 src/core/tracking.rs 中的TimedExecution::track)。此外还有一层安全网:never-worse 保护 保证"过滤结果如果比原始输出还长,就直接返回原始输出",即 RTK 永远不会让 Agent 读到更多 token:
// src/core/guard.rs pub fn never_worse<'a>(raw: &'a str, filtered: &'a str) -> &'a str { if estimate_tokens(filtered) > estimate_tokens(raw) { raw } else { filtered } }对应测试 src/core/guard.rs 覆盖了"过滤后更小则保留过滤结果""过滤后更大则回退 raw""打平保留过滤结果"等边界,并有集成测试 tests/guard_integration_test.rs 佐证。
节省传导链:从字节到账单,每一步都在稀释
官方文档用一棵树把"输出压缩"与"成本"的关系摆得很清楚:
Cost ├─ Input tokens │ ├─ Bash output <- the only part RTK filters │ ├─ Your prompt │ ├─ System prompt │ └─ Conversation history └─ Output tokens <- what the model writes这里有两个关键的"稀释"层级:
- Bash 输出只是输入 token 的一个组成部分,与你的 prompt、system prompt、对话历史并列。压缩 90% 的 bash 输出,对整体输入 token 的贡献要打个折;
- 输入 token 也只是账单的一部分,账单还要计入模型生成的输出 token。
因此,一条命令"输出字节少 90%",绝不等于"这个会话便宜了 90%"。这正是 RTK 选择报告"bash 输出压缩率"而不是直接报"成本节省"的原因——bash 输出是 RTK 唯一能控制的变量,其余部分取决于你的提示词、所选模型、Agent 回写多少内容、以及每次调用时回放了多少对话历史。
为什么 token 数只是估算:bytes / 4的设计取舍
rtk gain展示的所有 token 数都来自一个极简估算器:token ≈ ceil(字节数 / 4),对应源码为 src/core/tracking.rs 中的estimate_tokens:
// src/core/tracking.rs /// Estimate token count from text using ~4 chars = 1 token heuristic. pub fn estimate_tokens(text: &str) -> usize { // ~4 chars per token on average (text.len() as f64 / 4.0).ceil() as usize }单元测试 test_estimate_tokens 固化了该行为的边界语义:空串为 0,4 字符为 1 token,5 字符向上取整为 2 token。
RTK刻意不内置真正的 tokenizer。官方文档给出了取舍理由:
- 内嵌 tokenizer 会增加启动时间开销;
- 每个模型的 tokenizer 都不同,要么得为每个模型内置一份,要么做按会话的模型查询,而 RTK 都不打算实现(它追求单一 Rust 二进制、零依赖)。
这个取舍带来一个值得理解的结论,也是本文的核心之一:
- 百分比是可靠的:原始输出和过滤后输出使用的是同一个估算器,比值(Save%)不受估算器绝对精度影响——即使"1 token = 4 字符"本身有偏差,对两边同时近似,比例依然成立。它本质上是一个字节压缩比。
- 绝对 token 数只是近似:
rtk gain里出现的Input tokens: 45,230只能当作量级参考,不会与服务商账单上的 token 数对得上,不应被当作发票行项。
如果需要精确数字,官方建议的做法是:把原始输出与过滤后输出分别送入你所用模型自己的 tokenizer 计数。
如何正确读取rtk gain的四个列
rtk gain是查看节省数据的仪表盘(完整用法见 Token Savings Analytics 文档)。其列的真实含义如下,务必按此理解:
| 列 | 实际含义 |
|---|---|
| Input | 原始命令输出估算的 token 数(bytes / 4) |
| Output | 过滤后输出估算的 token 数(bytes / 4) |
| Saved | Input − Output,单位为估算 token |
| Save% | bash 输出字节的压缩率 |
四列之中,Save% 才是有意义的那个数字:它是一个字节比值,作为比值是准确的。Input / Output / Saved 三列都继承自bytes / 4估算,只能用于横向比较趋势(比如哪一类命令贡献了最多的可压缩空间)。
数据落盘方面,src/core/constants.rs 定义了数据目录与库名(rtk/history.db),保留期常量DEFAULT_HISTORY_DAYS为 90 天,自动清理;记录通过 TimedExecution::track 写入 SQLite,由Tracker提供 summary / daily / weekly / monthly 聚合查询。
RTK 不减少的部分(明确边界)
官方文档明确列出 RTK不会减少的 token 来源,这三条是理解 RTK 能力边界的关键:
- 输出 token:模型写回的内容,RTK 完全不碰;
- 你的 prompt、system prompt、对话历史:这些输入 token RTK 没有可见性;
- 没有匹配到 filter 的命令:这类命令走透传(passthrough),输出原样到达 LLM,在追踪系统中记为0% 节省,可用
rtk gain --history查看最近 10 条记录核实。
从源码结构看,透传命令的记账同样严谨:TimedExecution::track_passthrough 只记录耗时、token 计 0,避免透传命令"稀释"节省统计——0% 的命令是显式追踪到的事实,而不是遗漏。
实战解读:把 Save% 放进成本模型
结合以上机制,读 RTK 数据时建议遵循三条原则:
- 把 Save% 当作字节压缩比来用:例如 What RTK Optimizes 中给出的
cargo test约 90%、jest/vitest94–99%、git status75–93% 等数字,度量口径都是 bash 输出字节; - 绝对 token 数只用于趋势与量级:估算公式
tokens = ceil(chars / 4)对中文、代码、JSON 等不同内容的真实 token 密度差异很大,跨命令比较绝对值没有意义; - 精确核算时用真实 tokenizer:将 raw 与 filtered 输出分别过一遍所用模型的 tokenizer 得到精确值,这是官方文档给出的唯一"精确路径"。
rtk gain还支持--daily/--weekly/--monthly/--all时间维度拆解,以及--format json/--format csv导出,便于把"字节压缩比"接入自己的成本模型做进一步换算(详见 docs/guide/analytics/gain.md)。
小结
RTK 的节省叙事可以浓缩为一句话:它只度量、也只控制 bash 输出字节。90% 的上限数字是字节压缩比,经由"输入 token → 账单"两层稀释后,对总成本的实际影响取决于你的命令输出在整体输入 token 中占多大比重。得益于同一估算器同时作用于 raw 与 filtered 两侧,Save% 的比值可信;而绝对 token 数因bytes / 4启发式(无真实 tokenizer)只能是近似值。理解这两点,就能把rtk gain的数字准确放进自己的 token 与成本模型里,而不是误读为账单折扣。
相关文档:
- What RTK Optimizes —— 各命令的 bash 输出压缩率明细
- Token Savings Analytics ——
rtk gain仪表盘完整用法 - 源码追踪系统 —— 追踪机制说明
【免费下载链接】rtkCLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies项目地址: https://gitcode.com/GitHub_Trending/rtk4/rtk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考