在本課程的前面部分,我們介紹了如何使用訊息預填和停止序列從 Claude 獲取結構化輸出。雖然這種方法效果良好且易於設置,但我們可以使用工具獲得更可靠的輸出。這種方法實施起來更複雜,但在提取像 JSON 這樣的結構化資料時,它提供了更好的一致性。
為什麼要學習這兩種方法?
您可能會想,如果工具更可靠,為什麼我們不直接從工具開始。答案很簡單:工具需要更多的設置和複雜性。同時擁有這兩種技術可以為您提供靈活性——有時您會想要快速的基於提示的方法,有時您則需要工具所提供的可靠性。
基於工具的結構化輸出如何運作
核心概念很簡單:不是要求 Claude 將其回應格式化為 JSON,而是建立一個工具,其輸入參數與您想要提取的資料的確切結構相符。然後 Claude 會使用提取的資料作為參數來「呼叫」這個工具。

以下是這個過程:
- 撰寫一個描述您想要的資料結構的 JSON schema
- 建立一個以該 schema 作為其輸入規格的工具
- 將您的資料和工具 schema 傳送給 Claude
- 使用
toolChoice參數強制 Claude 使用該工具 - 從工具呼叫參數中提取結構化資料

流程如下:您的伺服器傳送一個提示,要求 Claude 分析資料並呼叫特定的工具。Claude 會回應一個包含提取出的 JSON 資料的工具使用訊息。此時,您只需取得資料並結束對話——不需要後續操作。
控制工具使用
在使用工具進行結構化輸出時,您希望確保 Claude 使用您的提取工具。toolChoice 參數為您提供三個選項:

{"toolChoice": {"auto": {}}}- 模型自行決定是否需要使用工具(預設值){"toolChoice": {"any": {}}}- 模型必須使用工具,但可以選擇使用哪一個{"toolChoice": {"tool": {"name": "tool-name"}}}- 模型必須使用指定的工具
對於結構化輸出,您幾乎總是會想要第三個選項,以確保 Claude 使用您的提取工具。
實際範例
假設您想從一篇文章中提取標題、作者和關鍵主題。首先,您需要建立一個工具 schema:
article_details_schema = {
"toolSpec": {
"name": "article_details",
"description": "Extracts key information from an article",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The title of the article"
},
"author": {
"type": "string",
"description": "The author's name"
},
"topics": {
"type": "array",
"items": {"type": "string"},
"description": "List of key topics mentioned"
}
},
"required": ["title", "author", "topics"]
}
}
}
}然後您會呼叫 Claude,傳入您的資料並強制它使用該工具。我們的 chat 輔助函式直接將工具名稱作為其 tool_choice 參數,因此您不必自己建構巢狀的 toolChoice 物件:
messages = []
add_user_message(messages, f"""
Analyze the article below and extract key data. Then call the article_details tool.
<article_text>
{article_text}
</article_text>
""")
result = chat(messages, tools=[article_details_schema], tool_choice="article_details")Claude 會回應一個工具使用訊息,其中包含以您指定的確切格式提取的資料。工具呼叫參數將包含您的結構化 JSON 資料,可直接在您的應用程式中使用。
主要優點
- 比基於提示的提取更可靠
- 保證符合您的 schema 的結構
- 不需要訊息預填或停止序列
- 透過工具 schema 內建驗證
主要的取捨在於複雜性——您需要撰寫詳細的 schema 並處理工具回應。但當您需要一致、可靠的結構化輸出時,工具就是正確的選擇。