← レッスンに戻る
第4章 · Claude API応用

JSON / 構造化出力

Structured Output (JSON) · 約 10 分

重要キーワード

English日本語説明
Structured Output 構造化出力 JSON など機械可読フォーマットで結果を返させること
JSON Schema JSONスキーマ JSON の形を定義する仕様
Pydantic ピダンティック Python の型付き検証ライブラリ

JSON / 構造化出力

API 連携や DB 投入には 正確な JSON が必要です。 Claude に JSON を返させる定石を見ていきましょう。

方法 1: Tool Use の入力スキーマを利用

最も信頼性が高い方法。Tool Use の input_schema は JSON Schema なので、 ツールを「定義 → 呼ばせる → input をそのまま使う」と確実に構造化されます。

tools = [{
    "name": "extract_meeting",
    "description": "テキストから会議情報を抽出",
    "input_schema": {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "date": {"type": "string", "format": "date"},
            "attendees": {"type": "array", "items": {"type": "string"}},
        },
        "required": ["title", "date"],
    },
}]
res = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=512,
    tools=tools,
    tool_choice={"type": "tool", "name": "extract_meeting"},
    messages=[{"role": "user", "content": "5/8 14:00 から 田中・佐藤と週次定例"}],
)
data = next(b.input for b in res.content if b.type == "tool_use")
# data: {"title": "週次定例", "date": "2026-05-08", "attendees": ["田中", "佐藤"]}

方法 2: プロンプトで JSON 指示

シンプルな場合はプロンプトだけで OK。

出力は次の JSON のみで、解説は不要:
{
  "title": "...",
  "date": "YYYY-MM-DD",
  "attendees": ["...", "..."]
}

temperature=0 を併用するのが安定です。

方法 3: assistant プレフィックスを使う

API は messages の最後に {"role": "assistant", "content": "{"} を入れると JSON の { の続きから生成 させられます。

messages=[
    {"role": "user", "content": "..."},
    {"role": "assistant", "content": "{"},
]

返ってくる文字列の先頭に { を付けて json.loads すれば安全に解析可能。

Pydantic で検証

from pydantic import BaseModel

class Meeting(BaseModel):
    title: str
    date: str
    attendees: list[str]

m = Meeting.model_validate(data)

検証エラー時は 再試行ループ に乗せるのが堅牢な実装です。

失敗パターン

❌ 解説が混ざる: 「以下が JSON です: { ... }」 → 「JSON 以外の文字列を出力するな」を strict に書く / Tool Use を使う

❌ trailing comma で json.loads が落ちる → Tool Use の input は SDK が安全に dict にしてくれる

❌ 配列の数が指定外 → JSON Schema の minItems / maxItems で制約

試す

JSON 抽出をやってみましょう。

▶ JSON 抽出 (Tool Use なし版)
次のメモから JSON を抽出してください。出力は JSON のみ、解説は禁止。 メモ: 5/8 14:00 から 田中・佐藤と週次定例 出力スキーマ: {title: string, date: "YYYY-MM-DD", attendees: string[]

}

演習問題

演習 1: Pydantic 検証付き抽出

次のスキーマで会議メモから JSON を抽出 → Pydantic 検証 → 失敗なら 1 回だけ再試行、するスクリプトを書いてください。

class Meeting(BaseModel):
    title: str
    date: str  # YYYY-MM-DD
    attendees: list[str]
スタータープロンプト:
Python で次のフローを書いてください:
1. Pydantic で Meeting モデル定義 (title, date YYYY-MM-DD, attendees list[str])
2. Tool Use で抽出 (input_schema は Meeting に揃える)
3. tool_use ブロックの input を Meeting.model_validate
4. 失敗時はエラーメッセージを次のターンで Claude に渡し 1 回だけリトライ
anthropic SDK で完全コード。
ヒントを見る

再試行時は assistant の前回応答 + 「次のエラーで失敗しました: 。スキーマに合うよう修正してください」を渡すのが定石。

理解度チェック

  1. 最も信頼性が高い JSON 出力の方法は?
    1. Tool Use の input_schema を活用
    2. system に「JSON のみ」と書くだけ
    3. max_tokens を 50 に絞る
    4. Vision で出力する
  2. JSON 出力を安定させる temperature は?
    1. 1.0
    2. 0.0 付近
    3. 2.0
    4. ランダム
  3. Pydantic 検証に失敗したときの定石は?
    1. そのまま採用
    2. エラーをプロンプトに渡して再試行
    3. API キーを変える
    4. ファイルを削除
解答と解説を見る
  1. A — Tool Use の input_schema は JSON Schema なので構造が保証されやすい。
  2. B — 決定論性を上げるため低温度が推奨です。
  3. B — 失敗内容を Claude にフィードバックすると修正してくれます。