发布时间:2025 年 5 月 13 日
大语言模型 (LLM) 有时会生成冗长的回答,这已是众所周知的事实。即使您要求模型仅回答“true”或“false”,模型也可能会以友好的方式回答,并提供超出您要求的输出,例如:“当然,答案是:true。”
为了应对这一挑战,Prompt API 可让您通过向 LanguageModel.prompt()
和 LanguageModel.promptStreaming()
方法传递 JSON 架构来指定模型响应的 JSON 输出格式。自 Chrome 版本 137 起,结构化输出支持已推出。
什么是 JSON 架构
JSON 架构是一种词汇,可大规模实现 JSON 数据的一致性、有效性和互操作性。在数据交换方面,JSON 架构是一种强大的标准,可用于定义 JSON 数据的结构和规则。它使用一组关键字来定义数据的属性。
JSON 架构是确保输出结构化的行业标准,OpenAI API 和 Gemini 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 对象。
向 Prompt API 传递 JSON 架构
为确保模型遵循请求的 JSON 架构,您需要将 JSON 架构作为实参传递给 prompt()
或 promptStreaming()
方法的选项对象,作为 responseConstraint
字段的值。
下面是一个非常基本的 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 的所有优势。