Techsy
聯絡我們
立即開始
回到部落格
ai-machine-learning

Agent Tool Calling 最佳實務:你的 Agent 為什麼總選錯工具

作者: Mert Batur
Aug 3, 2026
3 分鐘閱讀
目錄
Agent Tool Calling 最佳實務:你的 Agent 為什麼總選錯工具

Agent Tool Calling 最佳實務:你的 Agent 為什麼總選錯工具

Agent tool calling 最佳實務,是「能跑的 demo」與「在生產環境默默呼叫錯誤工具的 agent」之間唯一的防線。Anthropic 工程團隊實測,僅改寫一段工具描述,就將單次 tool result 從 206 token 壓到 72 token;Claude Code 更將每次工具回應硬性上限設為 25,000 token,因為膨脹問題確實存在。你的 agent 有四種失敗方式:選錯工具、寫錯參數、陷入無限迴圈、token 大量流失,而每一種都有本週就能上線的修法。

重點摘要:

  • Agent tool calling 的失敗恰好分四類:選錯工具、參數錯誤、失控迴圈、token 流失。
  • 工具描述是模型在選擇階段看到的唯一指令,因此能修正大多數選錯工具的問題。
  • 扁平、符合任務形狀的 schema 加上輸入驗證,能消除多數參數錯誤。
  • 精簡的工具回應與每次變更都跑評估迴圈,讓 token 成本與回歸問題可量化。

為什麼 agent tool calling 在生產環境會失敗?

Agent tool calling 有四種失敗模式:模型選了錯誤的工具、寫出錯誤的參數、陷入失控迴圈,或透過臃腫回應造成 token 流失。每種失敗命中呼叫迴圈的不同步驟,因此修復順序很重要。先處理選擇問題,因為選錯工具會污染後續所有步驟。

失敗模式發生在迴圈的哪個環節對應的修正實務工作量
選錯工具模型從工具清單中選擇1(描述)+ 4(命名空間、過濾)低
參數錯誤模型撰寫 tool_call JSON2(扁平 schema)+ 6(驗證)低-中
失控迴圈tool_result 回傳給模型3(原子化工具)+ 7(人工審核閘門)中
Token 流失tool_result 回到 context window5(精簡結果)+ 8(評估迴圈)低-中

完整處方一覽:

實務修正的失敗模式工作量
1. 撰寫模型能據以行動的描述選錯工具低
2. 維持扁平、符合任務形狀的 schema參數錯誤低
3. 將多步驟序列包裝為原子化工具失控迴圈中
4. 動態命名空間、裁剪與過濾工具選錯工具中
5. 回傳精簡、高訊號的結果Token 流失低
6. 驗證每次呼叫,讓錯誤成為教學參數錯誤中
7. 破壞性操作設人工審核閘門失控迴圈、安全性中
8. 每次工具變更都跑評估迴圈以上四種(回歸測試)中

按此順序逐一處理。實務 1 和 2 只需一個下午,就能消除你目前看到的大部分選錯工具與參數錯誤。工具描述不是文件,它是模型在選擇階段收到的唯一指令。

第一階段:設計模型真正能用的工具

Agent tool calling 中最便宜的可靠性提升,藏在工具定義裡,而不是 prompt 或模型選擇。模型從不讀你的 API 文件或 README。它只看到一個名稱、一段描述字串、一份 JSON schema,然後據此決定。把這三樣做對,選擇準確度就會在你動其他東西之前先提升。

實務 1:撰寫模型能據以行動的描述

把工具描述寫成給模型的指令,而不是 API 文件。一段能滿足人類開發者的描述(「users endpoint 的 REST 包裝」)對模型的決策毫無幫助。Anthropic 的工具撰寫工程指南與其工具定義最佳實務都推動同一個模式:說明何時使用該工具、回傳什麼、何時不該使用。

json
{
  "name": "get_user",
  "description": "Fetches a user profile. Use ONLY when you already have a user_id. Do NOT use to search or list users; call search_users instead. Returns name, email, plan. Errors if user_id is not a valid UUID."
}

對比多數團隊實際上線的版本:

json
{
  "name": "get_user",
  "description": "Gets a user."
}

兩條規則就能完成大部分工作。第一,參數命名要讓含義毫無歧義:用 user_id,絕不用 user 或 id,因為 user 會誘使模型把名稱或 email 傳到該放 UUID 的位置。第二,明確宣告排除條件。「Do NOT use to search users」比任何正面描述都能防止更多選錯工具的呼叫,因為模型混淆重疊工具的頻率遠高於誤解單一、邊界清晰的工具。關於這些定義如何送達 OpenAI、Anthropic 和 Google API 的底層機制,參見我們的多供應商 function calling 指南。

實務 2:維持扁平、符合任務形狀的 schema

輸入 schema 保持扁平,只包含任務實際需要的欄位,不多也不少。帶有選填分支的巢狀物件是參數錯誤的溫床:模型必須推斷它從未見過範例的結構。OpenAI function calling 指南接受任意 JSON Schema,但寬容不等於可靠。

json
{
  "name": "create_ticket",
  "parameters": {
    "type": "object",
    "properties": {
      "ticket": {
        "type": "object",
        "properties": {
          "details": {
            "type": "object",
            "properties": {
              "title": { "type": "string" },
              "meta": { "type": "object" }
            }
          }
        }
      }
    }
  }
}

把它攤平到任務層級:

json
{
  "name": "create_ticket",
  "parameters": {
    "type": "object",
    "properties": {
      "title": { "type": "string" },
      "priority": { "type": "string", "enum": ["low", "medium", "high"] },
      "assignee_id": { "type": "string" }
    },
    "required": ["title", "priority"]
  }
}

對任何有固定值集合的欄位,enum 優於自由文字。required 陣列優於全部選填。如果模型幾乎總是需要某個欄位,即使你的 API 將它標為選填,也在工具 schema 中設為 required。你不是在鏡像你的 API,你是在設計一個特定模型能正確填寫的介面。

第二階段:管理工具集,而不只是管理工具

當 agent 攜帶的工具超過一小撮,個別工具的品質就不夠了,因為選擇錯誤會隨模型讀取的清單長度而成長。

實務 3:將多步驟 API 序列包裝為原子化工具

把任何固定的 API 呼叫序列收縮為一個原子化工具。Anthropic 的工程文章以 schedule_event 和 get_customer_context 為範例:一次呼叫完成整件事,優於三次呼叫讓 agent 每次都必須正確串接。鏈條中的每一環都是模型可能卡住、錯誤重試或陷入迴圈的另一個回合。

python
# What the agent does WITHOUT an atomic tool: 3 calls, 3 chances to fail
calendar = call_tool("list_calendars", {})
free = call_tool("find_free_slot", {"calendar_id": calendar["items"][0]["id"], "duration": 30})
call_tool("create_event", {"calendar_id": calendar["items"][0]["id"], "start": free["start"]})

# One atomic tool: the sequence lives in your code, not the model's head
call_tool("schedule_event", {"duration": 30, "attendees": ["[email protected]"]})

經驗法則:如果模型每次都要在 A 之後呼叫 B,那 A 和 B 就是穿著兩套衣服的同一個工具。

實務 4:動態命名空間、裁剪與過濾工具

為每個工具名稱加上命名空間,並只讓每個 agent 看到目前任務需要的子集。通用名稱在你接上第二個整合的瞬間就會衝突。想像一個 agent 同時連接兩台 MCP server,兩者都暴露一個叫 search 的工具:兩個相同的動詞,無法區分。Anthropic 記錄了前綴命名空間帶來的可量化評估提升:

之前之後(前綴)之後(後綴)
searchasana_projects_searchsearch_asana_projects
createasana_tasks_createcreate_asana_tasks
search(第二台 server)github_repos_searchsearch_github_repos

裁剪與命名同等重要。支援 agent 在回答密碼問題時不需要載入帳單工具。Planner-worker 模式(由 planner 將任務路由給只載入相關工具的 worker)是標準修法;LangGraph 的動態工具載入教學有完整實作說明。多少工具算太多?把每個 agent 5-10 個當作工作範圍,而非鐵律:準確度隨清單增長而下降,解法是過濾,不是換更大的模型。如果你正在選擇路由與過濾層本身,參見我們的最佳 function calling 函式庫評比。

第三階段:控制回傳內容與輸出內容

迴圈是雙向的,而多數團隊只工程化了出站那一半。你的工具回傳什麼,決定了 context window 有多少能存活到下一回合;你的驗證拒絕什麼,決定了模型是從錯誤中學習還是重蹈覆轍。

實務 5:回傳精簡、高訊號的結果

回傳模型能據以行動的最小結果,用人类可讀的識別碼取代原始 ID。Anthropic 的工程文章記錄了一個工具,其預設結果長達 206 token;一個精簡的 response_format 設定將同樣的結果壓到 72 token,大約是原來的三分之一。把這乘以每個任務的數十次呼叫,它就決定了你的 agent 能不能跑完。

json
// Before: 206 tokens (shape per Anthropic's documented example)
{
  "status": "success",
  "data": {
    "id": "8f14e45f-ceea-3f9c-a2f3-90c1b5e0a7d2",
    "object": "task", "created_at": "2026-07-02T09:14:00Z",
    "updated_at": "2026-07-11T16:40:12Z", "completed_at": null,
    "assignee": {"id": "c9a1...f2", "object": "user"},
    "projects": [{"id": "b7d3...91", "object": "project"}],
    "permalink": "https://app.asana.com/0/.../f"
  }
}

// After: 72 tokens
{ "task": "Fix login redirect", "assignee": "Dana Kim", "project": "Web App", "due": "2026-07-20" }

同一來源還有兩個細節:Anthropic 在工具定義上支援 response_format enum(detailed 對 concise),讓你宣告想要的形狀,而不是解析消防水管。Claude Code 將工具回應上限設為 25,000 token,這是硬性天花板,無論如何都會截斷膨脹結果。Anthropic 也報告(作為他們的發現),將 UUID 解析為語義名稱可量化地減少了檢索幻覺,這就是上面「之後」的 payload 寫 "Dana Kim" 而非 c9a1...f2 的原因。臃腫回應也是成本問題;完整圖解參見我們的降低 LLM API 成本指南。

實務 6:驗證每次呼叫,讓錯誤成為模型的教學

在伺服器端驗證每次工具呼叫,並回傳包含修正方法的錯誤訊息。Martin Fowler 的 function calling 文章直言:永遠不要信任模型的輸出。它會在該放 enum 的地方傳字串,憑空捏造不存在的 ID。

python
def create_ticket(args):
    if args.get("priority") not in {"low", "medium", "high"}:
        return {"error": f"priority must be one of: low, medium, high. Got '{args.get('priority')}'. Pass priority='medium' for normal issues."}
    if not is_valid_uuid(args.get("assignee_id")):
        return {"error": "assignee_id must be a UUID. Call list_team_members to get valid IDs, then retry."}
    return db.create_ticket(**args)

錯誤字串就是全部。比較:

text
# Unhelpful: the model retries the same bad call
{"error": "invalid input"}

# Helpful: the model knows exactly what to change
{"error": "priority must be one of: low, medium, high. Got 'urgent'. Use 'high'."}

你的工具回傳的每條驗證錯誤,都是你為模型的下一次嘗試寫的 prompt。指出約束條件並指向修正工具的錯誤,能把重試迴圈變成一次就恢復。這也是你的第一道安全防線;我們的 LLM guardrails 指南有深入說明。

第四階段:先做到安全,再做到可量化

安全與量測是同一個階段,因為未設閘門的破壞性操作和未量測的回歸,都會以你事先看不到的事故形式浮現。先為無法撤銷的操作設閘門,再對一切埋設量測,讓下一次工具變更是有證據支撐的決策,而不是祈禱。

實務 7:破壞性操作設人工審核閘門

將讀取工具與寫入工具分開,並對任何破壞性操作加上人工確認閘門。MCP 規範的工具註解正是為此而設:destructiveHint 標記執行破壞性更新的工具,openWorldHint 標記觸及外部系統的工具,讓客戶端能在執行前提示確認。用它。

這個失敗模式不是假設性的。Laurent Kubaski 在他的 2025 年 7 月 tool-calling 文章中記錄了一個案例(原始報告已連結):使用者要求 Excel 中的 Copilot 操作第 4 列,agent 卻操作了第 8 列。錯誤的列與寫入操作之間沒有任何確認閘門。修法是 AWS 為 Bedrock Agents 記錄的模式:agent 準備操作、回傳以待核准、只在人工確認後才執行。Cursor 對檔案編輯也是這麼做的。在只需讀取的任務中將憑證範圍設為唯讀,並將確認閘門視為注入攻擊面的一部分,這個主題在我們的prompt injection 防禦指南中有完整討論。

實務 8:每次工具變更都跑評估迴圈

在每次工具變更前後跑一個小型評估套件,並按固定順序閱讀指標。Paragon 的優化指南提出了一個值得採用的四指標框架:

指標(依 Paragon)能抓到什麼如何量測
工具正確性選錯工具Agent 是否為該任務呼叫了正確的工具?
輸入準確性參數錯誤參數是否有效且完整?
任務完成率端到端失敗使用者的目標是否達成?
任務效率Token 流失、迴圈呼叫次數與 token 數?

Anthropic 的工具評估 cookbook建立在真實的 Slack 和 Asana MCP 評估之上,展示了好的和壞的評估任務長什麼樣:

text
# Weak: vague, many valid paths, impossible to score
"Use the Asana tools to organize some work."

# Strong: one correct tool, checkable arguments, binary outcome
"Create a task titled 'Renew TLS cert' in project 'Infra' assigned to [email protected], due 2026-08-15. Expect exactly one create_task call with those four fields."

我們的解讀(明確標示為我們的觀點):已發表的數字告訴你工作的順序。先檢查工具正確性,因為 Anthropic 自己的量測顯示描述和命名變更會直接影響它(206 到 72 token 的改寫、UUID 轉名稱的幻覺發現),把任務效率留到最後,因為它主要反映前三個指標已經抓到的失敗。入門套件設計 15-30 個任務,每個工具兩到三個,每個任務有一個預期呼叫和一個二元通過條件。這個規模足以抓到描述改寫帶來的回歸,而不需要花一週標註,我們將 cookbook 的 Slack 和 Asana 設定解讀為證據:這麼小的套件就是預設起點,而非捷徑。更深的機制在我們的生產環境 AI agent 評估指南中,如果你的評估結果顯示工具本身沒問題但編排有問題,那就是重新审视框架選擇的時機,參見最佳 AI agent 框架。

Agent tool calling 與 MCP 的差異

MCP 是傳輸與註冊標準,不是可靠性層,因此無論你的工具透過 MCP 送達還是內聯定義,同樣八項實務都適用。原生 tool calling 是模型供應商合約:模型如何發出 tool_call 並讀取 tool_result。MCP 標準化工具如何送達模型;它對模型是否選對工具毫無作為。

原生 tool calling 處理MCP 增加兩者都不處理
tool_call / tool_result 訊息格式共用協定,讓任何客戶端都能連接任何 server描述品質
供應商特定 schema工具發現與註冊Schema 設計、驗證
平行呼叫協商destructiveHint 等註解人工閘門、評估、回應衛生

一個暴露名為 search、描述為 "searches things" 的工具的 MCP server,其失敗方式與以同樣方式定義的內聯函式完全相同。先修定義,再擔心傳輸。我們的 Model Context Protocol 指南從頭到尾涵蓋了協定面。

Techsy 如何套用這八項實務

在每個客戶 agent 建置中,我們在其他東西上線之前先強制執行其中三項:描述寫成指令(實務 1)、每個寫入工具設驗證閘門(實務 6)、評估套件在部署前跑而非事故後跑(實務 8)。這三項涵蓋了選錯工具、參數錯誤,以及重新引入兩者的回歸,而我們偵錯過的每個生產環境 agent 事故都從這裡開始。其餘五項隨 agent 成長而加入。如果你的 agent 已過 demo 階段卻仍在選錯工具,預約免費諮詢,我們會告訴你八項中該先修哪一項。

關於作者

Mert Batur 是 Techsy.io 的共同創辦人,團隊為 B2B 客戶交付 AI agent、自動化系統與語音/SDR 管線。他撰寫 Techsy 團隊在生產環境實際使用的 LLM 工具堆疊。在 LinkedIn 上聯繫。

常見問題

什麼是 agent tool calling?

Agent tool calling 是 LLM 決定呼叫外部函式的機制:它發出一個結構化的 tool_call,等待你的程式碼回傳一個它能據以推理的 tool_result。這就是把聊天模型變成能查詢資料庫、呼叫 API、採取行動的 agent 的關鍵:模型選擇工具和參數,你的執行器負責執行。

Agent tool calling 迴圈如何運作?

迴圈有五個步驟:使用者請求送達模型、模型選擇工具並撰寫 tool_call、你的執行器執行它、tool_result 回傳給模型、模型回答或發出另一次呼叫。這個循環重複直到任務完成。本指南中的四種失敗模式各存在於此迴圈的特定步驟。

為什麼我的 agent 會選錯工具?

通常是因為兩個工具重疊,而它們的描述沒有說明誰是誰。模型僅根據名稱和描述做選擇,所以 "gets a user" 和 "finds users" 讀起來可以互換。修法:加上排除行(「do NOT use to search」)、命名空間名稱、減少 context 中的工具數量。Kubaski 的四模型測試顯示,即使是強模型也會在模糊的清單上路由錯誤。

如何強制 tool calling agent 結構化其輸出?

約束 schema,而非 prompt。對有固定值的欄位用 enum,對任務需要的任何東西用 required 陣列,用扁平物件取代巢狀物件。對最終回答(而非工具呼叫),OpenAI 的 structured outputs 和 Anthropic 的 tool-choice 模式等供應商功能可強制特定形狀。我們的結構化輸出指南涵蓋了兩條路徑並附程式碼。

Agent tool calling 與 MCP 的差異是什麼?

原生 tool calling 是你的程式碼與單一模型供應商之間的合約:tool_call 和 tool_result 的訊息格式。MCP 是一個協定層,標準化工具如何被發現並送達任何相容的客戶端。MCP 改變的是管線,而非可靠性。描述不良的工具無論走哪條路徑都會以同樣方式失敗,我們的 Model Context Protocol 指南有詳細說明。

LLM agent 的工具數量多少算太多?

把每個 agent 5-10 個工具當作工作範圍,而非鐵律。選擇準確度隨可見清單增長而下降,尤其當名稱或描述重疊時。解法不是更大的模型,而是過濾:只載入目前任務需要的子集,使用 planner-worker 分割。為所有東西加上命名空間,讓兩個整合永遠不會同時暴露一個裸的 search。

Tool calling 的最佳模型是什麼?

沒有單一答案,而這個領域已發表的基準測試老化很快。OpenAI、Anthropic 和 Google 的前沿模型都能通過基本工具使用任務,而搭配良好設計工具的較小模型,往往能以極低的 token 成本達到幾乎相同的任務完成率。建立實務 8 的 15-30 個任務評估套件,用你自己的工具測試候選模型。

如何降低 tool calling 的 token 成本?

削減回傳內容。回傳精簡、高訊號的結果,而非原始 API payload:Anthropic 記錄了一個 response_format 變更帶來 206 到 72 token 的削減。將 UUID 解析為名稱、丟掉模型從不使用的欄位,並記住每個工具結果在後續每個回合都會重新進入 context window。透過原子化工具減少呼叫次數,能從帳單中移除整個結果。

如何評估 tool calling 品質?

按順序評分四個指標:工具正確性(選對工具?)、輸入準確性(參數有效?)、任務完成率(目標達成?)、任務效率(token 與呼叫次數?)。撰寫 15-30 個任務,每個預期一個特定呼叫、可檢查的參數和一個二元通過條件。在每次工具變更前後都跑套件,讓描述改寫永遠不會在未量測的情況下上線。

結論

先診斷,再優化。你的 agent 選錯工具只有四種原因,而上述八項實務中的三項(描述、扁平 schema、過濾)能修正驅動多數生產環境事故的選擇失敗。從這裡開始,因為它們只需一個下午,而且它們是這個問題之所以可修的原因。保持驗證錯誤的資訊量、為任何破壞性操作設人工閘門、每次變更都跑評估迴圈,讓你在換模型之前先量測。選錯工具不是模型問題,而是工具設計問題,而設計掌握在你手中。

標籤

agent tool calling 最佳實務tool callingfunction callingAI agentLLM 工具MCPagent 評估

分享這篇文章

相關文章

更多「%s」主題文章 ai-machine-learning

ai-machine-learning
Aug 3, 2026

RAG vs Fine-Tuning:何時該用哪個?(附實測數據)

RAG 在查詢時檢索事實,fine-tuning 把知識寫進模型權重。一篇被引用 162 次的 arXiv 研究在同一任務上跑了兩種方法,結果出乎多數團隊意料。以下是決策框架,附公開定價的真實成本計算。

14 min read 分鐘閱讀
繼續閱讀
ai-machine-learning
Aug 2, 2026

多輪 LLM 評估:5 項指標、3 個框架、1 套工作流程

聊天機器人可以通過每一輪單輪測試,卻在第五輪時向使用者索要三輪前就給過的資訊。本指南涵蓋 5 項多輪評估指標、DeepEval、RAGAS 與 Langfuse 三大框架的差異,以及在 CI 中攔截回歸的 6 步工作流程。

14 分鐘閱讀 分鐘閱讀
繼續閱讀
ai-machine-learning
Aug 2, 2026

LLM 日誌最佳實踐:我們在生产環境遵守的 9 條規則 [2026]

來自每月處理 120 萬次 LLM 請求的團隊總結出 9 條日誌最佳實踐:14 個命名字段的結構化 JSON 記錄、寫入前 PII 脫敏、OpenTelemetry GenAI 追蹤、逐請求成本追蹤。附 Python 程式碼、每日百萬請求的儲存成本試算,以及工具比較。

14 min read 分鐘閱讀
繼續閱讀
查看全部文章
啟動專案

準備好創造點什麼了嗎 非凡體驗?

讓我們將你的願景化為現實。團隊已準備好,助你打造真正有影響力的軟體。

預約 30 分鐘需求討論查看作品

精選上架

Claude 技能

查看全部
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI 自動化作業

查看全部
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

精選上架

Claude 技能

查看全部
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI 自動化作業

查看全部
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

服務項目

  • 企業級解決方案
  • 手機應用程式
  • 網頁應用

解決方案

  • CRM 系統
  • AI 整合應用
  • ERP 整合系統
  • 語音助理代理
  • 工作流程自動化
  • 網路資安

資源庫

  • 部落格
  • 專案作品

社群

  • AI 自動化作業
  • Claude 技能

工具

  • 手機應用程式開發費用計算器
  • OpenAI / LLM API 費率計算器
  • MVP 開發費用計算器
  • 語音 AI 助理費用計算器

關於 TECHSY

  • 瀏覽
  • 合作夥伴
  • 聯絡我們

法律聲明

  • 私隱政策
  • 服務條款
  • Cookies說明

服務項目

  • 企業級解決方案
  • 手機應用程式
  • 網頁應用

解決方案

  • CRM 系統
  • AI 整合應用
  • ERP 整合系統
  • 語音助理代理
  • 工作流程自動化
  • 網路資安

資源庫

  • 部落格
  • 專案作品

社群

  • AI 自動化作業
  • Claude 技能

工具

  • 手機應用程式開發費用計算器
  • OpenAI / LLM API 費率計算器
  • MVP 開發費用計算器
  • 語音 AI 助理費用計算器

關於 TECHSY

  • 瀏覽
  • 合作夥伴
  • 聯絡我們
法律聲明私隱政策服務條款Cookies說明
TECHSY
© 2026 Techsy.保留所有權利。