API 開發

Tool use 入門:讓 Claude 伸手拿到它不知道的資訊

tool use 是讓 Claude 使用外部工具的機制:你先告訴它有哪些工具可用,它分析問題後發出結構化的工具請求,你的程式實際執行並把結果回傳,Claude 再結合新資料生出完整回答。透過這套往返流程,Claude 從靜態知識庫變成能操作即時資料的動態助理。
Tool use 入門:讓 Claude 伸手拿到它不知道的資訊:文章重點卡

Tool use 入門:讓 Claude 伸手拿到它不知道的資訊

Claude 預設只知道訓練資料裡的東西:問它「舊金山現在天氣如何」,它只能老實說自己查不到即時資訊。這不是它不聰明,是它天生沒有對外的手腳。

tool use 就是幫它裝上手腳的機制:用一套結構化的往返流程,讓 Claude 能開口要資料、你的程式負責去拿、拿回來再讓它把答案講完。這篇帶你看懂整條流程,並動手寫出第一個工具函式。

你將學到什麼

沒有工具的 Claude 卡在哪

訓練資料有截止日,即時資訊與外部系統它都碰不到。

四步往返流程

初始請求、工具請求、取得資料、最終回應,一次看懂。

工具函式的最佳實務

名字會說話、輸入要驗證、錯誤訊息要有內容。

動手寫第一個工具

從取得現在時間的函式開始,打好整個專案的地基。

沒有工具,Claude 會在哪裡撞牆

訓練資料有截止日,所以 Claude 拿不到時事、即時數據,也碰不到你的資料庫或內部系統。偏偏使用者要的常常就是這些:現在的天氣、最新的數據、系統裡的紀錄。

每次都回「抱歉,我沒有辦法取得最新的天氣資訊」,體驗很挫折,而且明明只差一步:只要有人把資料遞給它,它就答得出來。

Tool use 的完整流程:四步往返

你的應用(伺服器)Claude1 問題+工具說明2 工具請求:給我舊金山的天氣資料3 你的程式呼叫天氣 API,取回即時資料4 工具結果(即時天氣)5 結合問題與新資料,給出最終回答
真正去碰外部世界的一直是你的程式,Claude 負責決定要什麼、以及拿到後怎麼說
  1. 初始請求:你把使用者的問題,連同「有哪些工具可用」的說明一起送給 Claude。
  2. 工具請求:Claude 分析問題,判斷自己缺什麼資訊,回頭開出明確的需求單。
  3. 取得資料:你的伺服器執行程式,去外部 API 或資料庫把資料抓回來。
  4. 最終回應:你把資料傳回給 Claude,它結合原本的問題和新資料,生出完整的答案。

拿天氣當例子跑一遍:使用者問天氣,Claude 認出這需要即時資訊,發出「給我這個地點的天氣資料」的工具請求;你的伺服器呼叫天氣 API 把即時狀況回傳;Claude 再把資料揉進回答。整個過程中,真正去碰外部世界的一直是你的程式,Claude 只負責「決定要什麼」和「拿到之後怎麼說」。

一個剛剛好的練習題:提醒事項系統

這裡用的練習題是教 Claude 設提醒:對它說「幫我設個提醒,下下週四要看醫生」,它要能回「好,我會提醒你」。聽起來簡單,實際上正好踩中 Claude 的三個天生限制:

  • 它大概知道今天的日期,但不知道現在確切是幾點。
  • 它的日期加減不夠可靠,尤其是往後推算很多天的時候。
  • 它根本沒有「設提醒」這個能力,系統裡沒有這個機制。

對應的解法就是三個工具:取得現在的日期時間把一段時間加到某個日期上實際寫入一筆提醒。我們會從最簡單的那個開始,一次做一個,先把工具呼叫的流程走熟,再堆上更複雜的功能。

值得記住的原則模型有短板時,用工具補上它的能力,而不是在 prompt 裡想辦法繞過限制。這條心法,之後每一篇都會再用到。

工具函式怎麼寫才好用

工具函式本體就是一個普通的 Python 函式,在 Claude 判斷需要額外資訊時被執行。例如有人問「現在幾點」,Claude 就會呼叫你的日期時間工具。寫的時候有三條最佳實務:

  • 名字要會說話:函式名與參數名都要清楚表達用途,Claude 是靠這些名字理解工具的。
  • 輸入要驗證:必填參數是空的或不合法,就明確拋出錯誤,不要默默吞掉。
  • 錯誤訊息要有內容:Claude 看得到錯誤訊息,寫得清楚,它就可能修正參數再試一次。

動手寫第一個工具

from datetime import datetime

def get_current_datetime(date_format="%Y-%m-%d %H:%M:%S"):
    if not date_format:
        raise ValueError("date_format cannot be empty")
    return datetime.now().strftime(date_format)

# Default format: "2024-01-15 14:30:25"
get_current_datetime()

# Just hour and minute: "14:30"
get_current_datetime("%H:%M")

這個函式接受一個格式字串參數,讓 Claude 能指定要的時間格式,預設回傳完整的日期加時間。開頭那行驗證看起來多餘(這個錯誤不太可能發生),但它示範的是模式本身:輸入不合法就大聲說出來,給 Claude 一個修正重試的機會。

函式寫好只是第一步。Claude 目前還不知道它的存在:下一步是為它寫一份 JSON schema,描述工具的名稱、用途與參數,再把它接進你的對話系統。這正是下一篇「定義 tool schema 與處理 tool call」要做的事。

這套模式解鎖了什麼

  • 即時資訊:拿到訓練資料之外的最新資料。
  • 系統整合:把 Claude 接上資料庫、API 與各種服務。
  • 動態回應:答案建立在當下最新的資訊上。
  • 結構化互動:Claude 清楚知道自己缺什麼、該怎麼開口要。

tool use 把 Claude 從一座靜態的知識庫,變成能操作即時資料的動態助理。天氣、即時數據、資料庫查詢,任何你的使用者需要的即時資訊,都能用同一套模式接上來。

而且這套模式是結構化的:Claude 不是含糊地說「我需要更多資訊」,而是精確指名要呼叫哪個工具、帶什麼參數,你的程式照單執行就好。這種明確性,正是它能被寫成穩定應用的原因。

參考出處本文取材自 Anthropic 官方 Claude Academy 免費課程「Building with the Claude API」,由酒Ann 消化後以自己的視角重新編寫。想看英文原版課程,可到 Claude Academy 修習。

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

tool use 是 Claude 自己去呼叫外部 API 嗎?
不是。對自訂工具而言,Claude 只會發出結構化的工具請求,實際執行程式、呼叫外部 API 的一直是你的伺服器;資料拿回來後再回傳給 Claude,由它組出最終答案。
什麼情況該做一個工具給 Claude?
當模型有天生限制時,例如需要即時資料、精確的日期計算,或要對外部系統執行動作。原則是用工具補足能力,而不是在 prompt 裡想辦法繞過限制。
工具函式的錯誤訊息為什麼重要?
因為 Claude 看得到錯誤訊息。訊息寫得清楚,例如「地點不能是空的」,它就可能帶著修正後的參數重試一次,等於幫它裝上自我修正的機會。
看懂流程之後,下一步是什麼?
為工具函式寫一份 JSON schema,讓 Claude 知道這個工具的存在、參數與用途,並學會處理它回傳的多區塊訊息,工具才算真正接上對話流程。