上手Claude Code有段日子了,其性能确实没得说,但有个情况始终让我不太舒服,主要在于它读取文件的方式过于简单直接。

比方说,想让它协助修改某个函数,它的起手式就是读取整个文件,扫描到依赖项在别的文件里,就接着加载那个文件,加载后又察觉需要检视某个类的定义,于是第三个文件也被完整扫了一遍。

只是一个不复杂的需求,三四个文件就被它翻了个底朝天,token就像瀑布一样往下掉,再考虑到,20美元的官方订阅额度,通常跑不了几次迭代就告急了。

坦白讲,这锅不能全让 Claude Code 来背,这是当前几乎所有AI编程助手的普遍短板。

这类Agent缺少浏览目录结构的意识,其内置的默认行为逻辑是:上下文不明确?那就读文件。信息还不够?好,再读一个。

近来我找到一个叫cx的工具,专为解决此问题而生,试用后感觉效果拔群,特此分享出来。

Agent为何如此热衷于读取文件?

我们得先从根源上理解这个问题。

一个人类开发者接手新项目时,会先浏览目录结构,再通过搜索函数名跳转至定义处,扫几眼关键代码即可。

整个流程相当精准,绝不会从头到尾完整地读取一个文件。

然而AI Agent目前还做不到这点。

它既没有代码编辑器,也不具备LSP能力,唯一的武器就是Read File指令。

最终结果是,Cx的开发者在分析了 73 个 Claude Code会话数据后,得出了以下发现:

有66%的读取操作呈现链式反应,读A是为了定位B,读B又是为了找到C,并且37%属于重复读取,同一个文件在单次会话中被反复加载多次

单次文件读取平均耗费约 1200 token,而一个会话平均要读 21 次!

这意味着每个会话光是读取代码就要烧掉超过两万的token,这还没开始真正干活呢。这种写法就很灵性。

cx究竟是何方神圣?

cx是一个基于Rust开发的命令行小工具,它利用tree-sitter进行语义解析,并为Agent提供了一套“成本分级”的操作指令:

cx overview src/fees.rs      约 200 token   这个文件里有什么?
cx definition --name calc    约 200 token   给我看这个函数
cx symbols --kind fn         约 70 token    整个项目有哪些函数?
cx references --name calc    极少           这个符号在哪里被用到?

与直接读取整个文件相比,一个中等规模的文件可能消耗1200 token,但使用 cx overview 仅需200,而用 cx definition 直接抓取函数体,也只花费200左右。

Agent装备了这套工具后,会先用overview摸清项目脉络,然后根据需要通过definition来精准提取函数,绝大多数场景下都不再需要完整地读取文件。

根据实际测试数据,Read调用减少了58%,token总消耗降低了40%至55%。

为何不直接采用LSP?

这个问题问得相当在点上。既然Language Server也能实现诸如跳转定义、查找引用等功能,为何还要多此一举开发一个cx?

原因在于,LSP的设计初衷是服务于人类开发者,而非AI Agent。

LSP要求一个持续运行的后台服务,且需针对不同语言进行独立配置,内存占用动不动就上到1-2GB,并且必须等待项目编译和索引构建完毕后方可使用。

Agent在单次会话中可能只会调用一次相关功能,启动如此重型的服务显得得不偿失。

而cx的设计则是无状态的。

它初次运行时会调用tree-sitter解析全部源文件,构建一个轻量级的本地索引库.cx-index.db,后续的更新只针对有变动的文件进行增量处理。

没有后台进程,不存在编译依赖,即开即用,非常轻便。

如何安装并接入Claude Code

安装过程非常直白:

curl -sL https://raw.githubusercontent.com/ind-igo/cx/master/install.sh | sh

或选择使用Cargo:

cargo install cx-cli

接着,给Claude Code配置一份“操作手册”:

cx skill > ~/.claude/CX.md

随后在 ~/.claude/CLAUDE.md 文件中添上一行:

@CX.md

大功告成!

cx skill 命令会生成一份prompt,用于指导Claude Code何时应调用cx overview、何时使用cx definition,以及在何种情形下才退而求其次去完整读取文件。

fdcae070-aa88-4662-a80d-0c00127c1d87.png

Claude Code在接收到这份指令集后,会自动将cx系列命令的优先级置于Read File之前。

安装语言支持包:

cx lang add rust typescript python

cx能够自动侦测项目所使用的语言,若缺少相应的grammar,它会给出明确提示。

上手体验如何?

我拿手头一个Rust项目进行了实际测试。

我让Claude Code帮我重构其中一个模块,在过去,它会先读取入口文件,然后是依赖文件,加载好几个文件以后才开始动手编码。

87123eb1-3124-4487-8f8d-0e7739f7921e.png

现在它的工作流变为先执行 cx overview 浏览整体架构,定位到目标函数后,直接通过 cx definition 获取函数主体,基本上两步操作后就开始进入正题。

整个对话流程中Read File的调用频率显著降低,会话结束后检查token消耗,的确节省了相当可观的数量。

ca5b854a-6f8f-43fb-85aa-1fd56a19d88a.png

有几个点需要留意,cx强依赖tree-sitter来完成语义解析,理论上它支持众多语言,不过需要手动安装对应的grammar。

cx所解决的问题非常聚焦:为AI Agent提供一套比“全量读取文件”成本更低的代码查询方案。这个工具本身并不复杂,集成起来也很方便,但带来的效益却是实实在在的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐