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

公開日: 2025 年 5 月 13 日

大規模言語モデル(LLM)は、応答が長くなることがあることで知られています。モデルに「true」または「false」のみで回答するように指示しても、モデルは「はい、答えは true です」のように、フレンドリーな出力で、要求した以上の回答を返すことがあります。

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

JSON スキーマとは

JSON Schema は、JSON データの整合性、有効性、相互運用性を大規模に実現する語彙です。データ交換に関しては、JSON Schema は 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 オブジェクトを検証するには、JSON スキーマ バリデーター(オンラインの Newtonsoft JSON スキーマ バリデーターなど)を使用します。

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 のレスポンスの予測可能性が大幅に向上します。マークダウン レスポンスやその他の後処理からオブジェクトを抽出するのではなく、モデルのレスポンスが有効な JSON であると想定できるようになりました。

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