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

發布日期:2025 年 5 月 13 日

大型語言模型 (LLM) 有時會回覆冗長的回覆,這點眾所皆知。即使您要求模型只回答「是」或「否」,模型仍可能會回覆友善的輸出內容,並提供您要求以外的資訊,例如:「當然,答案是:是。」

為解決這個問題,提示 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 結構定義的簡單範例,可確保模型在分類時會以 truefalse 回應,判斷這類 Mastodon 貼文是否與陶藝有關。

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 提供結構化輸出支援,可讓大型語言模型的回覆更容易預測。開發人員現在可以假設模型回應是有效的 JSON,而非從 Markdown 回應或其他後續處理中擷取物件。

這可讓內建 AI 更接近雲端 API,並享有執行本機用戶端 AI 的所有優點。