公開日: 2025 年 5 月 13 日
大規模言語モデル(LLM)は、レスポンスが長くなることで知られています。モデルに「true」または「false」のみで回答するように指示しても、モデルは「はい、答えは true です」のように、フレンドリーな出力で、要求以上の情報を返すことがあります。
この課題に対処するため、Prompt API
では、JSON スキーマを LanguageModel.prompt() メソッドと
LanguageModel.promptStreaming() メソッドに渡すことで、モデルのレスポンスの JSON 出力形式を指定できます。構造化出力のサポートは、Chrome バージョン 137 以降で利用できます。
JSON スキーマとは
JSON スキーマは、JSON データの整合性、有効性、相互運用性を大規模に実現する語彙です。データ交換に関して、JSON スキーマは JSON データの構造とルールを定義する強力な標準です。一連のキーワードを使用して、データのプロパティを定義します。
JSON スキーマは、構造化された出力を保証するための業界標準であり、 その他、 OpenAI API や Gemini APIなどで使用されています。
たとえば、モデルに、マストドンなどのオンライン ソーシャル ネットワークの投稿に最大 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 スキーマを Prompt API に渡す
モデルがリクエストされた JSON スキーマを尊重するようにするには、JSON スキーマを prompt() メソッドまたは promptStreaming() メソッドのオプション オブジェクトに responseConstraint フィールドの値として引数として渡す必要があります。
これは、マストドンの投稿のような特定のメッセージが陶器に関するものかどうかを分類する際に、モデルが
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 を実行するすべてのメリットが得られます。