发布时间: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 等都采用了该标准。
例如,您可以提示模型为 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 架构传递给 Prompt API
为确保模型遵循请求的 JSON 架构,您需要将 JSON 架构作为参数传递给 prompt()
或将其作为 responseConstraint
字段的值传递给 promptStreaming()
方法的 options 对象。
下面是一个非常基本的 JSON 架构示例,可确保模型在对此类 Mastodon 帖子等给定消息进行分类时,以 true
或 false
进行响应,以确定消息是否与陶器有关。
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 的所有优势。