為什麼要使用結構化輸出?
代理預設返回自由格式的文本,這適用於聊天但不適用於您需要以程式方式使用輸出的情況。結構化輸出為您提供類型化資料,您可以直接傳遞給應用程式邏輯、資料庫或 UI 元件。 考慮一個食譜應用程式,其中代理搜尋網路並帶回食譜。沒有結構化輸出,您會獲得自由格式的文本,需要自己解析。使用結構化輸出,您定義想要的形狀並獲得可以直接在應用程式中使用的類型化資料。沒有結構化輸出
沒有結構化輸出
使用結構化輸出
使用結構化輸出
快速開始
要使用結構化輸出,定義一個 JSON Schema 來描述您想要的資料形狀,然後通過outputFormat 選項(TypeScript)或 output_format 選項(Python)將其傳遞給 query()。當代理完成時,結果訊息包含一個 structured_output 欄位,其中包含與您的架構相匹配的驗證資料。
下面的範例要求代理研究 Anthropic 並返回公司名稱、成立年份和總部作為結構化輸出。
使用 Zod 和 Pydantic 的類型安全架構
與其手動編寫 JSON Schema,您可以使用 Zod(TypeScript)或 Pydantic(Python)來定義您的架構。這些庫為您生成 JSON Schema,並讓您將回應解析為完全類型化的物件,您可以在整個程式碼庫中使用,具有自動完成和類型檢查。 下面的範例定義了一個功能實現計劃的架構,包括摘要、步驟列表(每個步驟都有複雜性級別)和潛在風險。代理計劃該功能並返回一個類型化的FeaturePlan 物件。然後您可以訪問 plan.summary 等屬性,並使用完整的類型安全遍歷 plan.steps。
- 完整的類型推斷(TypeScript)和類型提示(Python)
- 使用
safeParse()或model_validate()進行運行時驗證 - 更好的錯誤訊息
- 可組合、可重用的架構
輸出格式配置
outputFormat(TypeScript)或 output_format(Python)選項接受一個物件,其中包含:
type:設置為"json_schema"以進行結構化輸出schema:一個 JSON Schema 物件,定義您的輸出結構。您可以使用z.toJSONSchema()從 Zod 架構或使用.model_json_schema()從 Pydantic 模型生成此項。
enum、const、required、嵌套物件和 $ref 定義。有關支援的功能和限制的完整列表,請參閱 JSON Schema 限制。
範例:TODO 追蹤代理
此範例演示了結構化輸出如何與多步驟工具使用配合使用。代理需要在程式碼庫中查找 TODO 註釋,然後為每個註釋查找 git blame 資訊。它自主決定使用哪些工具(Grep 搜尋、Bash 執行 git 命令)並將結果組合成單個結構化回應。 架構包括可選欄位(author 和 date),因為 git blame 資訊可能不適用於所有檔案。代理填入它能找到的內容並省略其餘部分。
錯誤處理
當代理無法生成與您的架構相匹配的有效 JSON 時,結構化輸出生成可能會失敗。這通常發生在架構對於任務過於複雜、任務本身不明確或代理在嘗試修復驗證錯誤時達到重試限制時。 發生錯誤時,結果訊息有一個subtype 指示出了什麼問題:
| Subtype | 含義 |
|---|---|
success | 輸出已成功生成並驗證 |
error_max_structured_output_retries | 代理在多次嘗試後無法生成有效輸出 |
subtype 欄位以確定輸出是否成功生成或您是否需要處理失敗:
- 保持架構專注。 具有許多必需欄位的深層嵌套架構更難滿足。從簡單開始,根據需要添加複雜性。
- 匹配架構與任務。 如果任務可能沒有您的架構所需的所有資訊,請將這些欄位設為可選。
- 使用清晰的提示。 不明確的提示使代理更難知道要生成什麼輸出。
相關資源
- JSON Schema 文件:學習 JSON Schema 語法以定義具有嵌套物件、陣列、列舉和驗證約束的複雜架構
- API 結構化輸出:直接使用 Claude API 的結構化輸出進行單輪請求,無需工具使用
- 自訂工具:在返回結構化輸出之前,在執行期間為您的代理提供自訂工具以供調用