支援 Prompt API 的結構化輸出內容

發布日期:2025 年 5 月 13 日

大型語言模型 (LLM) 有時會提供冗長的回覆,即使您要求模型只回答「true」或「false」,模型仍可能會提供友善的回覆,並超出您的要求,例如:「當然,答案是:true。」

為解決這項挑戰,Prompt API 可讓您將 JSON 結構定義傳遞至 LanguageModel.prompt()LanguageModel.promptStreaming() 方法,指定模型回覆的 JSON 輸出格式。Chrome 137 版起支援結構化輸出。

什麼是 JSON 結構定義

JSON 結構定義是一種詞彙,可大規模確保 JSON 資料的一致性、有效性和互通性。在資料交換方面,JSON 結構定義是定義 JSON 資料結構和規則的強大標準。這項語言會使用一組關鍵字定義資料的屬性。

JSON 結構定義是確保結構化輸出的業界標準,OpenAI APIGemini API 等服務都使用這項標準。

舉例來說,您提示模型為線上社群網路 (例如 Mastodon) 上的貼文指派最多三個主題標記。理想的輸出內容可能類似下列 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) 或其他 # 的字元。
      • $ → 必須在此結束。
  • "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 欄位的值。

以下是相當基本的 JSON 結構定義範例,可確保模型在分類特定訊息 (例如這則 Mastodon 貼文) 是否與陶藝相關時,一律會以 truefalse 回覆。

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,不必再從 Markdown 回應或其他後續處理程序中擷取物件。

這項技術可讓內建 AI 更接近雲端 API,同時享有在本機執行用戶端 AI 的所有優點。