プロンプト内のJSON Schema
出力形式を制約します。
「プロンプト内のJSON Schema」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
出力契約としてのスキーマ
JSON Schemaは、有効な出力の形を宣言的に記述します。型、必須キー、値の制約、入れ子構造などです。構造化出力APIに渡すと強制力のある契約になり、プロンプトに埋め込むと強力な指針になります。
スキーマを作成する技術を身につけることが、構造化生成の中心的なスキルです。
strictフラグですべてが変わる
strictモードでは、プロバイダーはすべてのプロパティをrequiredに記載し、additionalPropertiesをfalseにすることを要求します。オプションのフィールドは、省略するのではなく、nullとのユニオンとして表現します。
{
'type': 'object',
'properties': {
'name': {'type': 'string'},
'nickname': {'type': ['string', 'null']}
},
'required': ['name', 'nickname'],
'additionalProperties': False
}スカラー値の制約
後処理ではなく、スキーマに検証を組み込みます。
- 固定された選択肢には
enumを使います。 - 数値の範囲には
minimum/maximumを使います。 - 正規表現で検証する文字列には
patternを使います。 date-timeやemailなどのヒントにはformatを使います。
{
'rating': {'type': 'integer', 'minimum': 1, 'maximum': 5},
'sku': {'type': 'string', 'pattern': '^[A-Z]{3}-[0-9]{4}$'},
'created': {'type': 'string', 'format': 'date-time'}
}配列とタプル
同じ型の要素からなる配列にはitemsを使い、minItems/maxItemsを追加して長さを制限します。位置によって要素の型が決まるタプルには、prefixItemsでスキーマの配列を指定します。
{
'tags': {
'type': 'array',
'items': {'type': 'string'},
'minItems': 1,
'maxItems': 5
}
}oneOfによる判別可能なユニオン
多相的な結果は、oneOfと判別フィールドを組み合わせてモデル化します。モデルは分岐を1つだけ選択し、デシリアライザーはそのタグに応じて処理を切り替えます。
{
'oneOf': [
{'type': 'object', 'properties': {
'kind': {'const': 'email'},
'address': {'type': 'string', 'format': 'email'}},
'required': ['kind', 'address']},
{'type': 'object', 'properties': {
'kind': {'const': 'phone'},
'number': {'type': 'string'}},
'required': ['kind', 'number']}
]
}型からスキーマを生成する
スキーマを手作業で書くと、ミスが起こりやすくなります。型付きモデルからスキーマを導出し、スキーマとコードの間にずれが生じないようにします。
from pydantic import BaseModel
class Invoice(BaseModel):
total: float
currency: str
paid: bool
schema = Invoice.model_json_schema()
# pass schema directly to response_formatdescriptionもプロンプトになる
スキーマ内のすべてのdescriptionはモデルに読み取られます。単にフィールドを説明するだけでなく、意味を誘導するために使います。
たとえば、'ISO-3166 alpha-2の国コード、大文字'のような説明は、フィールドの正確性を大きく向上させます。descriptionは契約に埋め込まれたマイクロプロンプトとして扱いましょう。
{
'country': {
'type': 'string',
'description': 'ISO-3166 alpha-2 code, uppercase, e.g. US, TR, DE'
}
}プロンプトへのスキーマの埋め込み
プロバイダーがネイティブに対応していない場合は、スキーマをプロンプトに埋め込み、適合するよう要求します。これに、インコンテキスト例を1つだけと、JSONのみ、説明文なしという明示的な指示を組み合わせます。
SYSTEM = (
'You output ONLY JSON matching this schema. No markdown, no commentary.\n'
'Schema:\n' + json.dumps(schema) + '\n'
'If a value is unknown, use null.'
)スキーマの肥大化を避ける
深すぎるスキーマや分岐の多いスキーマは、モデルを混乱させ、トークンコストを増加させます。指針は次のとおりです。
- 入れ子を浅く保ち、可能な場合は平坦化します。
- 自由記述の文字列よりもenumを優先します。
- 巨大なスキーマは、目的を絞った複数の呼び出しに分割します。
- プロバイダーによっては、入れ子の深さやプロパティの総数に上限があります。制限を確認してください。
Refsと再利用
$defsと$refを使ってサブスキーマを再利用します(たとえば、請求先と配送先の両方で使うAddressなど)。ただし、厳格モードによっては再帰の深さが制限されるため、自己参照するrefに依存する前に、対応状況を確認してください。
{
'$defs': {
'Address': {'type': 'object', 'properties': {
'city': {'type': 'string'}}, 'required': ['city'],
'additionalProperties': False}
},
'type': 'object',
'properties': {
'billing': {'$ref': '#/$defs/Address'},
'shipping': {'$ref': '#/$defs/Address'}
},
'required': ['billing', 'shipping'],
'additionalProperties': False
}スキーマ自体を検証する
見落としやすいバグの種類として、出力ではなくスキーマが不正である場合があります。CIでJSON Schemaメタスキーマに対してスキーマのLintと検証を行い、リリース前にサンプルオブジェクトをバリデーターでラウンドトリップさせてください。
import jsonschema
jsonschema.Draft202012Validator.check_schema(schema)
# also: validate a known-good sample
jsonschema.validate(sample_obj, schema)確認問題
プロバイダーの厳格なJSON Schemaモードでは、オプションのフィールドをどのように正しく表現しますか。
復習
ここまでで、正確なスキーマを作成できるようになりました。
- strictモードでは、すべてのプロパティを必須にし、additionalPropertiesをfalseにする必要があります。
- enum、範囲、pattern、formatでスカラー値を制約します。
- oneOfと判別フィールドで多相性をモデル化します。
- 型付きモデルからスキーマを生成し、descriptionをマイクロプロンプトとして扱います。
- CIでスキーマ自体を検証します。
次は、ツール呼び出しと関数呼び出しにスキーマを適用する方法を学びます。
よくある質問
「プロンプト内のJSON Schema」レッスンは無料ですか?
はい。「プロンプト内のJSON Schema」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「プロンプト内のJSON Schema」で何を学びますか?
出力形式を制約します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「プロンプト内のJSON Schema」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化出力が重要な理由
- プロンプト内のJSON Schema
- ツール/関数のスキーマ
- 修復と検証のループ