Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenAI 结构化输出:开发者指南

OpenAI 结构化输出:开发者指南

作者头像
云云众生s
发布于 2024-09-30 01:44:11
发布于 2024-09-30 01:44:11
1.1K00
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:0
代码可运行

学习如何使用 Open AI API 生成与您的 JSON 模式完全匹配的模型输出,从而获得一致、结构化的数据格式。

译自 OpenAI Structured Outputs: How-To Guide for Developers,作者 Oladimeji Sowole。

OpenAI 新的结构化输出功能旨在确保模型生成的输出与您提供的 JSON 模式完全匹配。此功能对于需要一致且结构化数据格式的开发人员特别有用,无论是用于 API 集成、数据处理还是应用程序开发。

我将指导您开始使用结构化输出,包括设置环境、定义 JSON 模式以及使用 OpenAI API 生成符合您规范的模型输出。

结构化输出简介

结构化输出允许您通过定义模型输出必须遵循的 JSON 模式来强制执行特定的数据格式。这确保了模型生成的数据既可预测又可靠,可以无缝地融入您现有的数据工作流程。结构化输出可以通过两种主要方式实现:通过函数调用和使用带有新 json_schema 选项的 response_format 参数。

为什么使用结构化输出?

当您需要以下内容时,结构化输出非常有用:

  • 与需要特定格式数据的其他 API 集成。
  • 确保模型返回的数据一致性,减少对额外验证或格式化的需求。
  • 简化在依赖结构化数据的应用程序(例如数据库或 Web 服务)中使用 大型语言模型 (LLM) 的过程。

入门

先决条件

在深入研究结构化输出之前,请确保您具备以下条件:

  1. 在您的机器上安装了 Python
  2. 一个 OpenAI API 密钥
  3. dotenv库,用于管理环境变量。您可以使用 pip安装必要的库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install openai python-dotenv

设置您的环境

首先在您的项目目录中创建一个 .env 文件,以安全地存储您的 OpenAI API 密钥:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OPENAI_API_KEY=your_openai_api_key

接下来,在您的 Python 脚本中加载此 API 密钥以与 OpenAI API 交互:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import openai
from dotenv import load_dotenv

load_dotenv()

# Set OpenAI API key
openai.api_key = os.getenv('OPENAI_API_KEY')

在 OpenAI API 中使用结构化输出

让我们逐步介绍如何在实践中使用结构化输出,重点关注函数调用和 response_format 参数。

1. 定义 JSON 模式

首先,定义一个模型输出应符合的 JSON 模式。对于此示例,我假设您正在使用一个简单的用户配置文件数据模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"},
        "email": {"type": "string", "format": "email"}
    },
    "required": ["name", "age", "email"]
}

此模式指定输出必须是一个包含三个字段的对象:nameageemailname 字段是一个字符串,age 是一个整数,email 必须遵循电子邮件格式。

2. 设置 API 请求

接下来,设置一个 API 请求,指示模型生成与此模式匹配的数据。使用带有 json_schema 选项的 response_format 参数来强制执行结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generate_profile():
    schema = {
        "type": "object",
        "properties": {
            "name": {"type": "string"},
            "age": {"type": "integer"},
            "email": {"type": "string", "format": "email"}
        },
        "required": ["name", "age", "email"]
    }

    response = openai.Completion.create(
        model="gpt-3.5-turbo",
        prompt="Generate a user profile:",
        response_format={"json_schema": schema},
        max_tokens=100
    )

    return response['choices'][0]['message']['content']

print(generate_profile())

3. 将函数调用与结构化输出一起使用

利用结构化输出的另一种方法是通过函数调用。这种方法允许您根据提供的模式定义模型可以调用的特定函数。以下是实现方法:

a. 定义函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def create_user_profile(name, age, email):
    return {
        "name": name,
        "age": age,
        "email": email
    }

b. 向 OpenAI 注册函数

您需要将函数注册为模型可以调用的工具。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tools = [
    {
        "type": "function",
        "function": {
            "name": "create_user_profile",
            "description": "Create a user profile with name, age, and email.",
            "parameters": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "age": {"type": "integer"},
                    "email": {"type": "string", "format": "email"}
                },
                "required": ["name", "age", "email"]
            }
        }
    }
]

c. 生成输出

现在,您可以通过 API 调用函数来生成输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jsonschema
from jsonschema import validate

def validate_profile(profile, schema):
    try:
        validate(instance=profile, schema=schema)
        print("Profile is valid.")
    except jsonschema.exceptions.ValidationError as err:
        print("Profile is invalid:", err)

# Example usage
profile = generate_profile_with_function_calling()
validate_profile(json.loads(profile), schema)

d. 验证输出

获得输出后,务必根据模式对其进行验证,以确保其满足所有指定的要求。尽管 API 尝试符合模式,但最好添加额外的验证层。

处理错误和异常

使用结构化输出时,如果模型的输出与定义的模式不匹配,则可能会遇到错误。优雅地处理这些错误对于构建强大的应用程序至关重要。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generate_and_validate_profile():
    try:
        profile = generate_profile_with_function_calling()
        validate_profile(json.loads(profile), schema)
        return profile
    except Exception as e:
        return f"An error occurred: {e}"

print(generate_and_validate_profile())

结论

结构化输出是一个强大的功能,使开发人员能够使用 JSON 模式在模型输出中强制执行特定的数据格式。无论是通过函数调用还是 response_format 参数,此功能都可确保模型生成的输出是可预测的、一致的,并且可以与其他系统集成。

按照本指南中概述的步骤,您可以开始在自己的项目中使用结构化输出,从而提高 AI 应用程序的可靠性和实用性。无论您是与 API 集成、使用数据库还是构建数据驱动的应用程序,结构化输出都可以帮助您维护数据的完整性并减少对后处理的需求。

立即开始尝试结构化输出,了解此功能如何简化您的工作流程并增强应用程序的功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-292,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenAI的结构化浅析
  OpenAI于2024年8月6日在其新模型gpt-4o-2024-08-06上推出了结构化输出功能(Structured Outputs)。截至本文撰写日期(2024年8月25日),gpt-4o仍指向上一版本gpt-4o-2024-05-13,尚不支持结构化输出。有趣的是,gpt-4o-mini反而已经支持了这一功能,这点值得大家注意。那么,结构化输出究竟是什么?为什么OpenAI要专门发布一篇博客来详细介绍它呢?接下来,让我们一起深入了解这个话题。
xindoo
2024/10/29
3000
OpenAI的结构化浅析
解密prompt系列46. LLM结构化输出代码示例和原理分析
最近闭源大模型们都陆续支持结构化输出,这一章我们先结合demo看下开源和闭源对结构化输出的支持,随后会介绍Constrained Decoding和Format Restricting Instructions 两种结构化输出约束方案,最后会给出结构化输出对比自然语言输出的一些观点。
风雨中的小七
2025/01/02
8160
解密prompt系列46. LLM结构化输出代码示例和原理分析
OpenAI API JSON 格式指南与json_repair错误修复
核心参数是response_format={"type": "json_object"} ,其他支持json调用的模型也可以这样使用的,下面我们以Openai模型为例
致Great
2025/05/11
7970
OpenAI API JSON 格式指南与json_repair错误修复
程序员笑疯了!GPT-4o模型再升级,JSON输出100%准确率,不用再自己写代码了
OpenAi重磅升级GPT-4o,迎来GPT-4o-2024-08-06新版本更新
用户11203141
2025/03/06
1450
程序员笑疯了!GPT-4o模型再升级,JSON输出100%准确率,不用再自己写代码了
JetBrains增强AI代码补全功能
其他消息,Figma 推出了一个名为 Handoff 的新的开源项目,该项目可以自动将设计转换为代码。
云云众生s
2024/08/12
2280
JetBrains增强AI代码补全功能
lmdeploy 部署 InternLM2.5 7B 多轮对话
LMDeploy 是一个高效且友好的 LLMs 模型部署工具箱,功能涵盖了量化、推理和服务
用户10497140
2024/10/14
2730
LLM 输出 JSON 格式频频出错?直到我五一假期发现这个方法
前段时间写了一个脚本,批量处理用户 Input,然后让 GPT 处理返回处理后对应的 JSON 格式内容。
Immerse
2025/05/09
5070
LLM 输出 JSON 格式频频出错?直到我五一假期发现这个方法
开发者如何利用Perplexity的Sonar大型语言模型
对于开发者而言,Perplexity 的 Sonar 提供了一个构建创新型应用程序的机会,这些应用程序可以利用实时 AI 搜索的强大功能。
云云众生s
2025/02/05
3750
开发者如何利用Perplexity的Sonar大型语言模型
大炮打蚊子,Gemini从PDF抽取结构化文本
原文:# From PDFs to Insights: Structured Outputs from PDFs with Gemini 2.0 来源:https://www.philschmid.de/gemini-pdf-to-data
Ai学习的老章
2025/07/12
1330
大炮打蚊子,Gemini从PDF抽取结构化文本
Python JSON终极指南:从基础到高级实战
在当今数据驱动的世界中,JSON(JavaScript Object Notation)已成为事实上的数据交换标准。从Web API到配置文件,从NoSQL数据库到日志格式,JSON无处不在。而Python凭借其简洁优雅的语法和强大的内置库,成为处理JSON数据的首选语言。
熊猫钓鱼
2025/08/01
1560
实现接口的契约测试
在当前微服务和前后端分离大行其道的行业背景下,越来越多的团队采用了前后端分离和微服务的架构风格。 A团队开发某服务并提供对应API服务,B团队是A团队的使用者调用A团队的API。A团队埋头苦干,B团队也争分夺秒,两边都开发完了,往往一联调,就出现很多问题。
赵云龙龙
2020/09/24
1.6K0
RAG应用在得物开放平台的智能答疑的探索
得物开放平台是一个把得物能力进行开放,同时提供给开发者提供 公告、应用控制台、权限包申请、业务文档等功能的平台。
得物技术
2025/01/07
2880
RAG应用在得物开放平台的智能答疑的探索
学习笔记 | ChatGPT Prompt Engineering for Developers 2
学习笔记|ChatGPT Prompt Engineering for Developers 2
做数据的二号姬
2023/09/06
2300
学习笔记 | ChatGPT Prompt Engineering for Developers 2
AI大模型全栈工程师课程笔记 - LangChain
LangChain 也是面向LLM的开发框架SDK,有 python 和 js 版的 https://python.langchain.com/docs/get_started
Michael阿明
2023/12/21
1.7K0
AI大模型全栈工程师课程笔记 - LangChain
Python基础教程(二十三):JSON数据解析
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/06/18
2070
AI大模型全栈工程师课程笔记 - Function Call
课程学习自 知乎知学堂 https://www.zhihu.com/education/learning
Michael阿明
2023/11/23
1.2K1
校验数据结构调研
ajv和joi是两个常见的JavaScript JSON Schema 库,它们在社区生态、用法和API设计方面都有一些区别。以下是它们之间的比较:
爱吃大橘
2023/04/22
1K0
AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出
Typescript 之父(微软)在 7月 21 号发布了一个有趣的项目—— [Typechat](https://github.com/microsoft/TypeChat)。旨在使用 AI 来连接自然语言和应用的 Schema / API。说白话就是使用 Typescript 类型信息来约束 ChatGPT 输出内容的结构。
_sx_
2023/10/23
6880
AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出
Gemini-2.5-Pro 开发者指南:5种优化 API 接入的关键方法
Google DeepMind 于 2025年3月发布的 Gemini 2.5 Pro 是目前功能最强大的多模态AI模型之一。相比前代产品,新版本在多个维度实现了显著提升,特别是在推理能力和多模态处理方面表现突出。
AI小智哥
2025/07/22
7770
Gemini-2.5-Pro 开发者指南:5种优化 API 接入的关键方法
使用LLM实现自然语言的SQL查询代理
相信大部分研发同学都遇到过这样的场景:业务已经上线了一段时间,产品或运营同学想查看一下实时的业务数据。虽然对于成熟的系统来说,大多有完善的数据分析平台或运营管理后台,可以在各个维度展示业务数据,但是产品和运营同学的查询需求可能是频繁变更的,如“帮我查一下粉丝数>100的用户有哪些?”、“最近1小时内点赞数超过100的视频有多少条?”…。针对这种场景,现有的平台可能无法完全覆盖多样化的查询需求,所以通常需要研发同学手动跑 SQL,这也是很多后端同学经常自嘲为 “SQL Boy” 的原因。这种手动跑 SQL 的流程大致如下:
张申傲
2024/09/06
7860
使用LLM实现自然语言的SQL查询代理
推荐阅读
相关推荐
OpenAI的结构化浅析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档