0Pricing
AI Prompt Engineering · レッスン

プロンプト内の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_format

descriptionもプロンプトになる

スキーマ内のすべての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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化出力が重要な理由
  2. プロンプト内のJSON Schema
  3. ツール/関数のスキーマ
  4. 修復と検証のループ
← AI Prompt Engineeringに戻る