原生的来了!OpenAI 在 API 中引入 JSON 结构化输出功能


OpenAI 在其 API 中引入了结构化输出功能,这意味着模型的输出可以可靠地遵循开发人员提供的 JSON 模式。

对复杂 JSON 模式进行评估时,具有结构化输出的新模型 gpt-4o-2024-08-06 得分为 100%。相比之下,gpt-4-0613 得分不到 40%。

这一功能包括两种形式:

  • 函数调用:通过在函数定义中设置 strict: true可以使用工具的结构化输出。此功能适用于支持工具的所有型号大模型,包括所有型号 gpt-4-0613 和 gpt-3.5-turbo-0613 及更高版本。启用结构化输出后,模型输出将与提供的工具定义匹配。
  •  response_format参数新选项:开发人员现在可以使用新参数 JSON 模式json_schema。此功能适用于最新的 GPT-4o 模型:gpt-4o-2024-08-06gpt-4o-mini-2024-07-18。当response_format设定strict: true,模型输出将与提供的模式匹配。

函数调用通过在函数定义中设置结构化输出,使模型输出与提供的工具定义相匹配,适用于所有支持工具的模型。参数 response_format 允许开发人员通过提供 JSON 模式来约束模型的响应格式,适用于最新的 GPT-4o 模型。此外,新的结构化输出功能遵循 OpenAI 的安全政策,允许模型拒绝不安全的请求,并通过新的字符串值 refusal 在 API 响应中允许开发人员以编程方式检测模型的拒绝。

同时 OpenAI 还提供了原生 SDK 支持结构化输出,包括 Python 和 Node SDK,简化了开发过程。结构化输出还支持从非结构化数据中提取结构化数据,如会议记录中的待办事项和截止日期。为了实现这一功能,OpenAI 采用了基于上下文无关语法 (CFG) 的受限解码方法,而不是传统的有限状态机 (FSM) 或正则表达式,以处理更复杂的嵌套或递归数据结构。具体原理可以查看官方博客深入了解:https://openai.com/index/introducing-structured-outputs-in-the-api

结构化输出目前已在 API 中正式推出,支持所有支持函数调用的模型,包括 GPT-4o 和 GPT-4o-mini 系列,以及之后的所有模型。此功能还与视觉输入兼容,并且可以在 chat.completion API、助手 API 和批处理 API 上使用。结构化输出的引入有助于开发人员构建更可靠的 AI 应用程序,并且可以节省输入输出费用。

简单看一下示例:

1、Function Calling:

POST /v1/chat/completions
{
"model": "gpt-4o-2024-08-06",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function."
},
{
"role": "user",
"content": "look up all my orders in may of last year that were fulfilled but not delivered on time"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "query",
"description": "Execute a query.",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"table_name": {
"type": "string",
"enum": ["orders"]
},
"columns": {
"type": "array",
"items": {
"type": "string",
"enum": [
"id",
"status",
"expected_delivery_date",
"delivered_at",
"shipped_at",
"ordered_at",
"canceled_at"
]
}
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"column": {
"type": "string"
},
"operator": {
"type": "string",
"enum": ["=", ">", "<", ">=", "<=", "!="]
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "object",
"properties": {
"column_name": {
"type": "string"
}
},
"required": ["column_name"],
"additionalProperties": false
}
]
}
},
"required": ["column", "operator", "value"],
"additionalProperties": false
}
},
"order_by": {
"type": "string",
"enum": ["asc", "desc"]
}
},
"required": ["table_name", "columns", "conditions", "order_by"],
"additionalProperties": false
}
}
}
]
}

格式化输出:

{
"table_name": "orders",
"columns": ["id", "status", "expected_delivery_date", "delivered_at"],
"conditions": [
{
"column": "status",
"operator": "=",
"value": "fulfilled"
},
{
"column": "ordered_at",
"operator": ">=",
"value": "2023-05-01"
},
{
"column": "ordered_at",
"operator": "<",
"value": "2023-06-01"
},
{
"column": "delivered_at",
"operator": ">",
"value": {
"column_name": "expected_delivery_date"
}
}
],
"order_by": "asc"
}

2、response_format参数方式:

POST /v1/chat/completions
{
"model": "gpt-4o-2024-08-06",
"messages": [
{
"role": "system",
"content": "You are a helpful math tutor."
},
{
"role": "user",
"content": "solve 8x + 31 = 2"
}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "math_response",
"strict": true,
"schema": {
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": {
"type": "string"
},
"output": {
"type": "string"
}
},
"required": ["explanation", "output"],
"additionalProperties": false
}
},
"final_answer": {
"type": "string"
}
},
"required": ["steps", "final_answer"],
"additionalProperties": false
}
}
}
}

格式化输出:

{
"steps": [
{
"explanation": "Subtract 31 from both sides to isolate the term with x.",
"output": "8x + 31 - 31 = 2 - 31"
},
{
"explanation": "This simplifies to 8x = -29.",
"output": "8x = -29"
},
{
"explanation": "Divide both sides by 8 to solve for x.",
"output": "x = -29 / 8"
}
],
"final_answer": "x = -29 / 8"
}

最后再来看一下当前世面上的一些格式化输出框架:


相關推薦

2023-04-01

制文件传到实际的 IBM PC 上运行。 但这时另外一个问题来了:如何在这么老的 IBM PC 上处理网络?  在这一步 ,Yeo 找到了一个 1983 年的 Packet Driver API ,然后使用开源的 MTCP 库集成到应用程序中,以与 Packet Driver 进行通信,

2023-06-15

JSON对象作为输出。这让开发人员能更准确地从模型获取结构化数据,实现从自然语言到API调用或数据库查询的转换,也可以用于从文本中提取结构化数据。 这意味着经过OpenAI的微调后,你跟它说人话,它就能识别后给你转换成

2023-03-04

更新了什么 ShowDoc 是一个非常适合 IT 团队的在线 API 文档、技术文档工具,既有免费开源版,也有开箱可用的在线官网版。 本次版本 v3.1.0 主要新增了 AI 助手功能,集成了 chatGPT 的能力来辅助用户生成文档内容。 如何使用 AI

2023-12-03

添加新角色 InvoiceOCRAssistant,能够扫描发票和收据并提取结构化信息。 重新定义角色对观察到的消息的反应,并提供三种反应模式。 支持基本的人类互动。 02 错误修复和改进 添加跳过雇佣工程师的选项。 为 a

2022-12-04

PyTorch 团队在昨日举办的 2022 PyTorch Conference 大会上宣布了 PyTorch 2.0,提供了用于体验的早期版本,并表示稳定版将于 2023 年 3 月上旬发布。 团队介绍道,PyTorch 2.0 是他们向 PyTorch 下一代 2 系列迈出的第一步。在过去的几年里

2023-09-22

调用 NAPI(Native API),NAPI 是一套基于 Node.js 规范开发的原生模块扩展开发框架。 NAPI 可以实现 JavaScript 与 C/C++ 代码之间相互访问,也就是 ArkTS 可以直接和 C/C++ 无缝调用,类似 dart ffi 效果。 方舟开发框架(简称 ArkUI)是一

2022-09-11

式,把业务逻辑前推到前端,让前端动态查询,第二个是结构化查询,输出结果和输入结构一样,所见即所得。前者个人认为只有用MyServerless的开发模式才能理想地同时解决安全和开发效率问题,后者则是本次更新内容,即在jSq

2024-07-11

每周500w,并且还在呈现快速增长的趋势。 Vitest 是一个原生支持 Vite 的测试框架。Vitest 以其快速、简洁的测试解决方案而爆火,只需要很少的配置即可上手。由于 Vitest 和 Vite 使用相同的配置文件,因此将 Vitest 集成到 Vue 应用

2024-10-01

使用重排模型进行多路召回,支持自定义全局变量,支持OpenAI Compatible API调用格式,支持支持ECharts图表和HTML页面的渲染;知识库方面,支持上传Excel和CSV表格文档,支持对多个文档进行批量重新向量化操作,支持问题批量关联

2023-05-11

变,它还涉及添加重要的新特性和功能。 使用记录构建结构化数据 借助记录,你可以使用简洁明了的语法构建结构化数据。 ( String , int ) userInfo( Map < String , dynamic > json) { return (json[ 'name' ] as String , json[ 'height' ] as int ); }

2023-10-26

tokens 的故事。Claude 可以编辑、改写、总结、分类、提取结构化数据、根据内容进行问答等。它在英语方面的训练最多,但在其他一系列常用语言方面也表现出色。Claude 还掌握了大量常用编程语言的知识。 Claude 从一开始就被

2023-04-18

Whisper 是 OpenAI 推出的一个自动语音识别(ASR)系统,whisper.cpp 则是 Whisper 模型的 C/C++ 移植。whisper.cpp 具有无依赖项、内存使用量低等特点,支持 Mac、Windows、Linux、iOS 和 Android 系统。 概述 增加了 Core ML 支持 恢复了解码回

2023-01-03

一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。 ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析,还可一键生成海量数据用于性能和压力测

2023-02-27

创建文件 --format=json > myfile.json。CLI 提供的信息将更加结构化和彻底,以便更容易用于自动化,特别是在 CI/CD 系统中。 新的 package_id Conan 2.0 定义了一个新的、动态的 package_id,与 Conan 1.X 的局限性相比,这个 package_id将考虑