使用 Claude Code 有一段時間了,無庸置疑地非常強大,但有一件事一直讓我不太滿意,就是它讀取檔案的方式太過粗獷。
你請它協助修改一個函式,它會先讀取整個檔案,發現依賴項在另一個檔案中,接著讀取該檔案,讀完後發現還需要查看某個類別的定義,於是再讀取第三個檔案。
僅僅是一個簡單的需求,卻讀完了三、四個檔案,Token 嘩嘩地流失,再加上OpenAI 一週內砍掉三款產品,Claude 再次緊縮使用額度:AI 的好日子是否已盡?官方訂閱每月 20 美元,通常沒操作幾下就用完了。
這其實並非 Claude Code 独有的問題,而是所有 AI 編碼助手(Coding Agent)的通病。
Agent 缺乏瀏覽目錄結構的概念,其預設行為就是:不確定?讀檔案。還不確定?再讀一檔。
最近發現一款名為 cx 的工具,專門針對此問題設計,使用後效果顯著,在此與大家分享。
為什麼 Agent 這麼愛讀檔案?
首先來理解問題的本質。
人類程式設計師開啟一個新專案時,會先查看目錄結構,接著搜尋函式名稱、跳轉至定義處,通常只看幾行就足夠了。
整個過程高度精準,絕不會將整個檔案從頭到尾讀過一遍。
但 AI Agent 做不到這一點。
它沒有整合開發環境(IDE),也缺乏語言伺服器協定(LSP)支援,唯一能做的就是「Read File」(讀取檔案)。
結果就是,Cx 作者分析了 73 次 Claude Code 會話(Session)的數據後發現:
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 個 Token,使用 cx definition 直接取得函式本體也只要 200 個 Token。
Agent 使用這套工具後,會先透過 overview 掌握整體結構,在有需求時再以 definition 精準抓取函式,大多數情況下根本無需完整讀取整個檔案。
實測數據顯示,Read 調用次數減少 58%,Token 用量降低 40% 至 55%。
為什麼不使用 LSP?
這是個合理的疑問。語言伺服器(LSP)也能實現「跳轉至定義」、「查找引用」等功能,為什麼還要專門開發一個 cx 呢?
因為 LSP 是設計給人用的,而非給 Agent 使用。
LSP 需要持續運行的後台行程,每種語言需單獨設定,記憶體動輒消耗 1-2GB,還得等待專案編譯與索引完成後才能使用。
Agent 在一次會話中可能只使用一次,啟動這套重型機制並不划算。
cx 則是無狀態(stateless)的。
首次執行時,它會利用 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,以及什麼情況下才需要完整讀取檔案。
Claude Code 看到這份說明後,會自動將 cx 的命令優先於 Read File 執行。
安裝語言支援:
cx lang add rust typescript pythoncx 會自動偵測專案中使用了哪些語言,若未安裝對應的語法解析器(grammar),它會提示你進行安裝。
實際使用感受如何?
我在一個 Rust 專案上進行了測試。
請 Claude Code 協助重構一個模組,過去它會先讀取入口檔案,再讀取依賴檔案,讀了幾個檔案之後才開始撰寫程式碼。
現在它會先執行 cx overview 查看整體結構,找到目標函式後直接以 cx definition 取得函式本體,基本上兩步驟就開始實作了。
對話中 Read File 的調用次數明顯減少,會話結束後查看 Token 用量,確實大幅降低。
有幾點需要注意:cx 依賴 tree-sitter 進行語意解析,理論上支援眾多語言,但需手動安裝對應的語法解析器。
cx 解決的問題非常具體:為 AI Agent 提供一套比「讀取整個檔案」更經濟的代碼查詢介面。工具本身並不複雜,接入也簡單,但效果卻是實實在在的。
專案網址: