graphify:在陌生 codebase 裡找東西,其實不是搜尋問題
在一個你沒寫過的 codebase 裡搞懂某個功能怎麼實作,這件事一直被當成搜尋問題。開 grep、打關鍵字、翻結果。但它其實不是搜尋問題,是一張圖的問題。
grep 一次只回答一件事:哪幾行出現了這個字串。可是你翻 codebase 的時候,腦子裡真正想知道的通常不是「這個字在哪」,是「這個函式被誰呼叫、它又呼叫了誰、我改它會炸到哪裡」。那是關係,不是字串。grep 看得到點,看不到線。
你其實一直在用腦袋拼一張圖
回想一下上次接手別人的專案。你打開一個 controller,看到它注入了一個 service,跳過去;service 又依賴三個 repository,再跳過去;其中一個 repository 繼承了某個 base class,藏在另一個目錄。翻到第七個檔案的時候,前三個檔案的關係你已經記不清了,得往回捲。
你在做的事,是拿肉眼跟短期記憶,手動把一張依賴關係圖拼出來。拼得慢、還很容易漏。graphify 做的,就是把這張你本來要用腦拼的圖,先幫你建好。
它的做法不玄。用 tree-sitter 把大約 40 種語言的原始碼解析成 AST,從裡面抓出 import、呼叫、繼承這些真實存在的邊,接成一張圖。這整段在你自己機器上跑完,不呼叫任何 LLM,程式碼解析百分之百本機。所以它不是在猜你的 code 長怎樣,是照著語法結構讀出來的。
沿著真的存在的邊走,跟「找長得像的」不一樣
這裡有個容易搞混的點。現在講 AI 讀 codebase,很多人第一個想到 vector RAG,把程式碼切塊、轉成向量、丟一個問題進去找最相似的片段。那套是模糊比對,找的是「長得像」的東西。
graphify 不是。它是沿著圖裡真的存在的邊走。用資料庫的話講最直觀:vector RAG 像 WHERE 欄位 LIKE '%關鍵字%',graphify 像照 foreign key 做 JOIN。前者給你相似,後者給你精確的結構關係。你要找「誰 import 了這個模組」,前者可能撈回一堆剛好提到類似字眼的段落,後者直接沿著 import 這條邊列給你。
差別在你要問的問題是哪一種。找一段語意上相關的說明,RAG 很強。追一條「A 到底怎麼牽到 B」的實際路徑,圖才是對的工具。
它會告訴你「這條我不太確定」
graphify 有個設計我蠻喜歡,因為它反過來做了大部分工具不做的事:標信賴度。
它把抓到的關係分三層。原始碼白紙黑字寫的,標 EXTRACTED;推導出來的,比如二次解析才能兜出的 call graph,標 INFERRED;連它自己都不確定的,標 AMBIGUOUS,另外列出來讓你人工審。
這件事聽起來很小,其實是整個工具可不可信的關鍵。一張你不知道哪裡可信的圖,比沒有圖更危險,因為你會照著它下判斷。大多數工具會把猜測包裝成斬釘截鐵的事實,這個反過來,把「我不確定」也印給你看。誠實這件事在工具身上很稀有。
建好之後,三個動作就夠用
圖建好一次,之後就是重複查,不用每次重翻。主要就三個動作。
graphify query "問題" 丟一個問題進去,它用廣度優先撈一圈相關上下文回來;想追一條特定路徑就加 --dfs。graphify path "A" "B" 問兩個節點中間到底經過什麼。graphify explain "某個東西" 針對單一節點解說它是什麼、跟誰有關。
輸出固定丟在 graphify-out/:一個可以用滑鼠拖的 graph.html,還有一份 GRAPH_REPORT.md。報告裡會直接點名 god nodes,被一大堆其他節點依賴的核心節點,以及跨模組的「意外連結」。
god nodes 這個東西,對接手新專案的人特別值錢。你最想知道的其實是「動哪裡最危險」,而被最多東西依賴的那個節點,就是你一改整棟樓會地震的地方。grep 永遠不會主動跟你講這個,因為它根本不知道有這回事。圖知道。
別把它當銀彈
該潑的冷水也要潑。這工具版本還在 0.9.x,八百多個 commit 幾乎是一個人扛的。作者自己老實揭露 benchmark 樣本很小(n 只有 6),圖擴展比純 RAG 也就贏 2.6 個百分點,不是碾壓。
還有幾個坑。PyPI 上套件名叫 graphifyy,兩個 y,但指令是 graphify,一個 y,裝的時候很容易打錯。文件、圖片這類要做語意抽取的東西,預設會送去外部 LLM,想純本地跑得自己接 ollama。程式碼分析免 API key,但這部分不是。
這些都不致命,可是它們提醒你一件事:這是個好用的輔助,不是裝上去就升天的魔法。
真正改變的不是速度
繞回開頭。graphify 最值錢的地方,不是讓你找東西快一點,雖然確實快。是它逼你換一個問題來問自己:翻 codebase 的時候,你到底在找什麼?
如果答案真的只是「某個字串出現在哪」,那 grep 就夠了,別為它裝東西。但十次有八次,你要的其實是「這塊跟那塊怎麼牽在一起」。承認這件事的那一刻起,你面對的就不再是一疊平躺的檔案,是一張有結構的圖。工具只是先幫你把圖畫出來,剩下怎麼讀,還是你的事。



















































































































































