同一份 ai_family_backend(commit a6fb1d3e,只取 backend/src/services,232 個 TS 檔)。沿用 8 月報告的 grep 真值,再加上三個 8 月沒測過的維度:LLM 建出來的邊會不會捏造、重跑穩不穩、給新人看懂的效果。
兩邊都對同一份 232 檔建圖;UA 是正確設定那一輪的數字(第一輪設定錯誤作廢,見最後一段)。
差距是 0 對 156 萬 token、1.7 秒對 10 分鐘。UA 的節點數少,是因為 file-analyzer 依「顯著性門檻」只為檔案、匯出的 class/函式建節點,class 方法幾乎不建。
各 0–10,由本次實驗執行者自評。不加總:兩個工具的圖顆粒度不同,總分沒有意義。
真值在 a6fb1d3e 上用 grep 重建:每個呼叫點都找到外層函式。
| 外層函式(真值) | 形式 | codegraph | UA(class 層級) |
|---|---|---|---|
| assertWithinQuota 的 caller · 真值 5 | |||
| VitalsMeasurementService.uploadAndAnalyze | class method | ✅ | ❌ 有 import 邊、沒 calls 邊 |
| VoiceCallWsGateway.handleConnection → onMessage | 巢狀 arrow fn | ✅(歸到 handleConnection) | ✅ |
| VoiceCallService.start | class method | ✅ | ✅ |
| registerWebrtcConnectionHandler → onUserTurn | 巢狀 async fn | ✅(列為 onUserTurn) | ✅ |
| VoiceCallWebrtcService.init | class method | ✅ | ✅ |
| CostModeService · CostStreamService | 呼叫的是 getUsage | —(正確未列) | ⚠ 列為 QuotaService 的 caller(class 層級為真,方法層級是假陽性) |
| handleUserText 的 caller · 真值 2 | |||
| onMessage(ws gateway)· onUserTurn(webrtc) | 兩個都是巢狀函式 | 2/2 | 2/2(指向 VoiceCallSession class) |
題目:「解說一通語音通話從接通到結束的流程、使用者講話怎麼變成語音回覆、額度在哪裡檢查和扣」。兩個 subagent 各答一次:一個以 UA 的 knowledge-graph.json 當地圖,一個以 codegraph CLI 當地圖,兩邊都可以回頭讀原始碼。
| 以 UA 圖為主 | 以 codegraph 為主 | |
|---|---|---|
| token/工具呼叫 | 7.8 萬 · 10 次(圖查詢 3、讀原始碼 5) | 8.5 萬 · 7 次(codegraph 6、讀檔 1) |
| 事實抽查(grep 驗證 10 條) | 10/10(含 3 條只靠節點摘要、沒回原始碼確認的) | 10/10(「sweepStale 在索引內無 caller」正確,真正的 caller 在範圍外的 worker/,它有註明) |
| 選的路徑 | 較新的 WebRTC 路徑,從導覽第 13–14 步切入 | 舊的 WebSocket 路徑,從 explore 結果切入 |
| 強項 | 涵蓋面廣:Call Center、KVS 通道池、STT 簡轉繁、兩種計量分開 | 單一路徑更深:路由、狀態碼、token 格式、1006 斷線的結束時間判定 |
| 風險 | 答案裡有 7 處標明「只來自圖摘要」,摘要錯了會直接寫進答案 | 範圍外的呼叫者看不到,要靠答題者自己註明 |
第一輪我直接對 backend/src/services 跑,tsconfig.json 不在範圍內,@/ 路徑別名就解析不了。services 裡 997 個 import 用別名、只有 250 個是相對路徑,結果 import 邊只建出 128 條。file-analyzer 又被規定「只能依 import 資料建 calls 邊」,quotaService 這類跨檔呼叫就這樣被丟掉了。工具沒報錯,只有一個 agent 在回報裡提到。
改成專案根設為 backend/,用 exclude 只留 src/services/** 和 tsconfig 之後,import 邊回到 278 條。第一輪跑了 11 批、約 89 萬 token,全部作廢。
用法:UA 的範圍要包含 tsconfig(或其他路徑別名設定),縮小範圍用 --exclude,不要直接把子目錄當專案根。