OpenAI 新模型 gpt-4o-2024-08-06 以及 gpt-4o-mini 支持结构化输出了,和以前的 JSON 模式不一样,现在的结构化输出不仅可以定义 JSON 的 Schema(也就是 JSON 输出的结构是什么样子),而且可以确保输出的 JSON 是 100% 正确的。
第一眼看到我是不相信的,毕竟被它的 JSON 输出坑过不止一次两次,以至于我自己维护了一个 JSON 解析的函数,加上了各种容错,但仔细看看应该是没问题的。
它背后的技术保障是通过两部分来实现的:
第一部分是对模型针对性的训练,让其能更好的支持 JSON,但这只能达到 93% 的准确率,虽然已经远高于 GPT-4 的 40%。
第二部分就比较玄乎,简单来说 LLM 通过预测下一个 Token 来生成内容,默认情况下可以任意生成下一个 Token,但是在 JSON 模式下,当你预测下一个 Token 时,会增加一些限制,比如你输入了 “{"val”,那么接下来的输出,就只能是字母、数字、下划线、双引号等,不允许再生成一个 “{”。不仅仅是 JSON 格式本身的限制,还可以限制必须符合 Schema 的定义。
作为代价,第一次请求新的 JSON Schema 要慢一点,因为需要额外增加 Schema 预处理的时间。
新的结构化输出虽然强大,但是也有一些限制:
1. 只允许一部分 JSON Schema:String、Number、Boolean、Object、Array、Enum、anyOf,不支持oneOf 和 allOf,正常够用了
2. 所有字段都是必选的,不能可选
3. 嵌套不能超过5层,不能超过100个属性
4. 一些保留字不能作为属性名,比如字符串类型不能用minLength、maxLength等
5. 第一个带有新Schema的API响应将产生额外的延迟,后续会缓存,一般延迟不会超过 10 秒,但复杂的Schema可能需要长达一分钟的预处理时间
6. 结构化输出并不能防止所有类型的模型错误。例如,模型仍可能在JSON对象的值中犯错误(例如,在数学方程中步骤出错)。如果出错,建议在提示词中提供示例或将任务拆分为更简单的子任务。
还有一些其他细节和限制这里就不一一列举了,完整的介绍可以参考其文档。
最后,新模型的价格下调了,输入价格只有原来的一半,输出也便宜了 1/3。
文档:https://t.co/nRy35ZpDJm
点击图片查看原图