docs/node-summaries-rfc.mdgraph.json 給了代理圖的結構、原始檔、節點 label 與關係。這能避免讀整個 repo,但代理常常還是得打開原始檔,只為了回答一個最基本的導覽問題:
這個檔案/節點是負責做什麼的?
一個放在圖節點附近的短摘要,可以減少 graphify query、graphify explain、MCP 節點查詢與圖導覽時的重複讀檔。
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;不把報告變成逐檔索引。
graphify explain <node> 顯示。graphify serve / MCP 節點查詢包含。建議欄位:summary(一句話描述檔案職責,主要省 token 欄位)、source_file(不需解析節點 ID 就能跳到對的檔)、label、generated_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
}
graph.json在檔案級節點加一個可選 summary 欄位。使用者流程:graphify . --summarize-nodes → graphify explain "extract.py"。
優點:圖消費者單一 artifact;符合 NetworkX 節點屬性與既有節點 metadata;explain/serve/視覺化/MCP 都好取用;沒有 sidecar 新鮮度或節點 ID 對接邏輯。
缺點:文字加進核心圖 artifact;圖 schema 面變大;把整個 graph.json 倒進 LLM context 的消費者會一次付出所有摘要的 token。
node-summaries.json摘要寫進另一個以節點 ID 為 key 的 artifact。使用者流程:graphify summarize → graphify explain "extract.py"。
優點:graph.json 保持精簡與拓撲聚焦;摘要明確可選;可獨立重新產生;有放未來 generator metadata 的自然位置。
缺點:多了消費者必須發現並載入的第二個 artifact;引入新鮮度與同步問題;每個想用摘要的消費者都要靠節點 ID 對接。
graph.json 單一 artifact 還是 sidecar?摘要在建圖時產生還是要顯式指令(如 graphify summarize)?叫 summary 還是 synopsis?多大預算可接受?graphify explain 顯示摘要。graphify serve / MCP 節點查詢顯示。graphify query 在預算內為回傳節點包含摘要。教學延伸:這份 RFC 展示了 Graphify 團隊怎麼為「AI 代理導覽」設計介面——而實際的檔案摘要概念已部分體現在「本站怎麼挑要教哪個檔案」的策展邏輯上。想讀 graph.json 的實際 schema,看 概念地圖 或 實作案例。
這份 RFC 解決一個實際問題:代理常常得打開原始檔,只為了回答「這個檔案是負責做什麼的?」一個放在圖節點附近的短摘要,可以減少重複讀檔。
兩種方案的張力是「單一 artifact 的簡潔 vs 核心圖的精簡」。Option A 把摘要放進 graph.json(簡單但圖變大),Option B 放 sidecar(圖保持精簡但多一個 artifact 要同步)。這是典型的架構取捨。
摘要的內容設計很精確:只放模組 docstring、匯出符號、重要 import、主導圖關係等「本機訊號」,不放長呼叫鏈或完整相依清單。
| 錯誤訊息 | 原因 | 解決方式 |
|---|---|---|
summary: token budget exceeded | 摘要總長度超過預算 | 減少摘要數量或縮短每條摘要長度 |
node ID mismatch in sidecar | sidecar 中的節點 ID 與 graph.json 不符 | 重新產生 sidecar 或修復 ID 映射 |
summary: no source signal | 檔案沒有 docstring 或匯出符號 | 這是正常的,這類檔案的摘要可能為空 |
前面是設計你自己的摘要方案。這次是完整的摘要實作與驗證:你有一個 2000 節點的圖,要實作摘要功能、測量它對 agent 查詢的幫助、最後決定 Option A 還是 Option B。
graphify explain,確認有摘要時「回答更快、更準」。寫進 review.md 記錄成效。| 面向 | 考量 | 實務建議 |
|---|---|---|
| 效能 | 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 應過濾含 key、secret、token 的 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 頁講確定性摘要的產生邏輯 |
graphify explain 的整合方式,並說明「有摘要時回答更快」的機制