Output terstruktur
Output terstruktur membuat model mengikuti definisi Skema JSON yang Anda berikan sebagai bagian dari panggilan API inferensi Anda. Ini berbeda dengan fitur mode JSON yang lebih lama, yang menjamin JSON yang valid akan dihasilkan, tetapi tidak dapat memastikan kepatuhan yang ketat terhadap skema yang disediakan. Output terstruktur direkomendasikan untuk panggilan fungsi, mengekstrak data terstruktur, dan membangun alur kerja multi-langkah yang kompleks.
Catatan
- Output terstruktur saat ini tidak didukung pada skenario bawa data Anda sendiri.
Model yang didukung
Saat ini hanya gpt-4o
versi: 2024-08-06
mendukung output terstruktur.
Dukungan API
Dukungan untuk output terstruktur pertama kali ditambahkan dalam versi 2024-08-01-preview
API .
Memulai
Anda dapat menggunakan Pydantic
untuk menentukan skema objek di Python. Bergantung pada versi OpenAI dan Pydantic
pustaka apa yang Anda jalankan, Anda mungkin perlu meningkatkan ke versi yang lebih baru. Contoh-contoh ini diuji terhadap openai 1.42.0
dan pydantic 2.8.2
.
pip install openai pydantic --upgrade
Jika Anda baru menggunakan ID Microsoft Entra untuk autentikasi, lihat Cara mengonfigurasi Layanan Azure OpenAI dengan autentikasi ID Microsoft Entra.
from pydantic import BaseModel
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_ad_token_provider=token_provider,
api_version="2024-08-01-preview"
)
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
completion = client.beta.chat.completions.parse(
model="MODEL_DEPLOYMENT_NAME", # replace with the model deployment name of your gpt-4o 2024-08-06 deployment
messages=[
{"role": "system", "content": "Extract the event information."},
{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
],
response_format=CalendarEvent,
)
event = completion.choices[0].message.parsed
print(event)
print(completion.model_dump_json(indent=2))
Output
name='Science Fair' date='Friday' participants=['Alice', 'Bob']
{
"id": "chatcmpl-A1EUP2fAmL4SeB1lVMinwM7I2vcqG",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "{\n \"name\": \"Science Fair\",\n \"date\": \"Friday\",\n \"participants\": [\"Alice\", \"Bob\"]\n}",
"refusal": null,
"role": "assistant",
"function_call": null,
"tool_calls": [],
"parsed": {
"name": "Science Fair",
"date": "Friday",
"participants": [
"Alice",
"Bob"
]
}
}
}
],
"created": 1724857389,
"model": "gpt-4o-2024-08-06",
"object": "chat.completion",
"service_tier": null,
"system_fingerprint": "fp_1c2eaec9fe",
"usage": {
"completion_tokens": 27,
"prompt_tokens": 32,
"total_tokens": 59
}
}
Panggilan fungsi dengan output terstruktur
Output Terstruktur untuk panggilan fungsi dapat diaktifkan dengan satu parameter, dengan menyediakan strict: true
.
Catatan
Output terstruktur tidak didukung dengan panggilan fungsi paralel. Saat menggunakan output terstruktur, atur parallel_tool_calls
ke false
.
from enum import Enum
from typing import Union
from pydantic import BaseModel
import openai
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-08-01-preview"
)
class GetDeliveryDate(BaseModel):
order_id: str
tools = [openai.pydantic_function_tool(GetDeliveryDate)]
messages = []
messages.append({"role": "system", "content": "You are a helpful customer support assistant. Use the supplied tools to assist the user."})
messages.append({"role": "user", "content": "Hi, can you tell me the delivery date for my order #12345?"})
response = client.chat.completions.create(
model="MODEL_DEPLOYMENT_NAME", # replace with the model deployment name of your gpt-4o 2024-08-06 deployment
messages=messages,
tools=tools
)
print(response.choices[0].message.tool_calls[0].function)
print(response.model_dump_json(indent=2))
Skema dan batasan yang didukung
Output terstruktur Azure OpenAI mendukung subset Skema JSON yang sama dengan OpenAI.
Jenis yang didukung
- String
- Number
- Boolean
- Bilangan bulat
- Objek
- Array
- Enum
- anyOf
Catatan
Objek akar tidak boleh berjenis anyOf
.
Semua bidang harus diperlukan
Semua bidang atau parameter fungsi harus disertakan sesuai kebutuhan. Dalam contoh di bawah ini location
, dan unit
keduanya ditentukan di bawah "required": ["location", "unit"]
.
{
"name": "get_weather",
"description": "Fetches the weather in the given location",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The location to get the weather for"
},
"unit": {
"type": "string",
"description": "The unit to return the temperature in",
"enum": ["F", "C"]
}
},
"additionalProperties": false,
"required": ["location", "unit"]
}
Jika diperlukan, dimungkinkan untuk meniru parameter opsional dengan menggunakan jenis serikat dengan null
. Dalam contoh ini, ini dicapai dengan baris "type": ["string", "null"],
.
{
"name": "get_weather",
"description": "Fetches the weather in the given location",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The location to get the weather for"
},
"unit": {
"type": ["string", "null"],
"description": "The unit to return the temperature in",
"enum": ["F", "C"]
}
},
"additionalProperties": false,
"required": [
"location", "unit"
]
}
}
Kedalaman berlapis
Skema mungkin memiliki total hingga 100 properti objek, dengan hingga lima tingkat bersarang
additionalProperties: false harus selalu diatur dalam objek
Properti ini mengontrol apakah objek dapat memiliki pasangan nilai kunci tambahan yang tidak ditentukan dalam Skema JSON. Untuk menggunakan output terstruktur, Anda harus mengatur nilai ini ke false.
Pengurutan kunci
Output terstruktur diurutkan sama dengan skema yang disediakan. Untuk mengubah urutan output, ubah urutan skema yang Anda kirim sebagai bagian dari permintaan inferensi Anda.
Kata kunci khusus jenis yang tidak didukung
Jenis | Kata Kunci yang Tidak Didukung |
---|---|
String | minlength maxLength pola format |
Number | minimum maksimum multipleOf |
Objek | patternProperties unevaluatedProperties propertyNames minProperties maxProperties |
Larik | unevaluatedItems Berisi minContains maxContains minItems maxItems uniqueItems |
Skema berlapis menggunakan anyOf harus mematuhi subset Skema JSON secara keseluruhan
Contoh skema yang didukung anyOf
:
{
"type": "object",
"properties": {
"item": {
"anyOf": [
{
"type": "object",
"description": "The user object to insert into the database",
"properties": {
"name": {
"type": "string",
"description": "The name of the user"
},
"age": {
"type": "number",
"description": "The age of the user"
}
},
"additionalProperties": false,
"required": [
"name",
"age"
]
},
{
"type": "object",
"description": "The address object to insert into the database",
"properties": {
"number": {
"type": "string",
"description": "The number of the address. Eg. for 123 main st, this would be 123"
},
"street": {
"type": "string",
"description": "The street name. Eg. for 123 main st, this would be main st"
},
"city": {
"type": "string",
"description": "The city of the address"
}
},
"additionalProperties": false,
"required": [
"number",
"street",
"city"
]
}
]
}
},
"additionalProperties": false,
"required": [
"item"
]
}
Definisi didukung
Contoh yang didukung:
{
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"$ref": "#/$defs/step"
}
},
"final_answer": {
"type": "string"
}
},
"$defs": {
"step": {
"type": "object",
"properties": {
"explanation": {
"type": "string"
},
"output": {
"type": "string"
}
},
"required": [
"explanation",
"output"
],
"additionalProperties": false
}
},
"required": [
"steps",
"final_answer"
],
"additionalProperties": false
}
Skema rekursif didukung
Contoh menggunakan # untuk rekursi akar:
{
"name": "ui",
"description": "Dynamically generated UI",
"strict": true,
"schema": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "The type of the UI component",
"enum": ["div", "button", "header", "section", "field", "form"]
},
"label": {
"type": "string",
"description": "The label of the UI component, used for buttons or form fields"
},
"children": {
"type": "array",
"description": "Nested UI components",
"items": {
"$ref": "#"
}
},
"attributes": {
"type": "array",
"description": "Arbitrary attributes for the UI component, suitable for any element",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the attribute, for example onClick or className"
},
"value": {
"type": "string",
"description": "The value of the attribute"
}
},
"additionalProperties": false,
"required": ["name", "value"]
}
}
},
"required": ["type", "label", "children", "attributes"],
"additionalProperties": false
}
}
Contoh rekursi eksplisit:
{
"type": "object",
"properties": {
"linked_list": {
"$ref": "#/$defs/linked_list_node"
}
},
"$defs": {
"linked_list_node": {
"type": "object",
"properties": {
"value": {
"type": "number"
},
"next": {
"anyOf": [
{
"$ref": "#/$defs/linked_list_node"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false,
"required": [
"next",
"value"
]
}
},
"additionalProperties": false,
"required": [
"linked_list"
]
}