Grok4 结构化输出 — Structured Outputs JSON 格式返回
什么是结构化输出
结构化输出(Structured Outputs)让 Grok 模型直接返回符合指定 JSON Schema 格式的数据,而不是自由文本。这样你的程序可以直接解析 JSON 使用,不需要处理模型输出的文本格式混乱、Markdown 包裹、多余解释等问题。
对于开发者来说,这是非常实用的能力——把 AI 集成到程序中时,结构化输出让数据对接变得轻松可靠。
为什么需要它
没有结构化输出时,让 Grok 返回 JSON 可能得到:
这是你要的 JSON:
{"name": "Grok", "version": "4.7"}
希望对你有帮助!
你需要:
- 从文本中提取代码块
- 去掉 Markdown 标记
- 解析 JSON
- 处理可能的格式错误
有了结构化输出,直接得到:
{"name": "Grok", "version": "4.7"}
使用方式
在 API 请求中指定 response_format
response = client.chat.completions.create(
model="grok-4.7",
messages=[
{"role": "user", "content": "列出三种 AI 大模型的名称、开发商和发布年份"}
],
response_format={
"type": "json_object"
},
)
使用 JSON Schema 约束
可以指定更精确的 schema:
response_format={
"type": "json_schema",
"json_schema": {
"name": "ai_models",
"schema": {
"type": "object",
"properties": {
"models": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "模型名称"},
"developer": {"type": "string"},
"release_year": {"type": "integer"}
},
"required": ["name", "developer", "release_year"]
}
}
},
"required": ["models"]
}
}
}
Grok 会严格遵守 schema
Grok 会返回完全符合你指定的 JSON Schema 的数据:
- 类型正确(string/number/boolean/array/object)
- 必填字段不缺失
- 不会有额外的键
- 不会有解释性文字
与函数调用的关系
结构化输出和函数调用是两种不同但相关的能力:
| 维度 | 结构化输出 | 函数调用 |
|---|---|---|
| 目的 | 让模型返回特定格式的数据 | 让模型触发外部工具/API |
| 返回内容 | 符合 schema 的 JSON | tool_calls 请求(包含函数名和参数) |
| 下一步 | 你的程序直接用 | 你的程序执行函数后把结果返回模型 |
| 适用场景 | 需要模型整理数据 | 需要模型执行操作 |
两者可以配合使用:函数调用的参数也是 JSON Schema 定义的,本质上也是结构化输出。
实际应用场景
场景 1:数据提取
从非结构化文本中提取结构化数据:
用户:从这段新闻中提取:标题、发布日期、涉及的公司、核心事件
Grok 返回:
{
"title": "xAI 发布 Grok 4.7",
"publish_date": "2026-09-22",
"companies": ["xAI", "SpaceX"],
"core_event": "发布新一代大模型,强化 Agent 能力"
}
场景 2:内容分类
对内容打标签:
用户:给这条产品描述打标签:[可填写的标签列表]
场景 3:表单填写辅助
从自然语言输入中提取表单字段:
用户:我叫张三,明天下午 3 点到 5 点有空,想去北京朝阳区找你
Grok 返回:
{
"name": "张三",
"available_time": "2025-10-15 15:00-17:00",
"location": "北京朝阳区"
}
场景 4:多步骤工作流
作为自动化管道的数据中转:
步骤 1:用户输入自由文本
步骤 2:Grok 结构化输出 → JSON
步骤 3:下游系统解析 JSON 执行对应操作
最佳实践
schema 要精确但不要过于复杂
太复杂的 schema 可能导致 Grok 难以正确填充。建议:
- 每个字段有清晰的
description - 枚举值用
enum限制范围 - 层级不要太深(3 层以内为宜)
处理 Grok 可能的不足
虽然结构化输出比普通输出可靠,但仍可能:
- 某些字段值不完整(信息不足时)
- 个别类型转换出错(如数字变字符串)
- 数组长度与预期不符
建议在应用层做:
- JSON 解析校验
- 字段完整性检查
- 类型转换和默认值处理
结合 function calling
在一个请求中同时使用 tools 和 response_format 可能有冲突。建议:
- 如果需要调用函数,主要用
tools - 如果只需要数据整理,用
response_format
让 prompt 与 schema 配合
虽然 schema 约束了输出,但 prompt 中仍应清晰描述你想要的内容。schema 约束格式,prompt 决定内容。
常见问题
结构化输出的额外成本
没有额外费用。按普通输出 token 价格计费。
Grok 会不会返回不符合 schema 的内容
理论上不会。但实际使用中,极端复杂的 schema 或信息不足时可能出现偏差。建议应用层做防御性处理。
可以嵌套 JSON 吗
可以。JSON Schema 支持任意深度的嵌套。但为了可靠性,建议控制在 3-4 层以内。
支持哪些类型
支持所有标准 JSON Schema 类型:
string、number、integer、boolean、array、objectenum(枚举值)nullable(可空)- 基本的
pattern(正则)和format(格式)约束
更复杂的约束(如正则 pattern)可能效果不稳定,建议尽量用简单约束。