
1. 長(zhǎng)上下文代碼問(wèn)答為什么這么燒 tokens在 Continue 里問(wèn)一個(gè)跨模塊的代碼問(wèn)題比如「這個(gè)項(xiàng)目的鑒權(quán)鏈路是怎么走的」插件默認(rèn)會(huì)把當(dāng)前打開(kāi)文件、最近編輯過(guò)的文件、檢索到的片段一股腦塞進(jìn)上下文。項(xiàng)目小的時(shí)候沒(méi)感覺(jué)一旦倉(cāng)庫(kù)超過(guò)幾萬(wàn)行單次請(qǐng)求的輸入 tokens 很容易沖到幾萬(wàn)甚至十幾萬(wàn)。我試過(guò)在一個(gè)中型 Go 項(xiàng)目里問(wèn)一句「訂單狀態(tài)機(jī)在哪些地方被改寫(xiě)」Continue 自動(dòng)帶上了十幾個(gè)文件光輸入就接近 8 萬(wàn) tokens回答還沒(méi)開(kāi)始生成賬單已經(jīng)上去了。問(wèn)題的根源不是模型不行而是 Continue 缺少「項(xiàng)目級(jí)結(jié)構(gòu)感知」。它只能靠向量檢索和文件相似度去猜哪些內(nèi)容相關(guān)猜錯(cuò)的代價(jià)就是大量無(wú)關(guān)代碼被塞進(jìn) prompt。Graphify 這類工具做的事情是把整個(gè)倉(cāng)庫(kù)預(yù)先解析成一張知識(shí)圖譜函數(shù)、結(jié)構(gòu)體、變量是節(jié)點(diǎn)調(diào)用、導(dǎo)入、繼承是邊。有了這張圖AI 回答「誰(shuí)調(diào)用了誰(shuí)」「某個(gè)概念定義在哪」這類結(jié)構(gòu)性問(wèn)題時(shí)只需要讀取圖譜里的少量節(jié)點(diǎn)和邊而不是把整個(gè)文件讀進(jìn)來(lái)。把 Graphify 和 Continue 結(jié)合核心不是讓 Continue 去調(diào)用一個(gè)外部工具而是通過(guò) Skill 機(jī)制把「先查圖譜、再回答」這個(gè)工作流寫(xiě)進(jìn)系統(tǒng)提示詞。Continue 的 Skill 本質(zhì)上是一份 SKILL.md放在.continue/skills/目錄下插件啟動(dòng)時(shí)會(huì)把它注入到對(duì)話的系統(tǒng)上下文里。這樣 AI 在收到結(jié)構(gòu)性問(wèn)題時(shí)會(huì)優(yōu)先執(zhí)行圖譜查詢命令拿到精簡(jiǎn)結(jié)果后再組織回答而不是盲目地把文件內(nèi)容全量塞進(jìn)上下文。適合誰(shuí)看已經(jīng)在用 Continue 做日常開(kāi)發(fā)、倉(cāng)庫(kù)規(guī)模中等偏上、發(fā)現(xiàn) tokens 消耗異常高的同學(xué)。如果你只是偶爾問(wèn)幾句語(yǔ)法問(wèn)題這套配置的收益不明顯但如果你每天要問(wèn)十幾個(gè)跨文件的結(jié)構(gòu)性問(wèn)題下面這套骨架能把單次請(qǐng)求的輸入 tokens 壓下來(lái)一大截。2. 前置準(zhǔn)備TaoToken 與 Graphify 環(huán)境2.1 拿到可用的 API KeyContinue 需要一個(gè)模型后端來(lái)驅(qū)動(dòng)對(duì)話和 Skill 執(zhí)行。這里用 TaoToken 作為統(tǒng)一入口它兼容 Anthropic 和 OpenAI 兩種協(xié)議Continue 里配置起來(lái)比較省事。先到控制臺(tái)創(chuàng)建一把 API Key# 控制臺(tái)地址創(chuàng)建 Key 用 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite創(chuàng)建完成后把 Key 復(fù)制出來(lái)后面寫(xiě)進(jìn) Continue 的 config 里。注意 Key 只顯示一次丟了就重新建一把。2.2 安裝 GraphifyGraphify 通過(guò) pip 安裝建議放在獨(dú)立的虛擬環(huán)境里避免和項(xiàng)目依賴打架python -m venv ~/.graphify-env source ~/.graphify-env/bin/activate pip install graphifyy安裝完成后驗(yàn)證一下命令是否可用graphify --version如果提示找不到命令說(shuō)明虛擬環(huán)境的 bin 目錄沒(méi)進(jìn) PATH用絕對(duì)路徑調(diào)用即可比如~/.graphify-env/bin/graphify。后面 SKILL.md 里我會(huì)用絕對(duì)路徑避免 Continue 執(zhí)行時(shí)找不到命令。2.3 確認(rèn) Continue 版本支持 SkillSkill 是 Continue 較新版本才有的能力。打開(kāi) VS Code在擴(kuò)展面板里確認(rèn) Continue 已經(jīng)更新到最新版。判斷方法很簡(jiǎn)單在項(xiàng)目根目錄下創(chuàng)建.continue/skills/文件夾重啟窗口后如果 Continue 能識(shí)別到這個(gè)目錄說(shuō)明版本沒(méi)問(wèn)題。識(shí)別不了就升級(jí)插件。3. 可復(fù)制的配置骨架3.1 Continue 的 config 骨架Continue 的配置文件在~/.continue/config.jsonmacOS/Linux或%USERPROFILE%\.continue\config.jsonWindows。下面是一份精簡(jiǎn)骨架重點(diǎn)是 models 部分指向 TaoToken以及把 Skill 目錄納入上下文{ models: [ { title: TaoToken Claude, provider: anthropic, model: claude-sonnet-4-20250514, apiKey: 你的_TAOTOKEN_API_KEY, apiBase: https://taotoken.net/api } ], contextProviders: [ { name: code, params: {} }, { name: diff, params: {} } ], allowAnonymousTelemetry: false, experimental: { skills: true } }幾個(gè)關(guān)鍵點(diǎn)說(shuō)明一下。apiBase填https://taotoken.net/api不要帶任何查詢參數(shù)。experimental.skills打開(kāi)后 Continue 才會(huì)去掃描.continue/skills/目錄。contextProviders里保留code和diff就夠了其他 provider 比如terminal、problems會(huì)額外增加上下文體積按需再加。3.2 SKILL.md 的目錄結(jié)構(gòu)Skill 的目錄約定是固定的一個(gè)技能一個(gè)文件夾文件夾里放一份 SKILL.mdmkdir -p .continue/skills/graphify touch .continue/skills/graphify/SKILL.md目錄名graphify就是技能名Continue 會(huì)用它來(lái)索引。SKILL.md 的頭部需要一段 YAML front matter聲明技能名稱和描述描述寫(xiě)清楚「什么時(shí)候該用這個(gè)技能」AI 靠這段描述判斷是否觸發(fā)。3.3 SKILL.md 完整示例下面這份 SKILL.md 是壓縮 tokens 的核心。它的設(shè)計(jì)思路是把「先查圖譜、再回答」寫(xiě)成硬性工作流并且明確禁止 AI 在回答結(jié)構(gòu)性問(wèn)題時(shí)直接讀取整個(gè)文件。--- name: graphify description: 項(xiàng)目知識(shí)圖譜專家。當(dāng)用戶詢問(wèn)跨文件調(diào)用關(guān)系、模塊依賴、函數(shù)定義位置、整體架構(gòu)時(shí)優(yōu)先使用本技能查詢圖譜避免全量讀取源碼文件。 --- # Graphify 知識(shí)圖譜技能 ## 角色設(shè)定 你是一個(gè)精通 Graphify 的代碼分析助手。你的目標(biāo)不是教用戶怎么用 Graphify 而是直接替用戶執(zhí)行圖譜查詢命令把結(jié)構(gòu)化結(jié)果整理成自然語(yǔ)言回答。 當(dāng)前工作目錄就是用戶的項(xiàng)目根目錄。 ## 核心執(zhí)行邏輯 收到用戶問(wèn)題后先判斷問(wèn)題類型 - 結(jié)構(gòu)性問(wèn)題誰(shuí)調(diào)用了誰(shuí)、某函數(shù)定義在哪、模塊依賴關(guān)系、整體架構(gòu) → 執(zhí)行圖譜查詢命令禁止直接讀取源碼文件。 - 業(yè)務(wù)邏輯問(wèn)題某段代碼為什么這么寫(xiě)、某個(gè)判斷的業(yè)務(wù)含義 → 圖譜查詢定位到具體文件后只讀取該文件的相關(guān)片段。 ## 可執(zhí)行命令 ### 命令 A首次構(gòu)建圖譜 如果 graphify-out/graph.json 不存在先執(zhí)行構(gòu)建 bash ~/.graphify-env/bin/graphify . --budget 2000構(gòu)建完成后提示用戶查看graphify-out/GRAPH_REPORT.md。命令 B自然語(yǔ)言查詢~/.graphify-env/bin/graphify query 用戶原問(wèn)題 --budget 2000--budget 2000限制返回的 token 預(yù)算這是壓縮上下文的關(guān)鍵參數(shù)。 把命令輸出整理成 Markdown 表格或列表回復(fù)用戶不要直接貼原始日志。命令 C增量更新用戶說(shuō)「代碼改了」或「更新圖譜」時(shí)執(zhí)行~/.graphify-env/bin/graphify . --update命令 D路徑追蹤~/.graphify-env/bin/graphify path 節(jié)點(diǎn)A 節(jié)點(diǎn)B用文字描述依賴路徑每一步標(biāo)注所在文件。重要約束禁止在回答中長(zhǎng)篇解釋 Graphify 原理除非用戶主動(dòng)問(wèn)。禁止只告訴用戶「請(qǐng)運(yùn)行 xxx 命令」而不給出具體命令內(nèi)容。必須把圖譜輸出的結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)成自然語(yǔ)言和 Markdown 表格?;卮鸾Y(jié)構(gòu)性問(wèn)題時(shí)禁止把整個(gè)源碼文件讀進(jìn)上下文。這份 SKILL.md 里最值錢(qián)的是 --budget 2000 這個(gè)參數(shù)和「禁止全量讀取源碼」這條約束。前者從工具側(cè)限制了返回體積后者從提示詞側(cè)堵住了 AI 偷懶的路徑。 ## 4. 驗(yàn)證請(qǐng)求與 tokens 對(duì)比 ### 4.1 讓 Skill 生效 創(chuàng)建完 SKILL.md 后重啟 VS Code 窗口。然后在 Continue 的對(duì)話窗口里輸入 text 請(qǐng)?zhí)砑?skills .continue/skills/graphifyContinue 會(huì)掃描并加載這個(gè)技能。加載成功后你可以用下面的命令確認(rèn)npx skills list --agent continue如果列表里出現(xiàn)了graphify說(shuō)明技能已經(jīng)掛載。有時(shí)候因?yàn)榫彺嬖驔](méi)生效重啟窗口再試一次即可。4.2 第一次構(gòu)建圖譜在項(xiàng)目根目錄下直接在 Continue 對(duì)話里問(wèn)一個(gè)結(jié)構(gòu)性問(wèn)題比如這個(gè)項(xiàng)目的整體架構(gòu)是什么AI 應(yīng)該會(huì)先執(zhí)行圖譜構(gòu)建命令。構(gòu)建過(guò)程視項(xiàng)目大小而定幾萬(wàn)行的項(xiàng)目大概一到兩分鐘。構(gòu)建完成后會(huì)在項(xiàng)目根目錄生成graphify-out/文件夾里面有g(shù)raph.json、graph.html和GRAPH_REPORT.md。4.3 tokens 用量對(duì)比驗(yàn)證壓縮效果最直接的辦法是看 Continue 對(duì)話窗口底部顯示的 tokens 計(jì)數(shù)。做兩組對(duì)照第一組關(guān)閉 Skill直接問(wèn)「訂單狀態(tài)機(jī)在哪些地方被改寫(xiě)」。Continue 會(huì)走默認(rèn)的向量檢索把相關(guān)文件全量塞進(jìn)上下文。記錄輸入 tokens。第二組啟用 Skill問(wèn)同樣的問(wèn)題。AI 會(huì)先執(zhí)行g(shù)raphify query拿到精簡(jiǎn)的節(jié)點(diǎn)和邊列表再組織回答。記錄輸入 tokens。我在一個(gè)約 6 萬(wàn)行的 Go 項(xiàng)目里實(shí)測(cè)第一組輸入 tokens 約 7.8 萬(wàn)第二組約 1.2 萬(wàn)降幅接近 85%。回答質(zhì)量方面結(jié)構(gòu)性問(wèn)題調(diào)用鏈、依賴關(guān)系反而更準(zhǔn)因?yàn)閳D譜的邊是 AST 解析出來(lái)的比向量檢索的相似度匹配可靠。業(yè)務(wù)邏輯問(wèn)題兩者差別不大但 tokens 消耗依然低很多。4.4 一個(gè)具體的查詢示例假設(shè)你想知道AuthService和UserRepository之間的關(guān)系在 Continue 里輸入AuthService 和 UserRepository 是怎么關(guān)聯(lián)的Skill 觸發(fā)后AI 執(zhí)行~/.graphify-env/bin/graphify path AuthService UserRepository返回結(jié)果類似PATH FOUND (3 hops): AuthService --imports-- UserService --inherits-- BaseService --calls-- UserRepositoryAI 會(huì)把這條路徑整理成文字并標(biāo)注每個(gè)節(jié)點(diǎn)所在的文件。整個(gè)過(guò)程只消耗了圖譜查詢的少量 tokens沒(méi)有讀取任何源碼文件。5. 本篇常見(jiàn)錯(cuò)排查5.1 Skill 不生效最常見(jiàn)的原因是 SKILL.md 的 front matter 格式不對(duì)。name和description必須用---包裹且description要寫(xiě)清楚觸發(fā)場(chǎng)景。如果 description 寫(xiě)得太泛比如只寫(xiě)「代碼分析」AI 可能不會(huì)主動(dòng)觸發(fā)。另外確認(rèn).continue/skills/目錄在項(xiàng)目根目錄下不是用戶目錄下。5.2 graphify 命令找不到Continue 執(zhí)行 Skill 里的命令時(shí)用的是系統(tǒng) PATH不會(huì)自動(dòng)激活虛擬環(huán)境。所以 SKILL.md 里必須寫(xiě)絕對(duì)路徑比如~/.graphify-env/bin/graphify。如果你把 Graphify 裝在 conda 環(huán)境里路徑類似/opt/anaconda3/envs/xxx/bin/graphify按實(shí)際路徑改。5.3 圖譜構(gòu)建報(bào)錯(cuò)構(gòu)建時(shí)如果提示缺少 API Key說(shuō)明 Graphify 需要調(diào)用模型來(lái)做語(yǔ)義推理。在終端里設(shè)置環(huán)境變量export ANTHROPIC_API_KEY你的_TAOTOKEN_API_KEY export ANTHROPIC_BASE_URLhttps://taotoken.net/api然后重新執(zhí)行構(gòu)建命令。注意這兩個(gè)變量要在執(zhí)行 graphify 的同一個(gè)終端會(huì)話里設(shè)置。5.4 tokens 沒(méi)降下來(lái)如果啟用 Skill 后 tokens 依然很高檢查兩個(gè)地方。一是 SKILL.md 里的約束是否被 AI 遵守可以在對(duì)話里直接問(wèn)「你剛才讀取了哪些文件」如果 AI 說(shuō)讀了整個(gè)文件說(shuō)明約束沒(méi)生效把「禁止全量讀取源碼」這條寫(xiě)得更強(qiáng)硬一些。二是--budget參數(shù)是否生效默認(rèn)值可能偏大手動(dòng)改成 2000 或更低。5.5 圖譜過(guò)期導(dǎo)致回答不準(zhǔn)代碼改動(dòng)后圖譜不會(huì)自動(dòng)更新需要手動(dòng)執(zhí)行g(shù)raphify . --update。如果發(fā)現(xiàn) AI 回答的調(diào)用關(guān)系和實(shí)際代碼對(duì)不上先更新圖譜再問(wèn)??梢栽?SKILL.md 里加一條規(guī)則每次回答結(jié)構(gòu)性問(wèn)題前檢查graph.json的修改時(shí)間如果超過(guò)一天就提示用戶更新。6. 把 Skill 用順手的幾個(gè)建議Skill 這套機(jī)制的價(jià)值在于把重復(fù)的工作流固化下來(lái)。Graphify 只是其中一個(gè)例子同樣的思路可以套到其他場(chǎng)景比如把項(xiàng)目的代碼規(guī)范寫(xiě)成 Skill讓 AI 每次生成代碼前先讀一遍或者把部署流程寫(xiě)成 Skill讓 AI 按固定步驟執(zhí)行。回到 tokens 壓縮這件事核心邏輯是「讓 AI 少讀、精讀」。圖譜查詢是少讀--budget限制是精讀。兩者配合才能在不犧牲回答質(zhì)量的前提下把開(kāi)銷(xiāo)壓下來(lái)。如果你還在用默認(rèn)配置硬扛長(zhǎng)上下文不妨按上面的骨架搭一套跑一周看看賬單變化。需要長(zhǎng)期在編碼場(chǎng)景里用這套配置的話可以了解一下 Coding Plan它針對(duì)高頻編碼請(qǐng)求做了額度優(yōu)化https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文檔和 API Key 管理入口在這里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite想先驗(yàn)證模型對(duì)話效果可以直接在網(wǎng)頁(yè)端試https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite