所有入門單元免費開放 · 課程內容持續更新中

Token、成本與效率

帶著一支 Agent 團隊工作,token 用量會比聊天多出好幾倍。這堂課教你先量再省:看懂 Agent 的 token 花在哪裡,再用三個方法控制成本:管理上下文、為工作挑對模型、善用快取。

第 7.5 堂約 12 分鐘

這是這個單元的最後一堂。你已經會讓 Agent 平行工作、各自有工作區、交給 CI 檢查,也會安全地做大型重構。最後要談一件很實際的事:這一切要花多少錢?

在 LLM API 單元,你學過費用是怎麼算的:輸入 token 乘輸入單價,加上輸出 token 乘輸出單價。這個公式沒有變,但 Agent 的工作方式,讓 token 用量的長相很不一樣。

Agent 的 token 花在哪裡?

還記得 Agent 迴圈那堂課嗎?Agent 每走一步,都要把整份對話歷史連同新的工具結果一起送給模型。所以它的用量不是一步一步慢慢加,而是越滾越大:

四根越來越高的柱子:第 1 步只有說明檔和任務;第 2 步多了讀過的檔案;第 3 步再多了測試紀錄;第 4 步又多讀了 5 個檔案。每一根柱子都是一次付費的請求

讀進來的東西不會只付一次錢,之後的每一步都會再帶著它。

在 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 工作流程

這是本單元的最後一個練習,請把五堂課串成一份屬於你的工作手冊:

  1. 用你正在進行的專案,接下來一週照常和 Agent 工作,每件工作結束時執行 /usage,記下用量和你對結果的滿意度。
  2. 找出用量最高的兩件工作,執行 /context 或回想過程,判斷它們是被什麼撐大的:讀了太多檔案、測試紀錄太長,還是對話一直沒清?
  3. 針對這兩件工作,各挑一個方法改善(例如改用子代理跑測試、換小模型、做完就 /clear),下次做類似工作時比較用量。
  4. 寫一份一頁的「我的 Agent 工作流程」,放進專案的 CLAUDE.md 或另一份文件,至少包含:什麼工作會平行、用 worktree 的步驟、CI 要通過哪些檢查、重構的規則,以及各類工作用哪個模型。
  5. 一個月後回頭看這份文件,把實際做不到或不需要的規則刪掉。好的流程是用出來的,不是一次寫完的。

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。