構造化された出力が必要な理由
エージェントはデフォルトでは自由形式のテキストを返します。これはチャットには機能しますが、出力をプログラムで使用する必要がある場合には機能しません。構造化された出力は、アプリケーションロジック、データベース、または 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 オブジェクト。Zod スキーマからz.toJSONSchema()で、または Pydantic モデルから.model_json_schema()で生成できます。
enum、const、required、ネストされたオブジェクト、および $ref 定義を含む標準 JSON Schema 機能をサポートしています。サポートされている機能と制限の完全なリストについては、JSON Schema の制限 を参照してください。
例:TODO トラッキングエージェント
この例は、マルチステップツール使用で構造化された出力がどのように機能するかを示しています。エージェントはコードベース内の TODO コメントを見つけ、各コメントの git blame 情報を調べる必要があります。実行中に使用するツール(検索用の Grep、git コマンド実行用の Bash)を自律的に決定し、結果を単一の構造化応答に組み合わせます。 スキーマには、すべてのファイルで git blame 情報が利用できない可能性があるため、オプションフィールド(author と date)が含まれています。エージェントは見つけられるものを埋め、残りは省略します。
エラーハンドリング
エージェントがスキーマに一致する有効な JSON を生成できない場合、構造化された出力の生成は失敗する可能性があります。これは通常、スキーマがタスクに対して複雑すぎる場合、タスク自体が曖昧な場合、またはエージェントが検証エラーを修正しようとして再試行制限に達した場合に発生します。 エラーが発生すると、結果メッセージには何が問題かを示すsubtype があります:
| Subtype | 意味 |
|---|---|
success | 出力が正常に生成および検証されました |
error_max_structured_output_retries | エージェントは複数の試行後に有効な出力を生成できませんでした |
subtype フィールドをチェックして、出力が正常に生成されたか、失敗を処理する必要があるかを判断します:
- スキーマを焦点を絞ったものにしてください。 多くの必須フィールドを持つ深くネストされたスキーマは満たすのが難しいです。シンプルに始めて、必要に応じて複雑さを追加してください。
- スキーマをタスクに合わせてください。 タスクがスキーマが必要とするすべての情報を持たない可能性がある場合、それらのフィールドをオプションにしてください。
- 明確なプロンプトを使用してください。 曖昧なプロンプトは、エージェントが何を出力するかを知るのを難しくします。
関連リソース
- JSON Schema ドキュメント:ネストされたオブジェクト、配列、列挙型、検証制約を含む複雑なスキーマを定義するための JSON Schema 構文を学習します
- API 構造化出力:ツール使用なしの単一ターンリクエストの場合、Claude API で直接構造化された出力を使用します
- カスタムツール:構造化された出力を返す前に実行中にエージェントが呼び出すカスタムツールを提供します