構造化出力
- スキーマ強制された出力が、JSON を期待してプロンプトを書くより優れている理由を説明する
- JSON Schema を渡し、レスポンスを型付きオブジェクト(Pydantic / Zod)にパースする
- 構造化出力とツール使用を、仕組みではなく意図で見分ける
- タイトで信頼できるスキーマのための4つのコツを適用する
- ひと言の判断ルールで正しいツールを選ぶ
Claude の出力が他のソフトウェアに渡るとき、信頼できる構造——既知の形に毎回一致する有効な JSON——が必要です。「JSON で答えて」と頼んで祈るのではなく、プラットフォームの構造化出力サポートを使いましょう。
このレッスンは、プロンプトで祈る方式がなぜ失敗するのかから、スキーマを強制して型付きオブジェクトにパースする方法まで導きます——そして、見た目がそっくりなときに構造化出力とツール使用をどう見分けるかも。上から下まで通して読み、終盤のクイズで自分を試してください。
信頼できる方法
出力の JSON Schema を渡し、API/SDK にそれを強制させてから、型付きオブジェクト(Python なら Pydantic、TypeScript なら Zod)にパースします。SDK の parse ヘルパーは、自分で JSON.parse して検証しなければならない文字列ではなく、型付きの結果を直接返してくれます。
- 必要な出力を JSON Schema としてモデル化します——Python なら Pydantic BaseModel で、TypeScript なら Zod スキーマで。
- そのスキーマに準拠したデータを返すようモデルに求め、運任せにせず API/SDK が強制するようにします。
- SDK の parse ヘルパーで型付き結果を直接得ます——手動の JSON.parse と自前の検証は不要です。
# Conceptual shape — see the official docs for the current API surface.
from pydantic import BaseModel
class Ticket(BaseModel):
title: str
priority: str # "low" | "medium" | "high"
tags: list[str]
# Request the model to return data conforming to Ticket's JSON schema,
# then parse the response into a Ticket instance.
調整できる具体的なリクエストが欲しいですか?モデルに渡すものの形は次のとおりです——モデルを自分のスキーマに置き換えてください。
スキーマ準拠の出力を求める
Return the data conforming to this JSON Schema:
{
"title": "string",
"priority": "low | medium | high",
"tags": ["string"]
}
Do not include any prose outside the JSON.なぜ単にプロンプトで JSON を求めないのか?
プロンプトで JSON を頼むことはできますし、単純なケースでは機能します——しかしブレることがあります。余計な散文、末尾のカンマ、欠けたフィールド。スキーマ強制された出力はこの種のバグを取り除きます。これは、下流のシステムがそれに依存した瞬間に効いてきます。
- プロンプトされた JSON はデモでは動き、本番で壊れます。障害は下流のシステムがパースしたときにだけ現れます。
- 注意すべき典型的な3つのブレ:JSON の周りの余計な散文、末尾のカンマ、欠けた必須フィールド。
構造化出力 vs. ツール使用
どちらの機能もモデルに JSON Schema を渡すので、見た目は似ています——そして人々は間違ったほうを選びます。違いは意図であって、仕組みではありません。
| 構造化出力 | ツール使用 | |
|---|---|---|
| 欲しいもの | 固定された形での最終的な答え | モデルに機能を呼び出させる(関数を呼ぶ、データを取得する、アクションを取る) |
| 誰が使うか | あなたのコードが直接 | あなたのコードがツールを実行し、その結果をモデルに返す |
| ターンの形 | 1回のレスポンスで完了 | ループ:モデルが尋ね、あなたが実行し、モデルが続ける |
| 典型的な用途 | 抽出、分類、パース | エージェント、ライブ検索、副作用 |
ひと言の判断ルール:
JSON が成果物そのものなら、構造化出力を使います。JSON がモデルからあなたのコードへ何かをさせる依頼なら、それはツール使用です。エージェントはしばしば両方を使います——行動するためのツールと、きれいな最終結果を返すための構造化出力。
コツ
- スキーマをタイトに保つ——固定の選択肢には enum を使い、必須フィールドをマークする。
- フィールドを説明する——フィールドの説明はミニプロンプトのようにモデルを導く。
- 境界で必ず検証する——防御的なパースは安価な保険。
- 抽出タスクでは、構造化出力 + 明確なスキーマが自由形式に毎回勝つ。
- API/SDK に JSON Schema を渡して型付きオブジェクトにパースする——プロンプトで祈らない。
- JSON をプロンプトで求めるとブレうる(余計な散文、末尾のカンマ、欠けたフィールド)。スキーマ強制はそのバグ群を取り除く。
- 構造化出力 vs. ツール使用は意図で異なる:JSON が答えそのもの vs. JSON がアクションを要求する。
- タイトなスキーマ、説明されたフィールド、境界での検証が、抽出と分類を信頼できるものにする。
用語を定着させる
理解度チェック
0/4次へ
- ツール使用 / 関数呼び出し — ツールも JSON スキーマを使う
- 初めての API 呼び出し
- 再利用可能なプロンプトテンプレート