针对 Prompt API 的结构化输出支持

发布时间:2025 年 5 月 13 日

大语言模型 (LLM) 有时会生成冗长的回答,这已是众所周知的事实。即使您要求模型仅回答“true”或“false”,模型也可能会以友好的方式回答,并提供超出您要求的输出,例如:“当然,答案是:true。”

为了应对这一挑战,Prompt API 可让您通过向 LanguageModel.prompt()LanguageModel.promptStreaming() 方法传递 JSON 架构来指定模型响应的 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 架构验证器(例如在线 Newtonsoft JSON 架构验证器)针对生成的 JSON 架构验证 JSON 对象。

在 JSON 架构验证器中成功验证 JSON 对象是否符合 JSON 架构。

向 Prompt API 传递 JSON 架构

为确保模型遵循请求的 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 的所有优势。