Token、成本與效率
帶著一支 Agent 團隊工作,token 用量會比聊天多出好幾倍。這堂課教你先量再省:看懂 Agent 的 token 花在哪裡,再用三個方法控制成本:管理上下文、為工作挑對模型、善用快取。
這是這個單元的最後一堂。你已經會讓 Agent 平行工作、各自有工作區、交給 CI 檢查,也會安全地做大型重構。最後要談一件很實際的事:這一切要花多少錢?
在 LLM API 單元,你學過費用是怎麼算的:輸入 token 乘輸入單價,加上輸出 token 乘輸出單價。這個公式沒有變,但 Agent 的工作方式,讓 token 用量的長相很不一樣。
Agent 的 token 花在哪裡?
還記得 Agent 迴圈那堂課嗎?Agent 每走一步,都要把整份對話歷史連同新的工具結果一起送給模型。所以它的用量不是一步一步慢慢加,而是越滾越大:
讀進來的東西不會只付一次錢,之後的每一步都會再帶著它。
在 Claude Code 裡,一次請求的輸入通常包含:
- 固定的部分:Claude Code 的系統提示、工具說明、你的
CLAUDE.md。 - 累積的部分:你們的對話、Agent 讀過的每一個檔案、每一次指令的輸出(例如上千行的測試紀錄)。
- 另外算的部分:每個子代理、每個平行的 Agent,都有自己的上下文,各自計費。
輸出則包含回答、修改的程式碼,以及模型回答前的思考過程。
先量,再省
不要憑感覺省錢。先看看錢花在哪裡:
/usage:查看用量。用 API 金鑰計費時,會顯示這次工作階段的 token 用量和估計費用;用訂閱方案時,會顯示方案額度的使用狀況,以及用量主要花在哪裡的建議。/context:查看目前上下文被什麼佔滿,例如說明檔、工具、對話各佔多少。- 自己寫的 API 程式:每次回應的
response.usage都有輸入、輸出、快取的 token 數,記錄下來就是最準的帳本。
方法一:管理上下文
上下文越小,每一步越便宜,模型也越專注。
- 換工作就
/clear:做完一件事要開始不相關的下一件時,清空對話重新開始。舊的上下文只會讓之後每一步都多付錢。 - 太長就
/compact:同一件事還沒做完、對話卻很長了,用/compact把歷史摘要起來。可以加上提示,例如/compact 保留重構計畫的進度和還沒通過的測試,告訴它摘要時要留下什麼。 - 說明檔保持精簡:
CLAUDE.md每次都會被讀進來。只寫每次都需要的規則,只有特定工作才需要的長篇說明,可以另外放,需要時再請 Agent 讀。 - 冗長的工作交給子代理:第一堂學的子代理在這裡又派上用場。跑測試、讀紀錄檔、大範圍搜尋,讓子代理在自己的上下文裡處理,主對話只收到摘要。
- 任務說具體:「改善這個專案」會讓 Agent 到處翻檔案;「在 storage.py 的 add_expense 加上金額不可為負數的檢查」只需要讀一兩個檔案。
方法二:為工作挑對模型
模型越強,通常單價越高。但不是每件事都需要最強的模型:
| 工作類型 | 適合的選擇 |
|---|---|
| 架構設計、困難的除錯、大型重構的規劃 | 最強的模型 |
| 日常寫程式、修 bug、補測試 | 中階模型通常就很好 |
| 跑測試整理結果、搜尋檔案、簡單的格式轉換 | 小模型就夠用,特別適合子代理 |
在 Claude Code 裡用 /model 切換模型,自訂子代理時可以在設定裡指定 model(第一堂的 test-runner 就用了小模型)。有些模型還可以用 /effort 調整思考的深度,簡單的工作調低一點,就能省下思考用的 token。
方法三:善用快取
在一次又一次的請求裡,開頭的部分常常一模一樣:同樣的系統提示、同樣的工具說明、同樣的說明檔、同樣的前半段對話。提示快取(prompt caching)就是讓這些重複的開頭,在第二次之後用便宜很多的價格讀取。
快取比對的是「從頭開始一模一樣的部分」。
好消息是,Claude Code 已經自動幫你使用快取,你不用做任何設定。但有兩件事值得知道:
- 快取會過期:一段時間沒有新請求,快取就會失效。休息很久回來的第一個請求,會比較貴一點。
- 開頭改了,後面全部重算:這是自己寫 API 程式時最需要注意的。
在自己的程式裡使用快取
舉一個問答小幫手的例子(如果你上過 RAG 單元,會覺得很眼熟):把一份很長的手冊放在系統提示裡,每個問題都重送一次,就很適合用快取:
from dotenv import load_dotenv
import anthropic
load_dotenv()
MODEL = "claude-sonnet-5-5" # 可以換成其他模型 ID
client = anthropic.Anthropic()
with open("handbook.md", encoding="utf-8") as f:
handbook = f.read() # 一份很長的手冊
system = [
{
"type": "text",
"text": f"你是員工手冊小幫手,只根據以下手冊回答。\n\n{handbook}",
"cache_control": {"type": "ephemeral"}, # 快取到這裡為止的內容
}
]
for question in ["特休要怎麼請?", "發票不見了怎麼辦?"]:
response = client.messages.create(
model=MODEL,
max_tokens=16000,
system=system,
messages=[{"role": "user", "content": question}],
)
u = response.usage
print(f"{question} 一般輸入 {u.input_tokens},"
f"寫入快取 {u.cache_creation_input_tokens},"
f"讀取快取 {u.cache_read_input_tokens}")
第一個問題會看到「寫入快取」有數字,第二個問題變成「讀取快取」有數字,代表手冊那一大段是從快取讀的。
幾個要注意的地方:
- 太短的內容不會被快取:每個模型有最低長度的門檻。如果兩個數字都是 0,可能是手冊太短,換一份長一點的文件試試。
- 固定的放前面,會變的放後面:問題每次不同,所以放在最後的
messages裡。如果你在系統提示的開頭放了「現在時間」,每次都不一樣,快取就永遠用不到。 - 詳細的計價和規則:快取讀取和寫入的價格、過期時間,請以 Claude 官方文件中關於 prompt caching 的說明和定價頁為準。
把整個單元串起來
這五堂課,你學到的其實是同一件事的不同面向:在效率和可靠之間找到平衡。
- 平行和子代理讓事情更快,但要拆得好,而且你得檢查得完。
- Worktree 讓平行不互相干擾,合併時一次一個。
- CI 和測試守住品質,AI 審查多一雙眼睛,最後由你決定。
- 大型修改小步前進,每一步都有退路。
- 成本先量再省,上下文、模型、快取三個方法一起用。
這是本單元的最後一個練習,請把五堂課串成一份屬於你的工作手冊:
- 用你正在進行的專案,接下來一週照常和 Agent 工作,每件工作結束時執行
/usage,記下用量和你對結果的滿意度。 - 找出用量最高的兩件工作,執行
/context或回想過程,判斷它們是被什麼撐大的:讀了太多檔案、測試紀錄太長,還是對話一直沒清? - 針對這兩件工作,各挑一個方法改善(例如改用子代理跑測試、換小模型、做完就
/clear),下次做類似工作時比較用量。 - 寫一份一頁的「我的 Agent 工作流程」,放進專案的
CLAUDE.md或另一份文件,至少包含:什麼工作會平行、用 worktree 的步驟、CI 要通過哪些檢查、重構的規則,以及各類工作用哪個模型。 - 一個月後回頭看這份文件,把實際做不到或不需要的規則刪掉。好的流程是用出來的,不是一次寫完的。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。