對應原題(Common ‧ Agents and Tool Use;Anthropic)

  • How many tools is too many? How do you design tool schemas an LLM can actually use correctly?
    — Asked at: Anthropic, Cognition
  • Design the tool surface for a coding agent: which tools exist, what their schemas look like, and how results come back. — Asked at: Anthropic
  • What matters more for an agentic coding tool like Claude Code: the model or the harness? — Asked at: Anthropic

🎯 什麼情境該想到我

當你「agent 選錯工具、或工具回傳把上下文吃光」的時候。
★ 工具定義不是 API 文件,是 prompt。 它每一次呼叫都被送進模型,而且直接決定模型的決策品質。

⚙️ 怎麼用

★ 一、「幾個太多」——問錯問題了

沒有絕對數字,因為真正的瓶頸不是數量,是可區分性。

三個真實的失效機制:

機制說明
1. Token 固定開銷每個工具的 schema 每次呼叫都要重送。50 個工具可能就是 10k+ token 的固定成本——每一步都付一次(見 ReAct 與 Agent Loop 的 成長)
2. ★ 選擇困難工具越多、描述越相似,選錯率越高。這是主要殺手
3. 上下文稀釋工具定義佔掉的位置,就是真正的任務內容佔不到的位置

★ 關鍵洞察:3 個描述重疊的工具,比 20 個界線清楚的工具更糟。

❌ 糟糕(3 個,但會選錯)
   search_docs      「搜尋文件」
   find_documents   「尋找相關文件」
   query_knowledge  「查詢知識庫」
   → 模型無從判斷差別,只能亂猜

✅ 良好(3 個,界線清楚)
   search_internal_wiki  「搜尋公司內部 wiki。用於政策、流程、團隊資訊。
                          不要用於程式碼或客戶資料。」
   search_codebase       「搜尋本專案原始碼。用於找函式定義與用法。」
   query_crm             「查詢客戶資料庫。需要客戶 ID 或 email。」

★ 所以要量的不是數量,是「工具選擇準確率」:

建一組 (查詢 → 正確工具) 的測試集 → 量準確率
每加一個工具就重跑一次 → 準確率掉了就是加太多了

這是一個可以直接寫進 CI 的數字。 面試講得出這個做法,比講「大概 20 個」有價值得多。

工具太多時的四種解法

解法做法
參數化取代增生★ 一個 search(source: enum[wiki, code, crm], query),而不是 3 個 search_X
動態工具載入依對話階段或意圖,只暴露相關子集
工具檢索(tool RAG)對工具描述做語意檢索,只把 top-k 放進 context。工具數量上百時的標準做法
子 agent 封裝把一整群工具包成一個「資料庫專家」工具,由子 agent 內部分派(見 多 Agent 編排與 Agent Drift)

★ 二、Schema 設計的八條規則

#規則❌✅
1名稱:動詞開頭、具體docssearch_internal_docs
2★ 描述寫「何時用/何時不要用」「搜尋文件」「搜尋公司內部文件。用於政策與流程問題。不要用於程式碼搜尋(改用 search_codebase)或即時資料。」
3參數越少越好,必填越少越好8 個參數1 必填 + 2 選填
4★ 用 enum 取代自由文字status: stringstatus: enum["open","closed","pending"] —— 自由文字模型一定會亂填
5參數名要自我說明d1, d2start_date_iso8601, end_date_iso8601
6避免深層巢狀四層巢狀物件扁平化,必要時拆成兩個工具
7在描述裡放範例—例:query="退款政策", source="wiki"
8★ 不要讓模型拼裝需要精確知識的字串run_sql(query: string)query_orders(customer_id, date_range) —— 除非你能驗證並沙箱化

第 2 條是最高投報率的一條。 大多數工具描述寫的是「這個工具做什麼」(模型從名稱就猜得到),而模型真正需要的是「什麼時候該選我、什麼時候不該」。

第 8 條的例外:Text-to-SQL、程式碼執行這類工具本質上就是要模型拼字串。這時必須配:唯讀權限、schema 白名單、查詢逾時、結果筆數上限、以及執行前的驗證(見 可逆性、審計與人類把關)。

★ 三、回傳設計(最常被忽略的一半)

工具回什麼,和工具做什麼一樣重要——因為回傳值會直接進入模型的上下文。

原則說明
資訊密度要高丟 5000 行 raw JSON 給模型,等於燒掉上下文又沒幫上忙。只回需要的欄位
★ 截斷要明示並可續讀...(已截斷,還有 1,240 行。用 offset=100 繼續讀) —— 靜默截斷會讓模型以為它看到了全部,這是危險的 bug
錯誤要可行動❌ Error: 400 ✅ 錯誤:date 格式須為 YYYY-MM-DD,收到 "上週"。
結構化但好讀表格、清單優於巢狀 JSON。模型讀 Markdown 表格比讀深層 JSON 準
★ 附帶「下一步」的線索「找到 3 個相符檔案。用 read_file 讀取內容。」——省下模型一次猜測
空結果要說清楚❌ [] ✅ 在 wiki 中找不到「量子退火」的相關內容。試試更廣的關鍵字,或改用 search_codebase。

★ 四、Coding Agent 的工具面(Anthropic 那題)

一個經得起推敲的最小工具集:

工具為什麼需要
read_file(path, offset?, limit?)讀。必須支援分段,否則大檔直接爆上下文
write_file(path, content)建新檔
edit_file(path, old_string, new_string)★ 精確取代,不是重寫整檔——省 token,且改動範圍可審查
bash(command, timeout)萬用逃生口:測試、建置、git、任意 CLI
grep(pattern, path?) / glob(pattern)定位。沒有這兩個,模型只能亂猜檔名

設計理由:

  • 正交 —— 每個工具做一件事,彼此不重疊,模型不用在相似選項間猶豫
  • 可組合 —— glob → grep → read → edit → bash(test) 是完整的工作流
  • 對應開發者的真實動作 —— 模型在預訓練時見過大量這樣的操作敘述
  • edit 而不是 write —— 精確取代讓 diff 小、可審、可回退(見 工具-外科手術式修改)

關鍵回傳設計:

  • read_file 回傳帶行號(模型才能精確指出要改哪裡)
  • edit_file 的 old_string 必須唯一,不唯一就報錯——這強迫模型先讀再改,防止盲改
  • bash 回傳 stdout + stderr + exit code,三者都要

★ 五、模型 vs Harness(Anthropic 那題)

答案不是二選一,而是講清楚各自決定什麼:

決定什麼
模型能力天花板 —— 它能不能想出對的做法
★ Harness失敗的下限與可靠度 —— 想對了之後,會不會被執行環境搞砸

好的 harness 讓中等模型可用;爛的 harness 讓最強的模型也失控。

Harness 的核心價值是「可驗證的回饋迴圈」:

模型改了程式碼 → harness 自動跑 測試 / 型別檢查 / lint
               → 把失敗訊息餵回去
               → 模型自我修正

有這個迴圈,模型的錯誤會被收斂;沒有,錯誤會累積。
這也是為什麼 coding agent 比其他領域的 agent 成功得多——程式碼有編譯器和測試,是天然的 verifier(見 工具-讓LLM產出可驗證的產物、工具-把命令變成可驗證的目標)。

面試答法:「模型決定天花板,harness 決定地板和方差。在真實產品裡,方差比天花板更痛——所以我會先投資 harness:精確的編輯工具、可靠的回饋訊號、清楚的錯誤訊息、預算與護欄。」

⚠️ 注意 / 什麼時候不適用

  • 工具描述會被注入。第三方 MCP server 的工具描述進了你的 prompt——它是不可信輸入(見 工具-MCP安全防護要點)。
  • 加工具前先量準確率。「多一個總不會怎樣」是工具集腐化的開始。
  • schema 改了要重測。模型對描述措辭很敏感,改一句話可能讓選擇準確率掉好幾個百分點。
  • 別把所有東西都做成工具。能用固定流程直接執行的,不要讓模型決定。
  • 回傳不要含大量樣板(HTTP header、完整 stack trace)。那是給人看的,不是給模型看的。
  • 各家的 schema 支援度不同(JSON Schema 的哪些關鍵字有效、strict mode、巢狀深度)。換供應商要重測。
  • 工具數量與選擇準確率的關係是非線性的。可能 15 個都很好,第 16 個(和第 7 個相似)一加就崩。

🧪 我實際套用的紀錄

  • 2026-09-20:從面試題庫展開。待辦:為現有工具集建一組「查詢 → 正確工具」測試集,放進 CI。

🔗 相關