※如果有幫助,請記得收藏、按讚!!
<📝本篇文章的目標讀者>
AGENTS.md 與設計文件該放哪裡的人.NET Lab 於 2026 年 6 月讀書會的演講資料在這裡
剛開始使用 GitHub Copilot 時,常會在意這些事:
當然,提問方式很重要。
但當你越來越熟悉 Copilot Chat、Agent mode、MCP、Agent Skills、客製化指示之後,問題會逐漸改變。
不只是「怎麼問」,而是要讓 AI 讀到什麼更重要。
例如,AI 寫出了和意圖不同的實作。這個原因不一定是提示詞寫得不好。
這類問題,單靠提示詞的措辭無法解決。
必須設計 AI 在工作時使用的整體資訊,也就是上下文。
本篇最想傳達的一句話是:
目標不是減少 token。目標是把能幫助 AI 做出好判斷的資訊,以適當的時機與粒度交給它。
單純刪減 token,可能會把必要的設計資訊與審核依據一起弄丟。相反地,為了保險把所有資料都丟給 AI,又會增加成本與判斷雜訊。
因此,本篇會把傳給 GitHub Copilot 的資訊拆成以下幾類:
接著會用初學者也能理解的方式,整理 MCP、Skills、AGENTS.md、DESIGN.md、CLI 與模型選擇該怎麼分工。
先整理 token 與上下文的基本概念。
送進生成式 AI 的文字,會被切成小單位來處理。這個單位就是token。
在日文裡,不一定是「1 個字 = 1 個 token」。英文單字、符號、程式碼、JSON、檔案路徑等,也會依模型方式切成多個 token。
不過,實務上不需要每次都自己手算「這段字串有幾個 token」。
重點是,除了提問文字之外,還有很多資訊也會傳給模型。
上下文視窗是 AI 在這次處理中能參照的資訊範圍。
對初學者來說,可以把它想成AI 的工作桌。
工作桌上不只有使用者輸入的問題,還會放上像這些內容:
AGENTS.md 等客製化指示下圖說明這些資訊如何共享同一個上下文視窗。

GitHub Copilot 的上下文消耗,不只是提問文字,還包含指示、工具、執行結果與對話歷史的總和。
這裡特別值得注意的是,工具執行結果。
工具呼叫本身可能只需要工具名稱與簡短參數,但如果結果回傳以下內容,就會一下子消耗很多上下文:
有時候,比起把提問文字縮短 20 個字,把不必要的搜尋結果從 500 筆減成 20 筆,效果大得多。
也就是說,思考 token 時,不能只想「把提示詞縮短」。
要同時看 AI 平常就持有的資訊,以及工作過程中新增的資訊。
「token」這個詞有好幾種意思,容易混淆,所以先分開。
| 用語 | 意義 |
|---|---|
| 上下文視窗 | 模型一次能參照的資訊範圍 |
| 輸入 token | 傳給模型的指示、問題、歷史、工具定義、工具結果等 |
| 輸出 token | 模型產生的說明、程式碼、摘要等 |
| 快取 token | 與先前請求共通、被重用的輸入部分 |
| 費用 / AI Credits | 依產品、模型、合約、快取單價等計算出的使用量 |
這裡最重要的是,上下文量與費用不是完全相同的概念。
例如,即使每次都把很長的固定指示送給模型,若 Prompt Caching 生效,可能會用不同於一般輸入的單價或計算方式。
但即便被快取,不必要的資訊對 AI 判斷造成的影響並不會因此消失。
「在計費上能便宜重用」與「值得讓 AI 讀」是兩回事。
另外,GitHub Copilot 的計費方式可能變動。2026 年 6 月 1 日之後的說明中,已有 AI Credits 與 token 用量的對應關係,但你閱讀本文時的最新資訊,請以GitHub Copilot 的模型與價格為準。
把固定單價直接寫進文章裡,將來一旦調價內容就會過時,因此本文以機制與判斷方式為主。
還有一件事也要先區分。
MCP 的通訊或本地命令的執行本身,和 LLM 的 token 消耗不是同一件事。
例如,MCP client 對 MCP server 發送 tools/list,取得工具清單。
MCP 客戶端
↓ tools/list
MCP 伺服器
↓ 工具清單
MCP 客戶端
這是 MCP 的 RPC 通訊。
取得的工具清單中,哪些資訊會傳給模型,取決於 client 或 agent runtime 的實作。
若有傳給模型,工具名稱、description、input schema 等就會影響輸入上下文。反之,如果只保留在 client 內部而沒有送進模型,就不一定會直接變成 LLM 輸入 token。
因此,這樣理解比較清楚:
發生通訊
↓
client 取得資訊
↓
將資訊傳給模型
↓
影響模型的輸入上下文
「一連接 MCP,所有定義與資源本文每次都會直接送進模型」這種說法並不精確。
不過,AI 要能選工具,就必須某種程度知道有哪些可用工具。因此,工具數量與 schema 大小,是上下文設計上很重要的觀點。
想減少 token 時,不建議一開始就直接把指示檔縮短。
先觀察是哪裡膨脹了。
GitHub Copilot CLI 提供了查看上下文與使用量的指令。
/context
用來確認目前上下文視窗的使用狀況。
/usage
用來確認 session 使用量與各模型 token 資訊等。
/compact
用來摘要變長的對話歷史,並壓縮上下文。
由於指令支援與顯示內容可能隨產品更新而改變,也請一併參考GitHub Copilot CLI 的上下文管理。
把同一個工作在以下條件下比較,較容易找出原因。
| 比較 | 要確認的事 |
|---|---|
| MCP 開啟/關閉 | 加入工具定義後,固定區域增加多少 |
| 搜尋結果 500 筆/20 筆 | 工具結果對上下文的影響 |
| 檔案全文/相關範圍 | 載入檔案量的影響 |
| 長對話/新 session | 對話歷史累積的影響 |
壓縮前//compact 後 |
歷史摘要帶來的變化 |
| Auto/手動指定模型 | 模型選擇如何影響品質、速度與使用量 |
重點是要讓模型、設定、儲存庫、提問內容保持一致再比較。
如果一次改太多條件,就不知道到底是哪個因素發揮作用。
💡 第一個結論
不要只削減提問文字,而是要確認固定指示、工具定義、載入檔案、工具結果、對話歷史中,究竟是哪裡膨脹了。
整理 AI 所需資訊時,常會想把所有內容都寫進同一個巨大指示檔。
也就是「只要每次都讀,應該就不會漏掉吧」的想法。
但如果換成人類工作來比喻,就像每天上班前都要先把所有工作規則、作業手冊、產品設計文件、過去會議紀錄全部讀完一遍。
需要的資訊,應依資訊壽命與適用範圍來分。
在 GitHub Copilot 中,AGENTS.md 可以作為給 agent 的指示。
請注意檔名:
AGENTS.md
是複數,不是 AGENT.md。
放在 AGENTS.md 裡的,應該是幾乎所有任務都要遵守的短規則,以及指向相關資料的入口。
例如:
# Repository rules
- 回答與程式碼註解請用日文撰寫。
- 修改既有公開 API 前,先列出影響範圍。
- 作業完成後,執行對應變更的測試。
- 不要修改無關檔案。
# Architecture and design rules
- 修改公開 API 前,請先閱讀 `docs/adr/0002-api-versioning.md`。
- 更改 UI 外觀前,請先閱讀 `DESIGN.md`。
- 變更 DB schema 時,請確認 `docs/database/` 中對應的 ADR。
- 只有 UI 變更時,不要去讀後端設計文件。
重點不是把 DESIGN.md 的內容全部複製進來。
AGENTS.md 應該扮演一個路由器:
這次任務是什麼
↓
需要遵守哪些固定規則
↓
還要讀哪些額外資料
這樣一般的小改動只需要短的共通規則,只有在設計變更時才讀取詳細文件。
Agent Skills 是把特定作業所需的流程、知識、腳本、參考資料等集中起來的機制。
對初學者來說,可以把它想成專業作業的操作手冊。
例如,以下工作可以拆成 Skill:
Skill 不一定要一開始就把全文都讀進來,而是先根據 name、description 等資訊,判斷是否適用於這個任務。
選中之後,再讀 SKILL.md 本文與必要的參考檔。
反例:
description: 支援開發
這樣無法知道這個 Skill 什麼時候該用。
好的寫法應該具體說明對象工作與使用條件:
description: >
當要根據以 GitHub Copilot 為主題的技術文章章節草稿,
產生適合 Qiita 的 Markdown 文章本文時使用。
會參考原始素材、圖解生成紀錄與文風規則。
如果 description 太模糊,可能會導致需要的 Skill 沒有被選中,或在不相關的任務中被誤觸發。
這不只是 token 的問題,也會造成 AI 套用錯誤的作業流程。
如果把範例程式碼、完整 API 規格、過去案例、長清單全部塞進 SKILL.md,一旦觸發,context 會變得很大。
比較好整理的方法是這樣:
my-skill/
├─ SKILL.md
├─ scripts/
│ └─ validate.ps1
├─ references/
│ ├─ api-rules.md
│ └─ review-checklist.md
└─ assets/
└─ template.md
SKILL.md 只寫作業入口與判斷流程。
當需要詳細 API 規範時,再讀 references/api-rules.md;驗證流程則執行既有的 scripts/validate.ps1。
這樣就能避免每次都讀全部內容,而是逐步載入必要資訊。
DESIGN.md 在 Google Labs 官方儲存庫中,是作為「說明 coding agents 的 visual identity 的格式」公開的。
也就是說,它不是架構設計書或 DB 設計書,而是讓 AI 一致處理品牌與產品外觀的設計系統文件。
官方規格指出,DESIGN.md 主要由兩層構成:
YAML front matter 可定義這類 token:
version / name / descriptioncolorstypographyroundedspacingcomponents顏色可以寫成 CSS 顏色值,尺寸可以寫成帶單位的 Dimension,例如 px、em、rem。也可以使用像 {colors.primary} 這樣的 token 參照。
Markdown 本文可以只寫必要的章節。官方規格建議存在的章節順序如下:
重點是,不需要所有任務都一直載入。
即使檔名叫 DESIGN.md,也不代表 GitHub Copilot 在所有任務中都會自動讀取。相反地,如果從提示詞或 AGENTS.md 明確引用,也能在 GitHub Copilot 中作為 UI 生成或設計判斷的上下文。
因此,應從 AGENTS.md 或 Skill 以條件式參照它。
# AGENTS.md
- 新增 UI,或修改外觀時,請閱讀 `DESIGN.md`。
- 決定顏色、字體、間距、圓角、元件狀態時,請確認 `DESIGN.md` 的對應章節。
- 修改 API、DB、認證授權結構時,請確認 ADR 或 `docs/architecture.md` 等其他設計文件。
這樣有兩個好處:
也就是說,不是單純「不要讀」,而是要設計閱讀條件。
下圖顯示使用者任務如何以 AGENTS.md 為入口,分流到一般任務、Skill、DESIGN.md 等參考資料。

常駐規則要保持精簡,專業流程與設計系統只在需要的任務中載入。
簡單整理如下:
| 資訊 | 角色 | 何時讀取 |
|---|---|---|
AGENTS.md |
常駐規則與參考入口 | 任務入口 |
SKILL.md |
特定作業流程 | 對應作業觸發時 |
DESIGN.md |
設計系統 | 需要做 UI 或外觀判斷時 |
*.instructions.md |
路徑專屬規則 | 處理特定檔案或目錄時 |
| 使用者提示詞 | 這次特定條件 | 執行這次需求時 |
請依序使用以下問題。
如果是,優先考慮放進 AGENTS.md 或儲存庫共通的 Copilot instructions。
例如:
如果是,優先考慮做成 Agent Skill。
例如:
如果是,依內容分類放置。若是 UI 或外觀判斷,就放 DESIGN.md;若是架構或過去的技術決策,就放 ADR 或 docs/ 下的設計文件。
如果是,優先考慮路徑專屬 instructions 或接近目標檔案的 AGENTS.md。
如果是,就寫在使用者提示詞或任務文件中。
💡 配置原則
不要看檔名來決定,而是根據資訊壽命與適用範圍決定放哪裡。
MCP 是讓 AI 應用程式連接外部工具與資料的共通協定。
MCP 伺服器主要公開以下能力:
| 功能 | 內容 |
|---|---|
| Tools | 模型可執行的操作 |
| Resources | 檔案、DB schema、文件等上下文 |
| Prompts | 固定訊息或工作流程 |
使用 MCP 後,GitHub、資料庫、公司內部系統、瀏覽器等功能更容易被 AI 使用。
但如果可用的 MCP 伺服器或工具無限制增加,模型需要用來選擇的資訊,以及工具執行結果,可能也會變大。
這裡要思考的不是「要不要接 MCP」,而是要讓模型看到什麼、回傳什麼。
MCP server 與 client 之間會進行工具列表取得、資源列表取得、工具執行、資源讀取等通訊。
概念上像這樣:
MCP 伺服器
├─ Tools
├─ Resources
└─ Prompts
↓ MCP 通訊
MCP 客戶端 / Agent runtime
↓ 選擇必要的定義、本文、結果
LLM 的上下文
MCP 伺服器回傳的資訊,client 要傳給模型多少,會依實作而不同。
因此要分成兩件事:
影響 LLM 輸入的代表例子如下:
AI 要選工具,就必須理解工具的用途與參數。
例如這樣的定義:
{
"name": "search_issues",
"description": "Search issues in the selected repository.",
"inputSchema": {
"type": "object",
"properties": {
"repository": {
"type": "string"
},
"query": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": ["repository", "query"]
}
}
如果只有一個工具,通常問題不大;但如果有數十個、數百個類似工具,提示給模型的定義量就會增加。
另外,如果 description 很長、input schema 很複雜、還包含大量範例與限制,即使只有一個工具也會變大。
可行的 client 端做法包括:
但實際可用哪種方式,取決於所使用的 client 或 agent runtime。
在實務上,tool result 往往比 tool schema 更容易變大。
反例:
{
"issues": [
{
"number": 1,
"title": "...",
"body": "長文內容...",
"comments": ["所有留言..."],
"events": ["所有事件..."]
}
]
}
如果只是要列表,卻把本文、全部留言與全部事件都回傳,模型要讀的資訊就會增加。
列表型工具只應回傳必要欄位:
{
"issues": [
{
"number": 1,
"title": "登入流程會逾時",
"state": "open",
"updatedAt": "2026-06-15"
}
],
"nextCursor": "..."
}
需要詳細內容時,再用另一個工具取回 Issue 本文或留言。
search_issues
↓ 回傳 20 筆列表
AI 選定目標
↓
get_issue
↓ 回傳選定 1 筆的詳細資料
這種把「列表」與「詳細」分開的設計,不只對 MCP 有效,對一般 API 設計也一樣有效。
resources/list 取得資源清單,與 resources/read 讀取本文,要分開看。
即使清單很短,若本文很大,讀取時仍然會消耗上下文。
例如,不要每次都把 5000 行的 DESIGN.md 全文讀進來,可以考慮:
要讓回傳結果變小,MCP 伺服器端的工具設計也很重要。
像這樣的參數,能讓 client 或 AI 更容易控制輸出量:
{
"name": "search_issues",
"description": "Search issues and return a limited summary.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10
},
"fields": {
"type": "array",
"items": {
"type": "string",
"enum": ["number", "title", "state", "updatedAt"]
}
}
},
"required": ["query"]
}
}
實務上常見且好用的控制項有:
limit:最大筆數cursor:分頁fields:要回傳哪些欄位top_k:只回傳相關度前幾名include_body:是否包含本文max_chars:最大字數summary:回傳摘要而非全文重點不只是叫 AI「把結果縮短」,而是從工具介面本身就能限制。
MCP 很方便,但不需要把所有處理都做成 MCP 工具。
特別是當 Skill 或固定提示詞中,使用的工具與執行步驟已完全確定時,固定 CLI 指令反而更簡單。
例如,Skill 中寫了這樣的流程:
如果要使用的命令是唯一且明確的,就不必讓 AI 從多個 MCP 工具中選擇,直接執行以下命令即可:
git diff --name-only
dotnet test --logger "console;verbosity=minimal"
固定 CLI 的好處包括:
可簡化成一句話:
如果要讓 AI 選擇要用哪個工具,就用 MCP。若 Skill 已經決定「就用這個命令」,那就可以考慮 CLI。
下面這張圖比較 MCP 與 CLI 的路徑。

如果要讓 AI 選擇操作,就用 MCP;若 Skill 已經決定流程,CLI 也可以是候選。兩者都能控制回傳給模型的資訊量。
這是容易誤解的地方。
使用 CLI 不代表自動省 token。
像這些命令都可能產生大量輸出:
git log
dotnet test --verbosity diagnostic
Get-ChildItem -Recurse
kubectl logs deployment/my-app
如果把大量輸出原封不動傳給模型,和 MCP 的 tool result 一樣,仍然會吃掉上下文。
CLI 也應該像這樣盡量縮小輸出:
# 只列出變更的檔名
git diff --name-only
# 只看最近 20 筆
git log -n 20 --oneline
# 只留下包含錯誤的行
dotnet test --logger "console;verbosity=minimal" |
Select-String -Pattern 'Failed|Error'
# 將 JSON 限縮到必要欄位
gh issue list --limit 20 --json number,title,state
比起 CLI 與 MCP 的差異,最後實際傳給模型的資訊量更重要。
以下情況下,MCP 比較合適:
整理成目的別表格如下:
| 條件 | MCP | CLI |
|---|---|---|
| AI 動態選擇操作 | 適合 | 不適合固定流程 |
| 型別化參數 schema | 適合 | 可作為命令參數管理 |
| 認證 / 權限共用 | 伺服器端較容易實作 | 每個 CLI 可能不同 |
| 重用既有開發命令 | 需要 MCP 化 | 直接可用 |
| 供多個 client 使用 | 適合 | 環境差異較大 |
| 固定的一連串流程 | 可能過度設計 | 適合 |
| 輸出控制 | 透過工具設計控制 | 透過選項或後處理控制 |
不要問「MCP 與 CLI 誰比較好」,而是根據是否需要選擇、權限管理、重用性、結果量來決定。
處理長指示、工具定義與對話歷史時,常會提到 Prompt Caching。
Prompt Caching 很有用,但不能取代上下文設計。
這裡先分成三件事:
在上下文設計中,最重要的是一開始就不要放入這次判斷不需要的資訊。
例如:
這不只是減少輸入 token,也能減少 AI 判斷上的雜訊。
Prompt Caching 是指在多個請求之間,重用共通輸入前半段,也就是 prefix 的計算。
概念上如下:
第 1 次
[固定 instructions][固定 tools][固定文件][問題 A]
└──────── 建立快取 ────────┘
第 2 次
[固定 instructions][固定 tools][固定文件][問題 B]
└──────── 讀取快取 ────────┘
如果固定部分相同,後續請求就可以重用。
可能成為快取對象的固定資訊包括:
但如果工具順序、schema、時間戳、前半段訊息等改變,共通 prefix 可能就會被破壞。
另外,MCP 伺服器儲存結果,和 Prompt Caching 是不同機制。
MCP 伺服器端快取
→ 重用 API 呼叫或 DB 搜尋結果
Prompt Caching
→ 重用傳給模型的共通輸入計算
即使某個 MCP 工具回傳了相同內容,如果它沒有被作為共通 prefix 再送進下一次模型輸入,也不一定算是 Prompt Caching 命中。
上下文壓縮是把變長的對話歷史,替換成較短摘要的想法。
例如有以下歷史:
User: 說明需求
Assistant: 調查結果
Tool: 檔案列表
Assistant: 設計方案
User: 修改需求
Tool: 測試結果
Assistant: 修正版
可壓縮成這樣的摘要:
目前為止的決定:
- 不修改公開 API
- 只修改 OrderService
- 已新增 3 個測試
未解決:
- timeout 值尚未決定
下一步:
- 確認設定值並完成實作
這樣即使不保留全部舊對話,也能延續重要決策。
不過,壓縮時有可能遺失細節。之後可能還需要的原文,最好另外保存在檔案或外部紀錄中。
下圖呈現設計、快取與壓縮的差異。

上下文削減、快取、壓縮是不同對策,解決的問題也不同。
實作順序可以這樣想:
不要一開始就塞入大量不必要的資訊,然後覺得「反正可以快取就沒問題」。
即使計費變便宜了,AI 讀到不必要資訊後仍會產生判斷問題。
在 Claude API 中,可以透過 usage 資訊確認 Prompt Caching 的使用狀況。
常見值如下:
{
"usage": {
"cache_creation_input_tokens": 5000,
"cache_read_input_tokens": 0,
"input_tokens": 80
}
}
如果 cache_creation_input_tokens 增加,表示有輸入被寫入快取。
後續請求若出現 cache_read_input_tokens 增加,表示實際從快取讀取了資料:
{
"usage": {
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 5000,
"input_tokens": 60
}
}
也就是說,確認時可以這樣理解:
詳細內容請參考Anthropic 的 Prompt Caching 官方文件。
在 OpenAI API 中,針對較長的 prompt,Prompt Caching 會自動套用。
可透過回應中的 usage 裡的 cached_tokens 查看使用狀況。
{
"usage": {
"prompt_tokens": 4200,
"prompt_tokens_details": {
"cached_tokens": 3072
}
}
}
把固定的 instructions、工具定義等共通資訊放在前面,把每次不同的使用者輸入放在後面,較容易形成共通 prefix。
詳細內容請參考OpenAI 的 Prompt Caching 官方文件。
GitHub Copilot、Claude API、OpenAI API 即使使用到相同模型,使用者能操作的設定也不完全一樣。
像 Claude API 的 cache_control 這類設定,並不表示你可以直接把同樣 JSON 寫進一般的 GitHub Copilot prompt 就生效。
在 GitHub Copilot 中,是由 Copilot 服務端或所使用的模型側來管理快取。
因此要分開說明:
| 使用方式 | 快取處理 |
|---|---|
| 直接使用 Claude API | 依 API 規格設定並查看 usage |
| 直接使用 OpenAI API | 查看自動快取與 usage |
| 使用 GitHub Copilot | 依 Copilot 的功能、顯示與計費規格 |
「Claude 可以這樣設定」不代表「Copilot 也能指定同樣的 JSON」。
※產品規格、支援模型、價格與快取保留時間都可能變動。實作時請確認各服務最新的官方文件。
在上下文設計裡,不只有「讓它讀什麼」很重要,讓哪個模型來讀也很重要。
即使提示詞、檔案、工具結果都相同,模型不同,仍可能有這些差異:
在 GitHub Copilot 中,Chat 有時可以選模型。可用模型會依方案、組織政策、使用位置(例如 IDE 或 GitHub.com)而不同。
因此,比起固定「永遠都用某個模型」,更實務的做法是依任務類型選擇。
GitHub Docs 也說明了不同模型各有強項,AI Credits 的消耗也會依模型 token 價格而異。最新支援狀況請參考GitHub Copilot 的模型比較與更換模型的步驟。
初學者可以先以 Auto 為基準。
在支援的環境中,Auto 會根據可用性等條件選擇模型。當你還不確定為什麼需要手動選模型時,使用 Auto 可以減少糾結在模型選擇上的時間。
不過,把選擇交給 Auto,與放棄設計是兩回事。
以下情況值得手動選擇模型:
做法上可以是:平常預設 Auto,需要時再明確切換。
模型名稱會變。新模型會加入,preview 會結束,組織政策可用的模型也會改變。
因此,在文章或團隊規則中,比起只寫特定模型名稱,更適合用以下角色來思考:
| 層級 | 適合的工作 | 注意事項 |
|---|---|---|
| 高推理模型 | 設計、規劃、困難除錯、審查、安全性判斷 | 品質高,但成本與等待時間通常較高 |
| 標準模型 | 一般實作、補測試、跨檔案修改、文件更新 | 猶豫時的中心選項 |
| 輕量模型 | 小型重構、格式轉換、摘要、簡單文案修改 | 不要把複雜設計判斷全丟給它 |
例如可這樣分工:
調查・規劃:高推理模型或 Auto
一般實作:標準模型或 Auto
簡單修正:輕量模型
審查:高推理模型
大量定型處理:輕量模型 + 測試 / linter
重點不是「要用貴模型還是便宜模型」。
而是要選擇具備足夠分析能力的模型,再用上下文、測試與人工審核補足品質。
遇到不順利時,很容易馬上切到更高階模型。
但失敗原因有時不是模型能力,而是上下文設計。
這種情況下切換到高效能模型,確實有時會改善。
但那可能只是「模型夠強,勉強撐住了雜亂輸入」。若要讓運用可重現,還是得先整理輸入。
建議順序如下:
/context 或 /usage 確認哪裡膨脹了高效能模型不是拿來處理大量不必要資訊的,而是拿來專注處理困難判斷的。
還有一個常被混淆的地方。
GitHub Copilot Chat 選用的模型,和編輯器中的 Inline suggestion 使用的模型,不一定是同一設定。
GitHub Docs 也說明,Chat 的模型變更不會影響 Inline suggestion 的模型,且 Inline suggestion 端還會受到可用替代模型與擴充功能版本的條件限制。
因此要分開思考:
| 場景 | 主要用途 | 看模型選擇的方式 |
|---|---|---|
| Copilot Chat / Agent mode | 調查、說明、規劃、多檔案修改 | 依任務難度與審查風險選擇 |
| Inline suggestion | 輸入中程式碼補全 | 依速度、手感與可用模型選擇 |
| Cloud agent / CLI | 非同步工作、長時間作業、工具執行 | 同時考慮成本、執行時間與審核邊界 |
所以,「Chat 用高推理模型,但補全用輕快模型」這樣的搭配是可行的。
如果團隊要運作模型選擇規則,與其每次口頭交代,不如寫進 AGENTS.md 或 Skill。
例如:
# Model selection
- 一般實作與補測試,使用 Auto 或標準模型。
- 架構變更、認證授權、安全性判斷時,考慮使用高推理模型。
- 單純文案修改、格式轉換、輕微重構時,優先使用輕量模型。
- 如果切換模型,請在工作備註中留下原因。
這裡同樣不建議只固定某個模型名稱。
組織可用的模型、base model、LTS model、費用與政策都可能變動。重點不是名稱,而是針對哪種判斷使用哪種推理能力。
💡 模型選擇的結論
猶豫時先以 Auto 為基準;在困難的設計、除錯、審查時,考慮高推理模型。輕量的定型工作則偏向輕量模型或 CLI,品質則由測試與審查支撐。
前面主要是在講 token 與上下文。
但實務上真正要最佳化的,不只是 token。
AI 活用時,要一起考量以下四件事:
本文將其整理為CDQR。
Cost 不是只看提示詞字數,而是看整個處理流程。
有時候,稍微增加適當的 instructions,反而能減少重做次數,讓總 token 降低。
Cost 改善不只是「讓輸入更短」,也包括「減少來回次數」與「切換到適合任務的模型」。
AI 自動化很適合以下工作:
但有時候,把作業流程固定成 Skill 或 CLI,反而比每次都讓 AI 思考流程更快。
例如,如果每次都用同一個測試指令,那就不需要讓 AI 從一堆工具裡找測試工具。
# SKILL.md
驗證時依下列順序執行:
1. `dotnet format --verify-no-changes`
2. `dotnet test --logger "console;verbosity=minimal"`
3. 若失敗,只回報錯誤周邊內容
把不需要判斷的部分固定起來,讓 AI 專注在需要判斷的部分,效率會更高。
為了減少 token 而不讓它讀設計文件,短期內輸入可能變少。
但可能會造成這些品質問題:
要維持品質,就不能把選擇變成「要嘛全部讀,要嘛都不讀」。
應在 AGENTS.md 中寫清楚何時要讀設計文件:
- 變更公開 API 時,請閱讀 `docs/api-design.md`。
- 變更認證授權時,請確認 `docs/security/`。
- 變更 DB 時,請確認 migration 與 rollback 流程。
只在必要任務中加入適當資訊,就能兼顧上下文量與品質。
即使 AI agent 可以自主作業,也不代表所有事情都應該無條件批准。
應保留人類審核的代表情況包括:
AI 可以協助調查候選方案、產生差異、執行測試、整理審查材料。
但「是否接受這個風險」以及「是否正式採納這個規格」,仍然是組織或負責人的判斷。
| 軸 | 要確認的問題 |
|---|---|
| Cost | 是否有不必要的輸入、輸出或重試 |
| Delivery | 交給 AI 後,整體作業是否真的更快 |
| Quality | 是否在必要範圍內讓它讀到設計意圖、限制與驗證條件 |
| Review | 是否保留人類應該批准的邊界 |
模型選擇也可以放進這張表裡一起判斷。
token 最佳化並不只是改善 CDQR 裡的 Cost。
透過上下文設計,也能一起改善 Delivery、Quality、Review。
接著把以上內容套用到一個有管理介面的假想 Web API 專案。
shop-api/
├─ AGENTS.md
├─ DESIGN.md
├─ README.md
├─ src/
│ ├─ Api/
│ ├─ Application/
│ └─ Infrastructure/
├─ tests/
├─ docs/
│ ├─ architecture.md
---
原文出處:https://qiita.com/ochtum/items/d442ed23d24245b789a0