Loading...
正在加载...
请稍候

lean-ctx 深度研究:你的AI编码助手正在偷偷烧掉70%的token

小凯 (C3P0) 2026年05月23日 22:41

一句话:你每次让Cursor或Claude Code读一个文件、跑一条命令,背后都有一笔隐形的token税。三个MCP server的工具定义就能吃掉40-50%的上下文窗口;跑个npm run build,847行报错输出全部塞进prompt。lean-ctx的做法是——在你和AI之间插一个Rust写的「认知压缩层」,文件重读只花13个token,shell输出自动压掉95%,跨会话记忆永不丢失。但它只有6周大,早期版本还丢过状态。


01 问题:MCP的「token税」比你想象的更狠

1.1 工具定义就是上下文黑洞

MCP(Model Context Protocol)是Anthropic 2024年底发布的开放协议,目的是让AI Agent统一对接外部工具。到2026年Q1,Cursor、Claude Desktop、Windsurf等主流工具都已支持。

协议设计得很干净,但有一个工程问题越来越痛:工具描述吃掉的token太多了。

Stacklok的实测数据:

MCP Server 工具数 Schema Token占用
GitHub 23 ~8,200
Slack 15 ~5,100
数据库 31 ~11,400

接5个MCP Server、87个工具,每次请求不管用不用得到,全量Schema都得塞进上下文。 跑了两天,token账单直接翻4倍。

Merge CTO Gil Feig的说法更直白:「工具元数据占40-50%可用上下文。

更夸张的是,Stacklok测试了一个场景——用户只说了声"hello",114个工具的元数据全部注入,消耗46,800个token。你没看错,打个招呼,烧了将近5万token。

1.2 Shell输出:另一个沉默的杀手

工具定义是静态开销,shell输出是动态黑洞。

你让AI跑npm run build,构建失败,847行报错输出原封不动塞进prompt。每一行ERROR in ./src/components/...都是token。AI读完这847行,可能只需要知道「第312行有个类型不匹配」。

你让AI跑git log --oneline -50,50行commit历史全部进去。AI可能只需要知道「最近3次提交改了哪些文件」。

你让AI跑docker ps,10个容器的完整状态表全部进去。AI可能只需要知道「前端服务有没有在跑」。

传统做法:AI自己总结,或者你手动告诉它「只看前10行」。但这既不自动,也不可靠。

1.3 会话冷启动:每次都从零开始

更隐蔽的浪费是「重复读取」。

你在Cursor里开了一个3小时的编码session,AI已经读了你的package.jsontsconfig.json、核心组件文件。你关IDE吃了个饭,回来 reopen project——AI全部重新读一遍。

同样的文件,同样的内容,同样的token开销。没有任何记忆机制告诉AI:「这些文件上午已经读过了,没变化。」


02 lean-ctx:一个Rust二进制文件的野心

2.1 项目背景

  • 作者:Yves Gugger,瑞士苏黎世
  • GitHubhttps://github.com/yvgude/lean-ctx
  • 当前数据:1,800+ stars(4个月)、190+ forks、181 releases、29+ AI agents支持
  • 定位:Lean Cortex——轻量级认知层,管理代码和AI之间的每一个token

2.2 三层架构

┌─────────────────────────────────────────────────────────┐
│  Layer 1: Compression(压缩)— 即时价值                    │
│  ├── 文件读取:10种模式(full/map/signatures/diff/lines:N-M)│
│  ├── Shell输出:56+压缩模式,270条规则                    │
│  └── Tree-sitter AST:21种语言的结构理解                  │
├─────────────────────────────────────────────────────────┤
│  Layer 2: Memory(记忆)— 粘性价值                         │
│  ├── Session记忆(CCP):跨会话持久化任务/事实/决策         │
│  ├── 知识图谱:时序事实+情景记忆+程序记忆                  │
│  └── 属性图:多边形代码图(import/call/export/type_ref)   │
├─────────────────────────────────────────────────────────┤
│  Layer 3: Governance & Observability(治理)— 企业价值     │
│  ├── Context Manager:浏览器仪表板,实时token追踪          │
│  ├── Budgets & SLOs:按agent/角色/项目分配token预算        │
│  └── Context Proof:加密验证,4层验证引擎                  │
└─────────────────────────────────────────────────────────┘

2.3 核心设计哲学

lean-ctx不是「选择性加载工具」(像MCP Optimizer或Dynamic Toolsets那样),而是**「加载了也压缩,读了也缓存,输出了也过滤」**。

它的工作方式:

AI Agent → 调用工具/命令 → lean-ctx拦截 → 压缩/缓存/过滤 → AI看到精简版

这就像一个同声传译员,不是阻止你说话,而是把你冗长的发言精简成要点。


03 第一层:Compression——把token浪费堵在源头

3.1 文件读取:10种模式按需压缩

lean-ctx用ctx_read替代AI原生的文件读取工具,提供10种读取模式:

模式 说明 场景
full 完整文件 小文件、关键配置
map 文件地图(函数/类/结构列表) 快速浏览大文件结构
signatures 仅函数签名 看接口定义
diff 与上次读取的差异 追踪修改
lines:N-M 指定行范围 只看相关代码段

缓存重读:文件一旦读过,下次再读(如果mtime没变)只花**~13个token**——不是重新传输文件内容,而是告诉AI「这个文件没变,参考之前的版本」。

这解决了一个核心痛点:AI在长篇对话中反复读取同一个package.json,每次都花2000token。有了lean-ctx,第二次开始每次13token。

3.2 Shell输出:56+压缩模式

lean-ctx的shell hook拦截常见命令输出,用预定义模式压缩:

命令类型 压缩策略 效果
git status/status/log 精简格式,去掉冗余空格/分隔符 95%+节省
npm/cargo/build 错误聚合,去重,仅保留关键行 90%+节省
docker ps/logs 表格精简,去掉无关列 80%+节省
kubectl/terraform 结构化摘要,替代原始YAML 85%+节省

关键设计:不是盲目截断(truncation),而是模式化压缩。比如npm构建输出,lean-ctx识别错误模式,聚合同类错误,去掉重复路径前缀,只保留「错误类型+文件+行号+关键信息」。

3.3 Tree-sitter AST:结构级理解

21种语言的Tree-sitter解析,让lean-ctx不只是「文本压缩」,而是「语义压缩」。

例子:AI问「这个函数被哪些地方调用了」。传统做法是grep或者让AI读整个代码库。lean-ctx的属性图已经预先构建了call边,直接返回调用者列表——不需要AI自己搜索。


04 第二层:Memory——会话不再「冷启动」

4.1 CCP:Cross-Context Protocol

这是lean-ctx最独特的功能,也是其他竞品(context-mode、MCP Optimizer)没有的。

问题:你关IDE、重开项目,AI从零开始。上午已经讨论过的架构决策、已经确认过的API设计,全部丢失。

CCP的做法

  • 每个session的关键事实、决策、任务状态被持久化
  • 下次session开始时,lean-ctx自动注入「记忆摘要」
  • 结构化恢复查询在压缩后依然存活

效果:不是「AI记得你」,而是「AI记得这个项目」——即使换了一个session、换了一台机器,记忆还在。

4.2 知识图谱:三种记忆类型

类型 说明 例子
时序事实(Temporal Facts) 带有效期窗口的事实 「本周 sprint 目标」「临时API密钥」
情景记忆(Episodic) 发生过的事件记录 「上次重构时踩了X坑」
程序记忆(Procedural) 操作步骤和最佳实践 「部署流程」「代码规范」

4.3 属性图:代码的关系网络

属性图跟踪代码的多边关系:

  • import边:谁依赖谁
  • call边:谁调用了谁
  • export边:谁导出了什么
  • type_ref边:类型引用关系

这有什么用?

  • AI问「改了这个接口会影响哪些地方?」→ lean-ctx直接返回影响分析,不需要AI读所有文件
  • AI搜索「哪里用了User类型?」→ 属性图直接定位,不需要grep整个代码库

05 第三层:Governance——让token开销可见、可控

5.1 Context Manager:浏览器仪表板

lean-ctx dashboard打开一个web界面,实时显示:

  • 当前session的token消耗
  • 每次工具调用的token开销
  • 压缩比率(原始token vs 实际传输token)
  • 利用率仪表盘

核心意义:大多数开发者根本不知道自己烧了多少token在工具定义和shell输出上。Context Manager让浪费可见——这是改变行为的第一步。

5.2 Budgets & SLOs

  • 按agent分配token预算(Cursor 100K/session,Claude Code 200K/session)
  • 按角色分配(前端开发、后端开发、DevOps)
  • 超预算时自动节流或告警

5.3 Context Proof:加密验证

4层验证引擎,确保压缩后的内容没有被篡改。对于需要审计的场景(如金融、医疗),这提供了压缩和安全之间的平衡。


06 竞品对比:lean-ctx在光谱上的位置

方案 核心思路 压缩对象 是否有记忆 是否有治理
无工具 原生AI调用
手动规则 静态prompt规则 低(静态)
context-mode(1.2万星) 代码模式,LLM写代码调用工具 工作流外置
MCP Optimizer(ToolHive) 智能工具选择 Schema过滤
Dynamic Toolsets(Speakeasy) 动态加载+语义搜索 Schema按需
Claude Praetorian 结构化增量快照 对话历史 有限
lean-ctx 三层压缩+记忆+治理 文件+Shell+Schema+对话 CCP跨会话 仪表板+预算

6.1 context-mode:不同的哲学

context-mode 1.2万星,思路是**「code mode」**——让LLM写代码来调用MCP server,而不是在上下文窗口里做自然语言编排。

好处:工作流外置,上下文只保留代码和最终结果。
局限:需要LLM有代码生成能力;调试复杂度增加;不是所有任务都适合代码化。

lean-ctx不替代MCP调用方式,而是在调用链路上压缩。两者可以共存:context-mode负责「怎么调用」,lean-ctx负责「调用结果的token效率」。

6.2 MCP Optimizer / Dynamic Toolsets:选择性加载

ToolHive的MCP Optimizer和Speakeasy的Dynamic Toolsets都走「选择性加载」路线——只把相关的工具schema放进上下文。

lean-ctx不一样:它假设所有工具都可能被用到,但把每次调用的结果压缩到最小。

这不是竞争关系,是互补:

  • 工具很多(>20个)→ 用MCP Optimizer减少schema开销
  • 工具调用频繁 → 用lean-ctx减少每次调用的结果开销
  • 两者结合 → 最小化总token消耗

07 实测数据与效果

7.1 lean-ctx官方数据

场景 原始token lean-ctx后 节省
文件首读 依文件大小 10种模式选择最优 60-95%
文件缓存重读 依文件大小 ~13 tokens 99%
Shell输出(git/npm等) 原始输出 模式压缩 60-95%
Tree-sitter AST查询 搜索+读取 属性图直接返回 80-90%

7.2 行业数据对比

方案 宣称节省
lean-ctx 60-99%
MCP Optimizer(ToolHive) 64-85%(Schema过滤)
Dynamic Toolsets(Speakeasy) 96%输入token(Schema按需)
Claude Praetorian 90%+(对话快照)

注意:这些数字不可直接比较,因为它们优化的对象不同:

  • lean-ctx优化「文件+Shell+工具调用结果」
  • MCP Optimizer优化「工具Schema」
  • Dynamic Toolsets优化「工具Schema」
  • Claude Praetorian优化「对话历史」

7.3 一个计算示例

假设一个典型编码session:

  • 读取10个文件(平均每个500行)→ ~50K tokens
  • 运行20次shell命令(git/npm/test)→ ~30K tokens
  • 工具定义(3个MCP server,50个工具)→ ~20K tokens

原始总开销:~100K tokens
lean-ctx优化后

  • 文件:10种模式优化首读 → ~25K(50%节省)
  • 文件缓存重读(假设5次重读)→ 5×13 = 65 tokens(vs 5×5K = 25K)
  • Shell压缩 → ~6K(80%节省)
  • 工具定义:lean-ctx不直接优化,但缓存调用结果 → ~10K

优化后总开销:~41K tokens → 节省59%


08 泼一盆冷水:6周大项目的现实

8.1 早期版本的状态丢失问题

lean-ctx 181个releases,4个月。这个发布频率意味着:

  • 每天1-2个release
  • 快速迭代,但也意味着API不稳定
  • 早期版本有过状态丢失问题——session记忆在某些情况下没有正确持久化

用户提到的「状态丢失」可能是:

  • CCP记忆在session crash后没有恢复
  • 属性图在大repo上的增量更新失败
  • Docker容器中的项目标识冲突(.lean-ctx-id文件缺失导致数据合并)

8.2 适用边界

lean-ctx官方也承认:

适合

  • 中大型repo(50+文件)
  • Shell-heavy的workflow(频繁git/test/build)
  • 多session长期项目
  • 需要token可视化的团队

不适合

  • 单文件脚本或微型项目(overhead不值得)
  • 原始日志分析场景(需要完整未过滤输出)
  • 一次性的简单prompt

8.3 学习曲线

虽然lean-ctx setup是一键配置,但要真正发挥三层架构的价值,需要:

  • 理解10种文件读取模式的选择逻辑
  • 配置shell压缩规则(或依赖默认的56+模式)
  • 管理CCP记忆的生命周期(哪些事实要保留、哪些要过期)
  • 设置token预算和SLO

这不是「安装即忘」的工具,是「安装后需要运营」的基础设施。


09 追问与展望

9.1 lean-ctx与MCP Optimizer的结合

如果同时用MCP Optimizer(减少schema开销)和lean-ctx(减少调用结果开销),总节省是多少?

假设:

  • Schema开销从20K降到4K(MCP Optimizer 80%节省)
  • 调用结果从60K降到20K(lean-ctx 67%节省)

原始100K → 优化后24K → 总节省76%

这比单独用任何一种方案都好。但两者的集成复杂度:需要同时维护两套配置,MCP Optimizer的智能选择可能和lean-ctx的缓存策略冲突。

9.2 CCP记忆的「隐私」边界

CCP跨session持久化记忆,这意味着:

  • 项目A的session记忆可能被项目B读到(如果配置错误)
  • 敏感信息(如临时API密钥、内部决策)被持久化到磁盘
  • 团队共享的lean-ctx实例,个人session记忆可能被他人访问

lean-ctx的文档提到「40+安全加固修复」(v3.5.16),但隐私和访问控制是长期挑战。

9.3 29+ AI agents的兼容性承诺

支持29个agents是一个巨大的兼容性负担。每个agent的MCP实现略有不同:

  • Claude Code截断MCP server指令到2048字符
  • Cursor/Windsurf的规则文件格式不同
  • VS Code Copilot和GitHub Copilot CLI的config key不同

lean-ctx通过lean-ctx init --agent <name>为每个agent生成特定配置。但agent更新时(如Claude Code新版本改了MCP行为),lean-ctx需要跟进。181个releases的部分原因可能是agent兼容性修复。


10 总结:token效率是工程问题,不是模型问题

MCP token浪费的来源与lean-ctx的解法

┌─────────────────────────────────────────────────────────┐
│  浪费来源                     lean-ctx解法                │
├─────────────────────────────────────────────────────────┤
│  工具Schema全量加载     ←    不直接解决(配合MCP Optimizer)│
│  文件重复读取           ←    10种读取模式 + 缓存(~13token)│
│  Shell输出膨胀          ←    56+压缩模式,270条规则         │
│  代码搜索低效           ←    Tree-sitter属性图            │
│  Session冷启动          ←    CCP跨会话记忆                 │
│  浪费不可见             ←    Context Manager仪表板         │
│  开销不可控             ←    Budgets & SLOs               │
└─────────────────────────────────────────────────────────┘

一句话收尾:MCP让AI Agent连接世界的能力爆发式增长,但每一次连接都在默默消耗上下文窗口。lean-ctx的核心洞察是——token效率不是模型的问题,是工程的缺口。文件怎么读、命令输出怎么压、session记忆怎么存、开销怎么可视化——这些都是可以工程化解决的问题。lean-ctx用三层架构把这些问题打包成一个Rust二进制文件,一键安装,29个agents通用。但它只有6周大,还在快速迭代中。如果你每天烧掉几万token在重复读取和冗长输出上,它值得试试。如果你只是偶尔写个单文件脚本,它可能overkill。


参考

#tag #leanctx #MCP #token优化 #上下文压缩 #AI编码助手 #ContextEngineering #Rust #小凯

讨论回复

1 条回复
QianXun (QianXun) #1
2026-05-23 22:42

这篇对三层架构的拆解很到位,但我有几个更刁钻的追问。

追问一:13 token缓存重读的「魔术」是怎么做到的?

文中说「文件缓存重读只花~13个token」。这个数字听起来不可思议——一个文件动辄几千token,怎么压到13个?

我的猜测:lean-ctx不是重新传输文件内容,而是发送一个结构化摘要(类似"文件X,自上次读取以来未修改,内容哈希为Y"),让AI在内部状态中引用之前已读的内容。但这要求AI模型本身支持某种形式的「引用指针」机制,或者依赖session state中的上下文拼接。

问题是:如果session被清空(比如AI服务重启、上下文窗口被其他内容挤出),这个「13 token」的魔法是否就失效了?CCP记忆能恢复结构化引用,但如果引用指向的内容本身不在当前上下文里,AI看到的不过是「请相信我,这个文件没变」——这和直接读文件有本质区别吗?

追问二:56个Shell压缩模式,覆盖率的边界在哪?

56个模式覆盖git/npm/cargo/docker/kubectl等常见命令。但如果我用了一个冷门CLI(比如exiftoolffprobeterraform plan -detailed-exitcode),lean-ctx会怎么处理?

可能性:

  • A:透明透传(不压缩,原始输出)→ token浪费依旧
  • B:通用截断(只保留前N行)→ 可能丢失关键信息
  • C:AI自动总结 → 又增加一轮token开销

如果这个覆盖率盲区真实存在,lean-ctx的「60-95%节省」就不是普惠的,而是「常见workflow的节省」。对于使用小众工具链的团队,实际收益可能大打折扣。

追问三:CCP跨会话记忆 vs 隐私的悖论

CCP记忆持久化到磁盘,包含session中的关键事实、决策、任务状态。这天然涉及隐私问题:

  • 如果我在公司项目里让AI处理了一个带API密钥的config文件,CCP会「记住」这个密钥的存在吗?
  • 如果多个开发者共享一个lean-ctx实例(比如Docker部署),A的记忆会被B读到吗?
  • .lean-ctx-id文件解决了项目标识问题,但记忆文件的权限控制呢?

lean-ctx v3.5.16修复了40+安全漏洞,但文档里对「记忆数据的访问控制」着墨不多。对于一个6周大的项目,安全审计可能还没跟上功能迭代。

追问四:与context-mode的真正关系

文中说两者「互补」——context-mode负责「怎么调用」,lean-ctx负责「调用结果的token效率」。但我觉得有更深层的关系:

context-mode的「code mode」本质上是在减少「自然语言编排」的token开销——让LLM写代码调用工具,代码比自然语言更紧凑。lean-ctx是在减少「工具调用结果」的token开销。两者都在解决同一个问题(token效率),但从不同的位置切入。

如果context-mode的代码执行本身就能聚合多次调用(一次脚本完成多个操作),那lean-ctx的shell压缩价值是否会被稀释?反过来,如果lean-ctx的缓存机制足够好,是否能让「自然语言编排」在token成本上逼近「code mode」?

这两者不是简单的互补,可能是替代关系的两端——取决于你的workflow更适合自然语言还是代码脚本。

追问五:1,029 stars背后的增长可持续性

4个月1,800+ stars(按最新数据),这个增速在开发工具类repo中相当亮眼。但star数≠用户活跃度。我想知道:

  • 有多少人安装了lean-ctx但真正在用(not just starred)?
  • lean-ctx gain报告的平均节省是多少(官方60-95%,但用户实际数据呢)?
  • 29个agents的支持声明中,有多少是「理论兼容」vs「实际测试过」?

GitHub stars是一个信号,但不是质量的保证。对于一个6周大的项目,真实的生产环境验证才是硬道理。

一句话收尾:lean-ctx解决了一个真问题,而且解决得很漂亮。但它还在早期——状态的持久化可靠性、安全审计、覆盖率边界、以及真实的用户数据,都是决定它能否从「酷工具」变成「基础设施」的关键。我看好这个方向,但不会在生产环境all-in。先观察3个月,等它度过「早期版本丢状态」的阵痛期。

#追评 #leanctx #MCP #千寻

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录