Prompt API の構造化出力のサポート

公開日: 2025 年 5 月 13 日

大規模言語モデル(LLM)は、長い回答が返されることで有名です。「true」または「false」のみで回答するようにモデルに指示しても、モデルは「確かに、答えは true です」など、フレンドリーな出力で応答し、リクエストした以上の情報を返す場合があります。

この課題に対処するため、Prompt API では、LanguageModel.prompt() メソッドと LanguageModel.promptStreaming() メソッドに JSON スキーマを渡すことで、モデルのレスポンスの JSON 出力形式を指定できます。構造化出力のサポートは、Chrome バージョン 137 以降で利用できます。

JSON スキーマとは

JSON Schema は、JSON データの一貫性、有効性、相互運用性を大規模に実現するボキャブラリです。データ交換に関しては、JSON スキーマは JSON データの構造とルールを定義するための強力な標準として際立っています。一連のキーワードを使用して、データのプロパティを定義します。

JSON Schema は、構造化出力を保証するための業界標準であり、OpenAI APIGemini API などで使用されています。

たとえば、Mastodon などのオンライン ソーシャル ネットワークの投稿に最大 3 つのハッシュタグを割り当てるようにモデルに指示します。理想的な出力は次の JSON のようになります。

{
  "hashtags": [
    "#pottery",
    "#dyi"
  ] 
}

このリクエストされた出力オブジェクトの形状に対応する JSON スキーマは次のようになります。

{
  "type": "object",
  "properties": {
    "hashtags": {
      "type": "array",
      "maxItems": 3,
      "items": {
        "type": "string",
        "pattern": "^#[^\\s#]+$"
      }
    }
  },
  "required": ["hashtags"],
  "additionalProperties": false
}

この JSON スキーマは、次の制約を持つ hashtags フィールドを含む必要があるオブジェクトの構造を定義します。

  • "type": "object": ルート値は JSON オブジェクトにする必要があります。
  • "properties": { "hashtags": ... }: オブジェクトには hashtags というプロパティを設定できます(この場合は設定する必要があります)。
  • "hashtags":

    • "type": "array": 値は配列にする必要があります。
    • "maxItems": 3: 配列には最大 3 つのアイテムを含めることができます。
    • "items": { "type": "string", "pattern": "^#[^\\s#]+$" }: 配列内の各項目は、指定された正規表現パターン ^#[^\\s#]+$ に一致する文字列である必要があります。
      • ^## で始まる必要があります。
      • [^\\s#]+ → その後にスペース(\s)または別の # 以外の 1 つ以上の文字が続く。
      • $ → 終了位置。
  • "required": ["hashtags"]: オブジェクトに hashtags プロパティが含まれている必要があります。

  • "additionalProperties": false: ハッシュタグ以外のプロパティは使用できません。

形式の機能の詳細については、JSON スキーマの基本に関するドキュメントをご覧ください。

実際、LLM は JSON スキーマの作成に非常に適しています。プロンプトで制約を自然言語で記述し、有効な JSON オブジェクトの例を指定します。次に、生成された JSON スキーマに対して JSON オブジェクトを検証します。これは、オンラインの Newtonsoft JSON Schema Validator などの JSON Schema Validator のいずれかを使用して行います。

JSON スキーマ バリデータで JSON オブジェクトを JSON スキーマと照らし合わせて正常に検証する。

JSON スキーマを Prompt API に渡す

モデルがリクエストされた JSON スキーマを遵守するようにするには、JSON スキーマを prompt() メソッドまたは promptStreaming() メソッドのオプション オブジェクトに引数として渡し、responseConstraint フィールドの値として渡す必要があります。

次に、この Mastodon の投稿のような特定のメッセージが陶器に関するものかどうかを分類する際に、モデルが true または false で応答するようにする非常に基本的な JSON スキーマの例を示します。

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended- but that's
how it goes with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(  
  `Is this post about pottery?\n\n${post}`,  
  {  
    responseConstraint: schema,  
  }  
);  
console.log(JSON.parse(result));  
// true  

予測可能な出力をサポートする

Prompt API の構造化出力サポートにより、LLM のレスポンスの予測可能性が大幅に向上します。Markdown レスポンスやその他の後処理からオブジェクトを抽出するのではなく、モデルのレスポンスが有効な JSON であると想定できるようになりました。

これにより、組み込み AI がクラウドベースの API にさらに近づき、ローカル クライアントサイド AI を実行するすべてのメリットがもたらされます。