RFC:檔案級節點摘要

要不要替每個檔案節點加「一句話摘要」?——Option A 放圖裡 vs Option B 放 sidecar
來源:docs/node-summaries-rfc.md

問題

graph.json 給了代理圖的結構、原始檔、節點 label 與關係。這能避免讀整個 repo,但代理常常還是得打開原始檔,只為了回答一個最基本的導覽問題:

這個檔案/節點是負責做什麼的?

一個放在圖節點附近的短摘要,可以減少 graphify querygraphify explain、MCP 節點查詢與圖導覽時的重複讀檔。

目標與 Non-goals

Goals:
- Help agents choose relevant files with less context.
- Preserve offline, deterministic behavior by default.
- Keep the first implementation small and reviewable.
- Avoid adding long prose to GRAPH_REPORT.md.
- Leave room for a future opt-in LLM summary backend.

Non-goals:
- Summarizing every function/method in v1.
- Calling an LLM by default.
- Replacing graphify explain.
- Turning GRAPH_REPORT.md into a per-file index.

目標:讓代理用更少 context 選對檔案;預設保持離線與確定性;第一版小而可稽核;不把長文塞進 GRAPH_REPORT.md;留給未來可選的 LLM 摘要後端。

刻意不做:第一版不摘要每個函數/方法;預設不呼叫 LLM;不取代 explain;不把報告變成逐檔索引。

兩種方案的共同約束

摘要該含什麼

建議欄位:summary(一句話描述檔案職責,主要省 token 欄位)、source_file(不需解析節點 ID 就能跳到對的檔)、labelgenerated_by(區分確定性與未來的 LLM 摘要)、summary_version(格式可演進)。

建議納入句子內的訊號:模組 docstring / 檔頭註解(通常是最優質的人工目的陳述)、匯出類別/函數/符號(檔案提供什麼 API 面)、重要 import(屬 auth/DB/UI/CLI/test)、主導圖關係(主要呼叫/匯入/定義)、社群或附近 hub label、可用的來源位置覆蓋。不含長呼叫鏈、完整相依清單、原始碼、每個符號。

展開英文原文:範例摘要
{
  "label": "extract.py",
  "source_file": "graphify/extract.py",
  "summary": "Extracts source files into graph nodes and relationships; defines language parsers and import/call extraction helpers.",
  "generated_by": "deterministic",
  "summary_version": 1
}

Option A:摘要放進 graph.json

在檔案級節點加一個可選 summary 欄位。使用者流程:graphify . --summarize-nodesgraphify explain "extract.py"

優點:圖消費者單一 artifact;符合 NetworkX 節點屬性與既有節點 metadata;explain/serve/視覺化/MCP 都好取用;沒有 sidecar 新鮮度或節點 ID 對接邏輯。

缺點:文字加進核心圖 artifact;圖 schema 面變大;把整個 graph.json 倒進 LLM context 的消費者會一次付出所有摘要的 token。

Option B:sidecar node-summaries.json

摘要寫進另一個以節點 ID 為 key 的 artifact。使用者流程:graphify summarizegraphify explain "extract.py"

優點:graph.json 保持精簡與拓撲聚焦;摘要明確可選;可獨立重新產生;有放未來 generator metadata 的自然位置。

缺點:多了消費者必須發現並載入的第二個 artifact;引入新鮮度與同步問題;每個想用摘要的消費者都要靠節點 ID 對接。

選型的核心張力:單一 artifact 的簡潔 vs 核心圖的精簡。這正是 RFC 存在的意義——把取捨講清楚,讓維護者與使用者投票。作者列的 4 個待決問題:graph.json 單一 artifact 還是 sidecar?摘要在建圖時產生還是要顯式指令(如 graphify summarize)?叫 summary 還是 synopsis?多大預算可接受?

提議的首版實作順序

  1. 加確定性檔案級摘要產生。
  2. 用選定的 option 儲存摘要。
  3. graphify explain 顯示摘要。
  4. graphify serve / MCP 節點查詢顯示。
  5. 加測試:預設行為、產生的摘要、缺摘要、摘要長度上限。

後續想法

教學延伸:這份 RFC 展示了 Graphify 團隊怎麼為「AI 代理導覽」設計介面——而實際的檔案摘要概念已部分體現在「本站怎麼挑要教哪個檔案」的策展邏輯上。想讀 graph.json 的實際 schema,看 概念地圖實作案例

教學解說

這份 RFC 解決一個實際問題:代理常常得打開原始檔,只為了回答「這個檔案是負責做什麼的?」一個放在圖節點附近的短摘要,可以減少重複讀檔。

兩種方案的張力是「單一 artifact 的簡潔 vs 核心圖的精簡」。Option A 把摘要放進 graph.json(簡單但圖變大),Option B 放 sidecar(圖保持精簡但多一個 artifact 要同步)。這是典型的架構取捨。

摘要的內容設計很精確:只放模組 docstring、匯出符號、重要 import、主導圖關係等「本機訊號」,不放長呼叫鏈或完整相依清單。

Worked Example:設計你自己的摘要方案

  1. 分析需求:列出你的代理最常問的導覽問題(例如「這個檔案做什麼?」、「哪些檔案與 auth 相關?」)。
  2. 評估 Option A:計算如果把摘要放進 graph.json,圖大小會增加多少(每個摘要約 200-300 字元 × 節點數)。
  3. 評估 Option B:設計 sidecar 的 schema,考慮如何處理新鮮度與同步問題。
  4. 選擇方案:根據你的使用場景(圖大小限制、同步需求、消費者數量)做出選擇。
設計原則:摘要應該是「可選的」——有摘要時更好用,沒有摘要時系統照常運作。

常見錯誤與診斷

錯誤訊息原因解決方式
summary: token budget exceeded摘要總長度超過預算減少摘要數量或縮短每條摘要長度
node ID mismatch in sidecarsidecar 中的節點 ID 與 graph.json 不符重新產生 sidecar 或修復 ID 映射
summary: no source signal檔案沒有 docstring 或匯出符號這是正常的,這類檔案的摘要可能為空

練習與驗收清單

① 專案級端到端 Worked Example:為 2000 節點圖設計摘要方案並驗證成效

前面是設計你自己的摘要方案。這次是完整的摘要實作與驗證:你有一個 2000 節點的圖,要實作摘要功能、測量它對 agent 查詢的幫助、最後決定 Option A 還是 Option B。

  1. 分析需求:列出 agent 最常問的導覽問題(「這個檔案做什麼?」、「哪些檔案與 auth 相關?」),統計目前的回答需要幾次額外讀檔。
  2. 實作確定性摘要:寫一個 Python script 從 graph.json 的每個檔案級節點提取:docstring(如果有)、匯出符號、重要 import、主導圖關係、社群 label。產出 200-300 字元的摘要。
  3. 測量成效:用 50 個導覽問題測試——有摘要 vs 無摘要的「額外讀檔次數」和「回答準確度」。如果摘要能把「額外讀檔」從平均 3 次降到 1 次,代表摘要有效。
  4. 選擇方案:如果圖大小增加 <5%(2000 × 300 bytes ≈ 600KB),選 Option A(放 graph.json);如果圖大小增加 >20%,選 Option B(sidecar)。
  5. 整合驗證:把摘要接進 graphify explain,確認有摘要時「回答更快、更準」。寫進 review.md 記錄成效。
關鍵價值:摘要的價值在「減少 agent 的額外讀檔」——如果 agent 每次回答「這個檔案做什麼?」都要打開原始檔,那圖的壓縮效益被打了折扣。摘要讓 agent 能用一句話選對檔案,只在需要深入時才讀原始碼。

② 效能/品質/安全深度

面向考量實務建議
效能2000 節點 × 300 bytes = 600KB 額外 payload;Option A 把這加進 graph.json計算你的 graph.json 目前大小;如果已經 >5MB,600KB 的增加是 <12%,可接受;如果 <1MB,600KB 的增加是 60%,考慮 Option B
品質確定性摘要的品質取決於「本機訊號」的豐富度——沒有 docstring 的檔案摘要品質差追蹤「空摘要」比例(>30% 要改進摘要 script);用 generated_by 區分確定性與 LLM 摘要
安全摘要可能洩漏敏感資訊(如 API key 在 docstring 裡)摘要 script 應過濾含 keysecrettoken 的 docstring;或只取第一句

③ 文件間比較對照表

面向本文(RFC:檔案級節點摘要)相關文差異說明
摘要設計Option A(放 graph.json)vs Option B(sidecar)的優缺點架構總覽架構頁講 graph.json 的 schema(node-link 格式);RFC 頁討論是否擴展 schema
Agent 導覽減少重複讀檔、graphify explain 顯示摘要技能檔結構技能檔頁講 Fast path 跳過建圖直接 query;RFC 頁講如何讓 query 的結果更豐富
儲存模型Option A 的單一 artifact 簡潔 vs Option B 的 sidecar 精簡增量更新增量頁講 manifest.json 的持久化;RFC 頁討論摘要的儲存模型取捨
確定性預設不呼叫 LLM、用本機訊號產生摘要運作原理運作原理頁講 Pass 1 的確定性抽取;RFC 頁講確定性摘要的產生邏輯

④ 互動式檢核清單