Strukturerade utdata
Strukturerade utdata gör att en modell följer en JSON-schemadefinition som du anger som en del av api-anropet för slutsatsdragning. Detta står i kontrast till den äldre JSON-lägesfunktionen , som garanterade att giltig JSON skulle genereras, men inte kunde säkerställa strikt efterlevnad av det angivna schemat. Strukturerade utdata rekommenderas för funktionsanrop, extrahering av strukturerade data och skapande av komplexa arbetsflöden i flera steg.
Kommentar
- För närvarande stöds inte strukturerade utdata i bring your own data scenario.
Modeller som stöds
o1
version:2024-12-17
gpt-4o-mini
version:2024-07-18
gpt-4o
version:2024-08-06
API-stöd
Stöd för strukturerade utdata lades först till i API-versionen 2024-08-01-preview
. Den är tillgänglig i de senaste förhandsversions-API:erna samt det senaste GA-API:et: 2024-10-21
.
Komma igång
Du kan använda Pydantic
för att definiera objektscheman i Python. Beroende på vilken version av OpenAI och Pydantic
bibliotek du kör kan du behöva uppgradera till en nyare version. De här exemplen testades mot openai 1.42.0
och pydantic 2.8.2
.
pip install openai pydantic --upgrade
Om du inte har använt Microsoft Entra-ID för autentisering tidigare kan du läsa Konfigurera Azure OpenAI-tjänsten med Microsoft Entra-ID-autentisering.
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-10-21"
)
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
}
}
Funktionsanrop med strukturerade utdata
Strukturerade utdata för funktionsanrop kan aktiveras med en enda parameter genom att strict: true
ange .
Kommentar
Strukturerade utdata stöds inte med parallella funktionsanrop. När du använder strukturerade utdata som är inställda parallel_tool_calls
på 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-10-21"
)
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))
Scheman och begränsningar som stöds
Azure OpenAI-strukturerade utdata stöder samma delmängd av JSON-schemat som OpenAI.
Typer som stöds
- String
- Antal
- Booleskt
- Integer
- Objekt
- Matris
- Enum
- anyOf
Kommentar
Rotobjekt kan inte vara typen anyOf
.
Alla fält måste vara obligatoriska
Alla fält eller funktionsparametrar måste inkluderas efter behov. I exemplet nedan location
, och unit
anges båda under "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"]
}
Om det behövs kan du emulera en valfri parameter med hjälp av en union-typ med null
. I det här exemplet uppnås detta med raden "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"
]
}
}
Kapslingsdjup
Ett schema kan ha upp till 100 objektegenskaper totalt, med upp till fem kapslingsnivåer
additionalProperties: false måste alltid anges i objekt
Den här egenskapen styr om ett objekt kan ha ytterligare nyckelvärdepar som inte har definierats i JSON-schemat. För att kunna använda strukturerade utdata måste du ange värdet falskt.
Nyckelordning
Strukturerade utdata sorteras på samma sätt som det angivna schemat. Om du vill ändra utdataordningen ändrar du ordningen på schemat som du skickar som en del av din slutsatsdragningsbegäran.
Typspecifika nyckelord som inte stöds
Typ | Nyckelord som inte stöds |
---|---|
String | minlength maxLength mönster format |
Antal | minimum maximal multipleOf |
Objekt | patternProperties unevaluatedProperties propertyNames minProperties maxProperties |
Matriser | unevaluatedItems Innehåller minContains maxContains minItems maxItems uniqueItems |
Kapslade scheman med anyOf måste följa den övergripande JSON-schemadeluppsättningen
Exempel på schema som stöds 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"
]
}
Definitioner stöds
Exempel som stöds:
{
"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
}
Rekursiva scheman stöds
Exempel med # för rotrekursion:
{
"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
}
}
Exempel på explicit rekursion:
{
"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"
]
}