针对 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 等在线社交网络上的帖子分配最多 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) 或其他 # 的字符。
      • $ → 必须以此结尾。
  • "required": ["hashtags"]:对象必须包含 hashtags 属性。

  • "additionalProperties": false:除了 # 号以外,不允许使用任何其他属性。

如需全面了解该格式的功能,请参阅 JSON 架构基础知识文档。

事实上,LLM 非常擅长创建 JSON 架构。在问题中用自然语言描述约束条件,并提供有效的 JSON 对象示例,这样就完成了一半的工作。然后,您可以使用某个 JSON 架构验证器(例如在线 Newtonsoft JSON 架构验证器)针对生成的 JSON 架构验证 JSON 对象。

在 JSON 架构验证器中根据 JSON 架构成功验证 JSON 对象。

将 JSON 架构传递给 Prompt API

为确保模型遵循请求的 JSON 架构,您需要将 JSON 架构作为参数传递给 prompt() 或将其作为 responseConstraint 字段的值传递给 promptStreaming() 方法的 options 对象。

下面是一个非常基本的 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 的所有优势。