mcpField
L
llmtrim

llmtrim

本地服务
github.comAI 与智能体2584 周前更新

关于 llmtrim

llmtrim 是一个本地代理,用于压缩发送给 LLM API 的请求,以降低 token 成本,同时保持回复内容不变。它面向使用 Claude Code、Codex、Cursor 或自研应用的开发者,也可作为 CLI、MCP 服务或库使用。

主要功能

  1. 01本地代理压缩 LLM API 请求
  2. 02压缩工具输出、日志、diff 与长上下文
  3. 03可通过 llmtrim setup 快速安装
  4. 04提供 CLI、MCP 服务与多语言库
  5. 05支持 Claude Code 的 /sub 订阅路由

适用场景

  1. 01降低 Claude Code 等编码 Agent 的 token 开销
  2. 02压缩构建日志与 JSON 数据后再发送给模型
  3. 03在自研应用中以库的形式进行请求压缩

MCP 相关

该项目提供 MCP 服务形式,可将压缩能力以原生工具的形式提供给 MCP 客户端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"fkiene-llmtrim": {
"command": "npx",
"args": [
"-y",
"@llmtrim/cli"
]
}
}
}
启动命令npx -y @llmtrim/cli

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@llmtrim/cli0.13.4

工具

3

收录的工具列表 · 更新于 2 周前

参数类型必填说明
requestany是提供方请求正文(OpenAI、Anthropic 或 Google 格式)。可以是 JSON 对象本身,也可以是该对象的 JSON 字符串;整个正文都会被压缩,并以相同格式返回。
providerstring|null否提供方提示:`openai`、`anthropic` 或 `google`。留空时根据请求形状检测。

详细介绍

llmtrim

llmtrim

本地代理,用于压缩大模型 API 流量,降低费用。答案不变,账单更少。

输入 −31% · 输出 −74% · 往返成本 −66% · 112 个实时 A/B 案例 · 每次调用约 5 ms · 无需加载模型

在使用 Claude Code?安装后还可通过 CLIProxyAPI 使用 /sub。

代理 · CLI · MCP · 库(Python · Ruby · Swift · Kotlin · JS/WASM)

llmtrim 状态:总览节省费用仪表板、会话、详情和 Sub 路由选项卡(CLIProxyAPI 预设、回退跳转和模型映射)

CI 许可证:MPL 2.0 crates.io npm npm 下载量 Rust 1.88+

功能介绍 • 安装 • 日常使用 • 实际效果 • 兼容对象 • 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)。

llmtrim 托盘弹出窗口

安全吗?

采用与 mitmproxy 相同的技术,但仅针对大模型 API 主机。setup 会更改三项设置;llmtrim uninstall 会还原这三项设置:

  1. ~/.llmtrim/ 中的私有 CA(名称受限;无法拦截你的银行或电子邮件)
  2. Shell 环境变量:HTTPS_PROXY + CA 信任
  3. 登录服务:登录时启动守护进程

不会存储 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
强制让一个会话通过 llmtrimllmtrim 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 划分主题 · 按预算选择不冗余的内容;保护问题内容长上下文
skeletonizationtree-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 或库

使用相同的引擎,无需代理。不会额外调用模型;压缩在进程内运行。

语言安装
Rustcargo add llmtrim-core
Pythonpip install llmtrim
Rubygem install llmtrim
Kotlinimplementation("io.github.fkiene:llmtrim:0.13.7")
SwiftSwiftPM 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 / 转储)
retrievefalse长上下文的词汇检索(有损)
skeletonizefalse将不相关的函数体替换为函数签名
serializetrue将记录数组编码为 TOON / CSV
json_crush在 agent/aggressive 中启用对超大的记录数组进行采样
output_controlfalse简洁输出指令 + 上限
output_anti_overthink在 aggressive/rag/code/agent 中启用针对量化推理流量的直接作答指令
output_frugal_tools在 agent 中启用引导 Agent 循环减少工具调用轮次(批量处理,不要重复)
cachefalsecache_control 分界点(无损)
deduptrue合并重复行(无损)
quality_gatetrue若有损删减导致与查询相关的覆盖率下降过多,则撤销删减

环境变量:LLMTRIM_PRESET(预设)、LLMTRIM_CONFIG(配置文件路径)。

运行时设置(环境变量或配置文件)

这些设置与压缩相互独立。每项设置都会优先读取环境变量,其次读取配置文件,因此可根据需要选择;两者同时存在时,以环境变量为准。

环境变量配置键含义
LLMTRIM_EXTRA_HOSTSextra_hosts要拦截的额外精确 LLM-API 主机(环境变量中以逗号分隔,文件中使用数组),例如自行托管的 OpenAI 兼容端点
LLMTRIM_EXCLUDE_PROVIDERSexclude_providers跳过压缩的线路格式:openai / anthropic / google(例如设为 anthropic,可让 Claude Code 不受影响);范围较宽,会涵盖该格式对应的所有主机
LLMTRIM_EXCLUDE_HOSTSexclude_hosts跳过压缩的精确主机名(例如 openrouter.ai);范围精确,同一格式的其他主机仍会压缩
LLMTRIM_UPSTREAM_PROXYupstream_proxy通过另一个代理路由出站流量(见下文)
LLMTRIM_DB_PATHdb_path账本位置
LLMTRIM_CAPTURE_DIRcapture_dir前后对比 QA 捕获目录
LLMTRIM_CAPTURE_MAX_MBcapture_max_mb捕获语料库大小上限(0 表示禁用)
LLMTRIM_FIRST_ARRIVAL_RECALLfirst_arrival_recall可恢复的首次到达工具输出整形(默认 false;设为 true 可允许 llmtrim recall 获取缓存边界结果)
LLMTRIM_TOOL_OUTPUTtoolout_passthrough对匹配的命令跳过工具输出压缩:passthrough(全部)或命令 glob(*gpt.sh*);也会识别命令赋值或结果行。LLMTRIM_KEEP: 行始终保留
LLMTRIM_FIRST_ARRIVAL_RECALL_TTL_SECSfirst_arrival_recall_ttl_secs内存中原始结果的保留时间(默认 18,000 秒 / 5 小时)
LLMTRIM_BINDbind监听 IP(默认回环地址;容器中使用 0.0.0.0)
LLMTRIM_BREAKDOWN_WINDOWbreakdown_window成本明细的上下文窗口覆盖值
LLMTRIM_RETENTION_DAYSretention_days账本按天保留的时长
LLMTRIM_NO_UPDATE_CHECKno_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 个用例中同时衡量成本和质量,而非估算:

llmtrim 在往返成本的两端都实现了削减:原始请求为 $0.0365,压缩后为 $0.0126,成本降低 66%,覆盖 112 个实时 A/B 用例

原始压缩后节省
输入 token71,03149,062−31%
输出 token25,8436,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-exact0%75% → 75%+0.0±0.0pp
SQuAD v2抽取式 QAtoken-F1 / EM11%84% → 84%−0.0±15.2pp
BFCL (live_multiple)函数调用tool-call match33%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 编码器,并可通过此仓库复现。

llmtrimHeadroomRTKcaveman
压缩内容输入 · 输出输入工具/CLI 输出模型输出
跳过无效转换✅❌❌不适用
单个静态二进制文件✅Python + 模型✅✅
输入

通过实时 A/B 测试,将输入缩减率(确定性)与回答质量并列比较。质量是相对于 llmtrim 在各工具对比设置下的下降幅度(✅ 持平,具有统计意义的平手;❌ 显著更低),因此缩减率很高但标记为 ❌,意味着工具是以牺牲回答质量换取 token 的:

工具缩减率相对 llmtrim 的质量开销
llmtrim auto25%✅ 参考~5 ms
llmtrim aggressive28%✅ 参考~5 ms
Headroom(启用 ML)24%✅ 持平~0.9 s
leanctx / LLMLingua-252-81%❌ 低 18%~6 s
entroly80-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 个编码提示词,通过要求回答更简洁来缩减输出:

输出缩减率每个请求的开销
caveman80%949 tokens
llmtrim output_terse69%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

Star History Chart

根据 MPL-2.0 授权。可在你的技术栈中自由使用 llmtrim,包括商业用途;你自己的代码无需公开源代码。文件级 Copyleft 仅适用于你对 llmtrim 自身源文件所做的修改。通过 DCO 签署贡献。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。