关于 llmtrim
llmtrim 是一个本地代理,用于压缩发送给 LLM API 的请求,以降低 token 成本,同时保持回复内容不变。它面向使用 Claude Code、Codex、Cursor 或自研应用的开发者,也可作为 CLI、MCP 服务或库使用。
主要功能
- 01本地代理压缩 LLM API 请求
- 02压缩工具输出、日志、diff 与长上下文
- 03可通过 llmtrim setup 快速安装
- 04提供 CLI、MCP 服务与多语言库
- 05支持 Claude Code 的 /sub 订阅路由
适用场景
- 01降低 Claude Code 等编码 Agent 的 token 开销
- 02压缩构建日志与 JSON 数据后再发送给模型
- 03在自研应用中以库的形式进行请求压缩
MCP 相关
该项目提供 MCP 服务形式,可将压缩能力以原生工具的形式提供给 MCP 客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| request | any | 是 | 提供方请求正文(OpenAI、Anthropic 或 Google 格式)。可以是 JSON 对象本身,也可以是该对象的 JSON 字符串;整个正文都会被压缩,并以相同格式返回。 |
| provider | string|null | 否 | 提供方提示:`openai`、`anthropic` 或 `google`。留空时根据请求形状检测。 |
详细介绍
llmtrim
本地代理,用于压缩大模型 API 流量,降低费用。答案不变,账单更少。
输入 −31% · 输出 −74% · 往返成本 −66% · 112 个实时 A/B 案例 · 每次调用约 5 ms · 无需加载模型
在使用 Claude Code?安装后还可通过 CLIProxyAPI 使用 /sub。
代理 · CLI · MCP · 库(Python · Ruby · Swift · Kotlin · JS/WASM)
功能介绍 • 安装 • 日常使用 • 实际效果 • 兼容对象 • Claude Code • 数据 • 配置 • CLI 和库
功能介绍
你运行 Claude Code、Codex、Cursor 或自己的应用。每一轮中,工具都会发送一个大型请求:系统提示词、工具、历史记录、原始命令输出。所有这些内容都会计费,包括对模型没有帮助的部分。
一份包含两个错误的 200 行构建日志。每次调用都重新发送的工具架构。包含数百行近乎相同数据的 JSON。这些冗余内容仍然会计费。
llmtrim 在你的机器上作为本地代理运行,精简冗余内容,并转发更小的请求。回复保持不变。你仍然使用相同的工具并得到相同的答案,但花费更少。
before: your tool ───── full request ─────▶ OpenAI / Anthropic / …
◀──────── reply ──────────
after: your tool ──▶ llmtrim ──smaller──▶ OpenAI / Anthropic / …
(on your machine)
◀──────── reply ────────── (same answer)
压缩不会增加账单,也不会破坏请求;最坏的情况是没有节省。所有操作都在本地运行,不会向我们发送任何内容。查看实际效果 →
对于 Claude Code,同一次安装还会配置 /sub,将会话路由到另一个订阅。详情 →
快速开始
npm install -g @llmtrim/cli@latest && llmtrim setup
# open a new terminal, then keep working
llmtrim status
就这样。setup 会启动本地代理并配置你的 shell。如果已安装 Claude Code,它还会启用 /sub。你无需为此单独安装。
| 你要做什么 | 运行命令 |
|---|---|
| 首次安装 | llmtrim setup |
| 更新版本 | llmtrim update(然后在运行 npm/brew/cargo 后运行 llmtrim ensure) |
| 遇到问题 | llmtrim ensure · llmtrim doctor --fix · 或在 status 中按 f |
任何支持
HTTPS_PROXY的工具都可使用(Claude Code、Codex、Cursor、Aider、你的 SDK)。GitHub Copilot 不支持(证书固定)。完整列表 →
其他安装方式(Homebrew、curl、Scoop、Cargo、Docker)
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/fkiene/llmtrim/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/fkiene/llmtrim/main/install.ps1 | iex
# Package managers
brew install fkiene/tap/llmtrim
cargo binstall llmtrim
scoop install llmtrim
docker run -d -p 43117:43117 -v llmtrim-state:/data ghcr.io/fkiene/llmtrim
完整选项:INSTALL.md。
桌面托盘(菜单栏/系统托盘)
菜单栏/系统托盘弹出窗口,显示相同的节省数据。已捆绑在 Homebrew、Scoop 和 npm 中;setup 可启用登录时启动。运行 llmtrim tray 打开。在 Linux 桌面上,交互式 ensure 可从最新版本获取托盘二进制文件(需要 libwebkit2gtk-4.1 和 libayatana-appindicator3)。
安全吗?
采用与 mitmproxy 相同的技术,但仅针对大模型 API 主机。setup 会更改三项设置;llmtrim uninstall 会还原这三项设置:
~/.llmtrim/中的私有 CA(名称受限;无法拦截你的银行或电子邮件)- Shell 环境变量:
HTTPS_PROXY+ CA 信任 - 登录服务:登录时启动守护进程
不会存储 API 密钥(会转发工具的身份验证信息)。提示词不会写入磁盘;仅记录匿名令牌计数。默认情况下,可恢复的工具结果会在有界的守护进程 RAM 中保留五小时,并在重启后消失。完整威胁模型:SECURITY.md。
llmtrim ca
openssl x509 -in ~/.llmtrim/ca.pem -noout -text | grep -A3 "Name Constraints"
日常使用
llmtrim status # savings + health (aliases: monitor, gain)
llmtrim update # new release, restart daemon, refresh integrations
llmtrim ensure # match the recommended install state on this machine
| 场景 | 命令 |
|---|---|
| 查看节省情况 | llmtrim status |
升级 npm / brew / cargo 后 | llmtrim ensure(或在 status 中按 f) |
| 诊断 | llmtrim doctor · 使用 doctor --fix 修复 |
| 暂停/恢复代理 | llmtrim stop · llmtrim start |
| 强制让一个会话通过 llmtrim | llmtrim wrap claude |
| 完全卸载 | llmtrim uninstall |
运行 setup、update 或 ensure 后,llmtrim 管理的 Claude Code /sub 会与二进制文件保持同步。
时间序列:llmtrim status --daily · --weekly · --monthly · --json · --csv。
实际效果
一个 Agent 执行了构建。工具返回了 58 行,其中 2 行是错误。原本 58 行都会计费。
4,662 个字符 → 978 个字符(−79%)。错误内容保持原样。重复的 INFO 行折叠为模板加上对应值(当取值范围规则时无损)。
# before (noise + signal)
[2026-06-13T10:02:00Z] INFO compiling module core::worker::task_0 (incremental)
… 28 more near-identical INFO lines …
[2026-06-13T10:02:31Z] ERROR src/worker/pool.rs:214: mismatched types: expected `usize`, found `i64`
… 25 more INFO lines …
[2026-06-13T10:03:01Z] ERROR src/net/conn.rs:88: cannot borrow `buf` as mutable more than once
[2026-06-13T10:03:02Z] INFO build failed, 2 errors
# after (errors verbatim; INFO folded losslessly)
[{}] INFO compiling module core::worker::task_{} (incremental) [×30: (10:02:00Z..10:02:29Z step 1s; 0..29)]
[2026-06-13T10:02:31Z] ERROR src/worker/pool.rs:214: mismatched types: expected `usize`, found `i64`
[{}] INFO compiling module core::net::conn_{} (incremental) [×25: 10:02:32Z..10:02:56Z; 0..24]
[2026-06-13T10:03:01Z] ERROR src/net/conn.rs:88: cannot borrow `buf` as mutable more than once
[2026-06-13T10:03:02Z] INFO build failed, 2 errors
试试处理你自己的请求正文:
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai
日志折叠只是其中一个阶段。其他阶段会针对不同类型的浪费发挥作用:
| 浪费 | 处理方式 |
|---|---|
| 构建日志、差异、grep 输出 | 保留错误 / 更改 / 匹配项;折叠其余内容 |
| 粘贴的大段上下文 | 保留与问题相关的内容块 |
| 源代码 | 保留有用的函数体;其余内容 → 函数签名 |
| 每轮重复发送的工具架构 | 精简 + 保持缓存前缀稳定 |
| 超大的 JSON 数组 | 转为紧凑表格(TOON)或抽样 |
| 冗长的模型回复 | 在安全的情况下要求输出更简洁 |
重要
压缩不会增加你的账单,也不会导致请求失败。每个阶段都会使用提供商的实际分词器重新测量;如果没有节省 token,就会撤销压缩。如果提供商拒绝压缩后的正文,则会重新发送原文。最坏的情况是没有任何节省。
现有的提示词缓存前缀(cache_control)不会被改动。默认关闭首次接收时可恢复的内容整形(llmtrim recall r_…);实时区域的工具输出窗口化仍会运行,且同一工具再次运行时会完整发送。若要跳过某条命令的整形(原样输出 stdout,包括终端尾部内容),请设置 toolout_passthrough = ["*gpt.sh*"],或在命令前添加 LLMTRIM_TOOL_OUTPUT=passthrough。以 LLMTRIM_KEEP: 开头的行在窗口化时会保留,即使其余内容被截断也不例外。
全部 10 种压缩器
各阶段按节省量排序运行。cache_control 标记之后的内容不会被改写。
| 阶段 | 功能 | 运行时机 |
|---|---|---|
| tool-output | 先进行无损模板折叠,再将日志 · 差异 · grep · 输出转储窗口化为错误 / 更改 / 匹配项;选择启用的首次接收召回功能可通过 llmtrim recall 恢复被省略的缓存边界结果 | 工具结果 |
| cache discipline | 标记并稳定不变的前缀(对工具 / 架构排序 · 设置 OpenAI prompt_cache_key),以保持缓存 | 工具 |
| lexical retrieval | 使用 RM3 反馈进行 BM25+ 排序 · 使用 TextTiling 划分主题 · 按预算选择不冗余的内容;保护问题内容 | 长上下文 |
| skeletonization | tree-sitter 保留相关函数体,其余内容精简为函数签名(14 种语言) | 代码 |
| serialize + hygiene | 精简 JSON,将记录数组编码为 TOON 或 CSV,并进行 Unicode 规范化 | 始终运行 · 无损 |
| json sample | 对超大的记录数组进行抽样:首尾项 + 离群项 + 偏向查询的多样化样本 | 大型 JSON |
| dedup | 合并重复和近似重复的行(仅限散文) | 始终运行 |
| output control | 简洁指令 · Chain-of-Draft · token 预算 · 原生 JSON 架构 · 防止过度思考的指令(量化推理) · Agent 循环精简指令 | 自动 |
| tool layer | 静态工具选择 + 精简描述 | 工具 |
| multimodal | 将图像缩小到提供商的分辨率上限 | 图像 |
默认情况下,auto 仅在各阶段能带来收益时启用。safe 仅启用无损功能。配置 →
Claude Code
当 ~/.claude 存在时,setup、update 和 ensure 会配置 /sub(以及路由的子 Agent)。无需单独安装。
| 功能 | 用途 |
|---|---|
/sub | 按窗口设置:/sub on [optional:codex|kimi|grok] · /sub off · /sub status |
订阅重路由(`sub`)(自愿启用;可能与提供商的服务条款冲突)
通过 CLIProxyAPI 而非 Anthropic 运行 Claude Code,或在当前路径失败时将其用作备用跳转。通过 CLIProxyAPI 的 TUI 登录;请自行判断这是否符合提供商的服务条款。
llmtrim sub on # install + start CLIProxyAPI, enable redirect
llmtrim sub on grok # write opus/sonnet/haiku/fable → that CLI's models
llmtrim sub auth # CLIProxyAPI TUI — sign in
llmtrim sub models # official + live sidecar models
llmtrim sub map on opus grok-4.6
llmtrim sub chain anthropic,codex
llmtrim sub mode fallback # try hops in order when the current one fails
llmtrim sub status
llmtrim sub off
交互操作:llmtrim status → 选项卡 4 Sub — Off / Always / Fallback,然后按 e 编辑
输入→输出映射(输入内容以搜索 CLIProxyAPI 的目录;
按 s 保存,按 a 添加,按 d 删除)。按 [ ] 切换备用路径的首个跳转。
使用 CLIProxyAPI 时,llmtrim update 也会更新 CLIProxyAPI。将 LLMTRIM_CLIPROXY_URL 指向
现有实例即可跳过托管侧车。
仅路由委派的 Claude Code 子 Agent,同时保持父窗口不变:
llmtrim agents install # also installed/refreshed by setup, update, and ensure
然后自然地提出请求:Implement it using a Grok subagent、use Terra,或 review this with GPT Terra。
仅指定提供商的 Agent 会通过配置的映射保留子请求的 Claude 层级;指定明确模型的 Agent 会固定使用该提供商模型。请求级 Agent 仅对自己的请求覆盖窗口 /sub 和全局策略。llmtrim agents uninstall 只会移除 llmtrim 所有的 Agent 文件,并记录退出选择,以便 ensure 不再恢复这些文件。
仅限此窗口(由 ensure 安装;包含子 Agent;/clear 后仍有效):
/sub on [optional:cli-or-model] # gemini, codex, claude, grok, kimi, vertex, qwen, copilot, or a model id
/sub off
/sub status
侧车:~/.llmtrim/cliproxy/(二进制文件和配置)。认证信息:如果存在 ~/.cli-proxy-api,则使用它;否则使用
~/.llmtrim/cliproxy/auth。环境变量:LLMTRIM_SUB、LLMTRIM_SUB_MODE、LLMTRIM_CLIPROXY_URL、
LLMTRIM_CLIPROXY_KEY。
**Anthropic /login 与 claude.ai 连接器:**全局 sub 处于 always 模式时,llmtrim 默认会将一个虚拟的 ANTHROPIC_AUTH_TOKEN 写入 ~/.claude/settings.json(思路与 claude-code-proxy 的
ANTHROPIC_AUTH_TOKEN=unused 相同),这样 Claude Code 就不需要有效的 Anthropic OAuth 会话。
MITM 会剥离该虚拟令牌,并将 /v1/messages 请求发送到 CLIProxyAPI;非 messages 的
Anthropic 探测请求则在本地响应,因此不会返回 401 Invalid bearer token。
Claude Code 会将任何 API 密钥认证视为优先于 claude.ai 登录,因此设置虚拟令牌时claude.ai 连接器会被禁用。这是预期行为。若要保留连接器(并在会话过期时接受 Anthropic /login):
llmtrim sub anthropic-login keep # connectors OK; Anthropic login required
llmtrim sub anthropic-login skip # default: no Anthropic /login; connectors off
执行 sub on / sub off / sub mode / sub anthropic-login 后,请重启 Claude Code,使设置更改生效。备用路径首个跳转为“当前使用的路径”时,仍需要有效的 Anthropic 登录。
将其用作 CLI、MCP 或库
使用相同的引擎,无需代理。不会额外调用模型;压缩在进程内运行。
| 语言 | 安装 |
|---|---|
| Rust | cargo add llmtrim-core |
| Python | pip install llmtrim |
| Ruby | gem install llmtrim |
| Kotlin | implementation("io.github.fkiene:llmtrim:0.13.7") |
| Swift | SwiftPM fkiene/llmtrim-swift ≥ 0.1.8 |
| JS / TS | @llmtrim/js(WASM) |
CLI 管道
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai > out.json
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim send --provider openai
Rust · Python · JS
use llmtrim_core::{compress, ir::ProviderKind};
let out = compress(request_json, Some(ProviderKind::OpenAi))?;
import llmtrim
out = llmtrim.compress(request_json, llmtrim.Provider.OPEN_AI, "aggressive")
import { compress } from "@llmtrim/js";
const out = compress(requestJson, "openai", "aggressive");
绑定和 WASM 说明:crates/llmtrim-uniffi · crates/llmtrim-wasm。
MCP 服务
llmtrim mcp install # Claude Code
llmtrim mcp install --print # paste into any client
{
"mcpServers": {
"llmtrim": { "command": "llmtrim", "args": ["mcp"] }
}
}
工具:llmtrim_compress、llmtrim_compress_text、llmtrim_stats(与 status 使用相同的记录)。
任何支持 HTTPS_PROXY 和通过环境变量提供 CA 的工具:
| 工具 | 兼容 | 备注 |
|---|---|---|
| Claude Code | ✅ | 提示词缓存折扣保持不变 |
| Codex CLI | ✅ | |
| Gemini CLI | ✅ | |
| Cursor (IDE)、Cline、Roo、Kilo Code | ✅ | VS Code 扩展;为 Node 宿主进程设置 NODE_EXTRA_CA_CERTS |
| Goose、OpenCode、Crush、Mux、Forge、OpenClaw、Pi/OMP | ✅ | 使用标准提供商主机的 CLI Agent |
| Qwen Code、Grok CLI、Kimi Code、Mistral Vibe | ✅ | 提供商主机已收录在 llm_providers 注册表中,开箱即可拦截 |
Aider,以及其他支持 HTTPS_PROXY 的 CLI | ✅ | |
| Hermes、Droid(BYOK 模式) | ✅ | 仅在配置了直接提供商密钥时才能拦截;Hermes 请参阅指南 |
| 你自己的应用 / SDK | ✅ | 或直接调用 CLI / 库 |
| GitHub Copilot | ❌ | 证书固定会阻止拦截 |
| Warp、Devin | ❌ | 提供商调用在服务端进行;本地代理无法看到 |
| Cursor Agent、Kiro | ❌ | 经由供应商网关路由,而非标准提供商主机 |
无需代理:任何 MCP 客户端都可以将 llmtrim 作为工具调用(llmtrim mcp install),或使用 CLI / 库。
提供商来自 llm_providers 注册表(OpenAI、Anthropic、Google、DeepSeek、Mistral、xAI、Moonshot、Zhipu、Qwen、OpenRouter 等),并随注册表更新。非大模型连接会原样通过。
配置
默认设置适用于大多数流量。auto 会检查每个请求,并根据其形态选择压缩器(工具 → agent,代码 → code,长篇问答 → rag,其他情况 → aggressive)。
通过 LLMTRIM_PRESET=<name> 或在 $XDG_CONFIG_HOME/llmtrim/config.toml 中设置 preset = "<name>" 来覆盖:
| 预设 | 适用场景 |
|---|---|
auto (默认) | 让 llmtrim 按请求选择 |
safe | 仅无损输入 |
aggressive | 最大限度压缩,并进行质量门控 |
高级预设
auto 会根据每个请求的形态组合这些预设,因此大多数用户无需直接设置。了解自己的流量并希望跳过形态检测时,可选择其中一个:
| 预设 | 用途 |
|---|---|
agent | 工具调用循环:仅在首轮保留工具块,让提示词缓存保持热状态 |
code | 编码轮次:将代码骨架化并缩小体积,压缩粘贴的日志和差异 |
rag | 带问题的长上下文:按句子级检索 |
cache | 在多次调用中重复使用的固定前缀 |
reasoning | 数学和分步推理工作负载 |
frugal | 单独启用 Agent 循环节省指令,便于进行干净的基准测试 |
单项标志覆盖(高级用户)
每个阶段都可通过配置标志单独调整;preset 的优先级高于各项标志。完整表格较长;请参阅 config.rs 中的字段列表,或运行 llmtrim compress --help。最实用的选项:
| 字段 | 默认值 | 含义 |
|---|---|---|
toolout | 在 agent/aggressive 中启用 | 工具输出压缩(日志 / 差异 / grep / 转储) |
retrieve | false | 长上下文的词汇检索(有损) |
skeletonize | false | 将不相关的函数体替换为函数签名 |
serialize | true | 将记录数组编码为 TOON / CSV |
json_crush | 在 agent/aggressive 中启用 | 对超大的记录数组进行采样 |
output_control | false | 简洁输出指令 + 上限 |
output_anti_overthink | 在 aggressive/rag/code/agent 中启用 | 针对量化推理流量的直接作答指令 |
output_frugal_tools | 在 agent 中启用 | 引导 Agent 循环减少工具调用轮次(批量处理,不要重复) |
cache | false | cache_control 分界点(无损) |
dedup | true | 合并重复行(无损) |
quality_gate | true | 若有损删减导致与查询相关的覆盖率下降过多,则撤销删减 |
环境变量:LLMTRIM_PRESET(预设)、LLMTRIM_CONFIG(配置文件路径)。
运行时设置(环境变量或配置文件)
这些设置与压缩相互独立。每项设置都会优先读取环境变量,其次读取配置文件,因此可根据需要选择;两者同时存在时,以环境变量为准。
| 环境变量 | 配置键 | 含义 |
|---|---|---|
LLMTRIM_EXTRA_HOSTS | extra_hosts | 要拦截的额外精确 LLM-API 主机(环境变量中以逗号分隔,文件中使用数组),例如自行托管的 OpenAI 兼容端点 |
LLMTRIM_EXCLUDE_PROVIDERS | exclude_providers | 跳过压缩的线路格式:openai / anthropic / google(例如设为 anthropic,可让 Claude Code 不受影响);范围较宽,会涵盖该格式对应的所有主机 |
LLMTRIM_EXCLUDE_HOSTS | exclude_hosts | 跳过压缩的精确主机名(例如 openrouter.ai);范围精确,同一格式的其他主机仍会压缩 |
LLMTRIM_UPSTREAM_PROXY | upstream_proxy | 通过另一个代理路由出站流量(见下文) |
LLMTRIM_DB_PATH | db_path | 账本位置 |
LLMTRIM_CAPTURE_DIR | capture_dir | 前后对比 QA 捕获目录 |
LLMTRIM_CAPTURE_MAX_MB | capture_max_mb | 捕获语料库大小上限(0 表示禁用) |
LLMTRIM_FIRST_ARRIVAL_RECALL | first_arrival_recall | 可恢复的首次到达工具输出整形(默认 false;设为 true 可允许 llmtrim recall 获取缓存边界结果) |
LLMTRIM_TOOL_OUTPUT | toolout_passthrough | 对匹配的命令跳过工具输出压缩:passthrough(全部)或命令 glob(*gpt.sh*);也会识别命令赋值或结果行。LLMTRIM_KEEP: 行始终保留 |
LLMTRIM_FIRST_ARRIVAL_RECALL_TTL_SECS | first_arrival_recall_ttl_secs | 内存中原始结果的保留时间(默认 18,000 秒 / 5 小时) |
LLMTRIM_BIND | bind | 监听 IP(默认回环地址;容器中使用 0.0.0.0) |
LLMTRIM_BREAKDOWN_WINDOW | breakdown_window | 成本明细的上下文窗口覆盖值 |
LLMTRIM_RETENTION_DAYS | retention_days | 账本按天保留的时长 |
LLMTRIM_NO_UPDATE_CHECK | no_update_check | 禁用后台更新检查 |
extra_hosts 条目必须是精确主机名(llm.acme.com,不能是单独的 acme.com):每个条目都会扩大受名称约束的 MITM CA 的适用范围,CA 会在下次启动时自动重新生成以涵盖这些主机。
Claude Code 选项(订阅流量重路由)见 Claude Code。
上游代理(企业出站流量或串联本地工具)
export LLMTRIM_UPSTREAM_PROXY=http://host:port
# or with auth: http://user:pass@host:port (redacted in logs)
出站调用使用 CONNECT 和经过验证的 TLS;上游只能看到加密流量。
不允许将流量环回到 llmtrim 自身的监听地址。请将变量设置在守护进程的
启动环境中(launchd / systemd),而非仅设置在交互式 shell 中。配置文件中的密钥
以明文存储。
在其他端口上运行的配套工具(例如 headroom)可以正常使用。
每个用例都会发送两次,一次使用原始请求,一次使用压缩后的请求,然后按实际费率为两个答案评分并计费。在 112 个用例中同时衡量成本和质量,而非估算:
| 原始 | 压缩后 | 节省 | |
|---|---|---|---|
| 输入 token | 71,031 | 49,062 | −31% |
| 输出 token | 25,843 | 6,628 | −74% |
| 往返成本 | $0.0365 | $0.0126 | −66% |
| 答案质量 | 78.9% | 82.2% | 未测得质量下降 |
token 削减幅度与模型无关(输入 −31%,输出 −74%)。金额节省幅度取决于模型输出与输入的价格比:此处为 −66%,按 GPT-4o 费率预计为 −57%,按 Claude Sonnet 费率预计为 −59%。代理只压缩新增内容,不会改写由缓存控制的前缀,因此提示词缓存折扣仍然有效。
标准基准测试中保持准确性
在标准学术测试套件上使用保守的形状匹配预设(qwen3-next-80b,配对 95% CI)进行相同的 A/B 测试。质量分数对比原始请求与压缩请求。GSM8K 的数据来自上方的 frontier(n=12);其余三个是读者常用来比较的指定基准(每个 n=20):
| 基准 | 任务 | 评分器 | 输入节省 | 质量(原始 → 压缩) | 保持率 |
|---|---|---|---|---|---|
| GSM8K | 小学数学 | numeric-exact | −47%¹ | 100% → 92% | −8pp |
| TruthfulQA (MC1) | 事实准确性 | choice-exact | 0% | 75% → 75% | +0.0±0.0pp |
| SQuAD v2 | 抽取式 QA | token-F1 / EM | 11% | 84% → 84% | −0.0±15.2pp |
| BFCL (live_multiple) | 函数调用 | tool-call match | 33% | 95% → 95% | +0.0±15.2pp |
三项在压缩时没有质量损失;GSM8K 是唯一有所下降的项目:
- BFCL 会移除查询用不到的工具架构(每次调用的候选项有 2 到 37 个)。
- SQuAD v2 对不可回答的问题仍能给出正确答案。
- TruthfulQA 的事实准确率完全不变:其约 75-token 的提示词几乎全是答案文本,因此安全预设找不到可削减的内容。
- GSM8K 以准确率降低 −8pp 换来成本降低 −71%,因此启用其推理预设前,应先针对具体工作负载进行测量。¹其输入量之所以变为负值,是因为该预设加入了一条 Chain-of-Draft 指令,其收益体现在输出侧(见 frontier 表)。
证据和一行复现命令(指定基准快照):
make -C crates/llmtrim-cli/bench data
(cd crates/llmtrim-cli && cargo run -q --features live -- bench quality \
--corpus bench/data/squad2.jsonl --preset rag \
--model qwen/qwen3-next-80b-a3b-instruct --route "" --n 20)
各语料的测试方法、frontier 和置信区间:crates/llmtrim-cli/bench/README.md。复现方法:
make -C crates/llmtrim-cli/bench data # pull real corpora (gsm8k, humaneval, dolly, hotpotqa, …)
(cd crates/llmtrim-cli && cargo run -q --features live -- bench suite) # live A/B across all corpora (needs OPENROUTER_API_KEY)
(cd crates/llmtrim-cli/bench/scripts && PYTHONPATH=. python3 -m benchkit.tools.chart) # regenerate the chart + table
对比
每种工具都会压缩请求中的一个部分。llmtrim 会压缩输入和输出,同时保留缓存前缀不变以维持提示词缓存稳定性;它评估的是答案能否经受压缩,而不是移除了多少 token。下方两项指标均使用 o200k_base 编码器,并可通过此仓库复现。
| llmtrim | Headroom | RTK | caveman | |
|---|---|---|---|---|
| 压缩内容 | 输入 · 输出 | 输入 | 工具/CLI 输出 | 模型输出 |
| 跳过无效转换 | ✅ | ❌ | ❌ | 不适用 |
| 单个静态二进制文件 | ✅ | Python + 模型 | ✅ | ✅ |
输入
通过实时 A/B 测试,将输入缩减率(确定性)与回答质量并列比较。质量是相对于 llmtrim 在各工具对比设置下的下降幅度(✅ 持平,具有统计意义的平手;❌ 显著更低),因此缩减率很高但标记为 ❌,意味着工具是以牺牲回答质量换取 token 的:
| 工具 | 缩减率 | 相对 llmtrim 的质量 | 开销 |
|---|---|---|---|
llmtrim auto | 25% | ✅ 参考 | ~5 ms |
llmtrim aggressive | 28% | ✅ 参考 | ~5 ms |
| Headroom(启用 ML) | 24% | ✅ 持平 | ~0.9 s |
| leanctx / LLMLingua-2 | 52-81% | ❌ 低 18% | ~6 s |
| entroly | 80-89% | ❌ 低 42% | <1 ms |
开销是每次调用压缩耗时的中位数(Python 墙钟时间,不是同等条件下的 CPU 时间):此处 Headroom 和 leanctx 在 CPU 上运行 ML(在 GPU 上会更快),此外还需一次性加载模型(约 3 s 和 4 s);llmtrim 使用 Rust,entroly 使用词法处理,因此两者都没有这项开销。
auto是带质量门控的默认选项;aggressive会在质量门控通过时接受有损删减。- 禁用 ML 后,Headroom 的缩减率会降至 0%(其路由器对文本不起作用)。
- leanctx 和 entroly 都是有损的,且没有质量门控;entroly 没有低缩减率模式。
在缩减率匹配的情况下,Headroom 的质量与 llmtrim 持平(24-25%,n=30,差异不显著),但它更长的回答会触及模型的输出 token 上限,并因此被截断 12 次,而 llmtrim 只有 2 次;这就是它输出膨胀、成本更高的原因。leanctx(测得缩减率为 26%)和 entroly(缩减率为 69%,这是其最温和的设置)的评分都显著低于 llmtrim(n=20),在其宣传的缩减率下差距会进一步扩大(与 leanctx 对比,与 entroly 对比)。
输出
在付费实时调用中,针对 9 个编码提示词,通过要求回答更简洁来缩减输出:
| 输出缩减率 | 每个请求的开销 | |
|---|---|---|
| caveman | 80% | 949 tokens |
llmtrim output_terse | 69% | 19 tokens |
代价是 caveman 每次请求都会重新发送 949-token 的系统提示词(右栏);llmtrim 只需 19 个 token,输出缩减率却几乎相同。两者在此处都能净节省,因此只有当 caveman 删除的输出价值超过它额外增加的 949 个 token 时,它更大幅度的缩减才更划算(与 caveman 对比的产物)。
这些工具可以叠加使用:RTK 先缩减命令行输出,然后 llmtrim 再压缩工具架构。完整的正面对比:crates/llmtrim-cli/bench/README.md。
已知限制
这些限制同样通过证明节省效果的 A/B 测试揭示:
- Anthropic / Gemini 的 token 数量是近似值。 由于没有公开的精确分词器,因此使用 BPE 代理进行估算,并在
status中标记。OpenAI 的计数是精确的。 - 未通过实时测试测量输出节省量。 代理只压缩输入;要测量输出节省量,需要 A/B 反事实,而这只有离线基准测试会运行。
status中的“saved”指输入侧的节省。 - 默认设置带有质量门控,并非无损。 只有评估表明质量能够保持时,才会运行有损阶段。若需要逐字节忠实的往返处理,请使用
safe预设。 - “无损”仅针对输入,不会还原回答。 无损阶段会保留模型读取的信息(折叠后的日志片段、TOON 编码的数组、模型可在提示词中解码的缩写对照表),token 门控会撤销所有得不偿失的输入删减。引擎不会将模型的回答转换回原始形式。
致谢
每种压缩器都是对已发表研究的确定性实现:创意归功于研究者,工程实现和令牌门控则由我们完成。
各阶段背后的论文与 crate
检索与上下文: BM25(Robertson & Zaragoza,2009,bm25);BM25+(Lv & Zhai,CIKM 2011);RM3(Lavrenko & Croft,SIGIR 2001);TextTiling(Hearst,CL 1997);TextRank(Mihalcea & Tarau,EMNLP 2004);MMR(Carbonell & Goldstein,SIGIR 1998);次模目标函数(Lin & Bilmes,ACL 2011);改进的贪心背包最大化算法(Tang 等,SIGMETRICS 2021,arXiv:2008.05391);DPP 多样化采样(Chen 等,NeurIPS 2018);Lost in the Middle(arXiv:2307.03172);DSLR(arXiv:2407.03627)。
代码: RepoCoder(arXiv:2303.12570);Hierarchical Context Pruning(arXiv:2406.18294);The Hidden Cost of Readability(arXiv:2508.13666);Minification token accounting(arXiv:2606.01326)。
工具输出: Drain(He 等,ICWS 2017);Brain(Yu 等,IEEE TSC 2023);LogLSHD(arXiv:2504.02172)。
去重与缩写: SimHash(Charikar,STOC 2002,gaoya);CompactPrompt(arXiv:2510.18043);最大重复片段(arXiv:1304.0528)+ Re-Pair(Larsson & Moffat,DCC 1999)。
输出控制: Chain-of-Draft(arXiv:2502.18600);TALE(arXiv:2412.18547)。
序列化: TOON(Token-Oriented Object Notation),Johann Schopplich。
构建于 tiktoken-rs、tree-sitter、image、whatlang、hudsucker、rusqlite 等之上。
发现问题?
llmtrim doctor # diagnose
llmtrim doctor --fix # diagnose + apply repairs
llmtrim ensure # same repair path
每项失败的检查都会说明如何修复。如果请求被篡改,请设置 LLMTRIM_CAPTURE_DIR,并提交 issue,附上修改前后的内容。
如果 llmtrim 帮你省了钱,点个 ⭐ 就能帮助其他人发现它。
Star History
根据 MPL-2.0 授权。可在你的技术栈中自由使用 llmtrim,包括商业用途;你自己的代码无需公开源代码。文件级 Copyleft 仅适用于你对 llmtrim 自身源文件所做的修改。通过 DCO 签署贡献。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。