结构化输出遇到递归字段时怎样约束模式
来源:17golang原创
时间:2026-10-09 13:29:22 215浏览 收藏
结构化输出遇到递归字段时,关键不是把对象定义成“无限嵌套”,而是让每一层都长成同一个、可收敛的节点。最稳妥的做法是:固定 type、label、children 三个字段,在 children.items 中用 $ref: "#" 回指根 schema,叶子节点用空数组结束递归,再用输出预算限制实际深度。
官方地址:https://developers.openai.com/api/docs/guides/structured-outputs
- 递归结构的核心是“固定节点 + 根引用”,不是为每一层复制一套属性。
strict: true约束输出形状,但不会替你判断业务值、拒答或截断。- 空
children、节点总数和最大深度要成为明确的工程边界。
先把递归对象改成可收敛的树节点
菜单、组件树、目录和流程节点都可以抽象成树。节点字段最好保持稳定:type 表示节点种类,label 保存展示文本,children 永远是数组。没有子节点时返回 [],不要省略字段,也不要一会儿返回数组、一会儿返回对象。

| 字段 | 建议约束 | 工程意义 |
|---|---|---|
| type | 字符串枚举 | 避免下游按自由文本分支 |
| label | 必填字符串 | 保证每个节点可定位 |
| children | 必填数组 | 空数组就是递归终点 |
用根引用表达 children 的自嵌套关系
JSON Schema 不需要预先写出“第一层、第二层、第三层”。把 children.items 指向根 schema,就能让同一个节点继续包含节点。下面的例子使用 Responses API 的 text.format 形式;如果使用工具调用,则把同一思路放进工具参数 schema。
from openai import OpenAI
client = OpenAI()
schema = {
"type": "object",
"properties": {
"type": {"type": "string", "enum": ["root", "section", "item"]},
"label": {"type": "string"},
# 子节点复用根定义,表达任意层级的树结构
"children": {"type": "array", "items": {"$ref": "#"}}
},
# 空 children 表示叶子节点,所有字段都保持稳定
"required": ["type", "label", "children"],
"additionalProperties": False
}
response = client.responses.create(
model="gpt-6-astra",
input="把产品导航整理成树状节点",
text={"format": {
"type": "json_schema",
"name": "navigation_tree",
"strict": True,
"schema": schema
}},
# 给递归结果设上限,防止合法嵌套耗尽输出预算
max_output_tokens=1200
)
print(response.output_text)
这里的 $ref 只负责描述形状;它不会自动阻止模型生成很深的树。递归模式应当和业务提示一起使用,例如要求“最多五层、每个节点最多八个 children”,然后在服务端再次统计深度和节点数。
strict 只是形状约束,深度仍要靠预算管理
Structured Outputs 比 JSON mode 多了一层 schema 遵循能力,但它不能保证字段里的事实一定正确。递归响应至少要区分三种结果:正常 JSON、拒答、生成被长度或其他停止条件截断。只有第一种且完成原因正常时,才适合交给后续渲染。

落地时可把边界写成检查清单:最大深度限制渲染成本,最大节点数限制内存和数据库写入,max_output_tokens 防止结果无限增长;遇到拒答或截断则记录原因并走重试、降级或人工处理,不能把半棵树当成完整导航。
相关问题
递归 schema 一定要把 children 设成必填吗?
建议必填。叶子节点返回空数组,比缺少字段更容易让序列化、类型生成和前端渲染保持单一分支。
JSON mode 能不能代替递归 Structured Outputs?
不能完全代替。JSON mode 主要保证结果是合法 JSON,不能保证每个递归节点都符合预定义 schema。
为什么 schema 正确,页面仍可能渲染失败?
schema 只管结构,不管标签内容、节点权限和引用是否存在。渲染前仍需做业务值校验、深度限制和节点数量限制。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
236 收藏
-
196 收藏
-
404 收藏
-
372 收藏
-
404 收藏
-
409 收藏
-
128 收藏
-
111 收藏
-
286 收藏
-
127 收藏
-
293 收藏
-
290 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习