第4章 · Advanced Claude API
JSON / 構造化出力
Structured Output (JSON)
→ で次のスライド · F でフルスクリーン · N で講師ノート · Esc で終了
重要キーワード
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[]}
Hands-on Exercise
演習: Pydantic 検証付き抽出
次のスキーマで会議メモから JSON を抽出 → Pydantic 検証 → 失敗なら 1 回だけ再試行、するスクリプトを書いてください。
class Meeting(BaseModel):
title: str
date: str # YYYY-MM-DD
attendees: list[str]
🎉
まとめ
お疲れ様でした!