Les sorties structurées permettent à un modèle de générer des sorties qui respectent toujours un schéma spécifique. Par exemple, un modèle peut être fourni avec un schéma de réponse pour s'assurer que la réponse produit du code JSON valide. Tous les modèles ouverts disponibles sur Vertex AI Model as a Service (MaaS) sont compatibles avec les sorties structurées.
Pour en savoir plus sur la fonctionnalité de sortie structurée, consultez Présentation des sorties structurées.
Utiliser des sorties structurées
Le cas d'utilisation suivant définit un schéma de réponse qui garantit que la sortie du modèle est un objet JSON avec les propriétés suivantes : nom, date et participants. Le code Python utilise le SDK OpenAI et les objets Pydantic pour générer le schéma JSON.
from pydantic import BaseModel
from openai import OpenAI
client = OpenAI()
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
completion = client.beta.chat.completions.parse(
model="MODEL_NAME",
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,
)
print(completion.choices[0].message.parsed)
La sortie du modèle respectera le schéma JSON suivant :
{ "name": STRING, "date": STRING, "participants": [STRING] }
Si vous fournissez la requête "Alice et Bob vont à une exposition scientifique vendredi", le modèle peut générer la réponse suivante :
{
"name": "science fair",
"date": "Friday",
"participants": [
"Alice",
"Bob"
]
}
Exemple détaillé
Le code suivant est un exemple de schéma récursif. La classe UI
contient une liste de children
, qui peuvent également appartenir à la classe UI
.
from pydantic import BaseModel
from openai import OpenAI
from enum import Enum
from typing import List
client = OpenAI()
class UIType(str, Enum):
div = "div"
button = "button"
header = "header"
section = "section"
field = "field"
form = "form"
class Attribute(BaseModel):
name: str
value: str
class UI(BaseModel):
type: UIType
label: str
children: List["UI"]
attributes: List[Attribute]
UI.model_rebuild() # This is required to enable recursive types
class Response(BaseModel):
ui: UI
completion = client.beta.chat.completions.parse(
model="MODEL_NAME",
messages=[
{"role": "system", "content": "You are a UI generator AI. Convert the user input into a UI."},
{"role": "user", "content": "Make a User Profile Form"}
],
response_format=Response,
)
print(completion.choices[0].message.parsed)
La sortie du modèle respectera le schéma de l'objet Pydantic spécifié dans l'extrait précédent. Dans cet exemple, le modèle pourrait générer le formulaire d'UI suivant :
Form
Input
Name
Email
Age
Une réponse peut ressembler à ce qui suit :
ui = UI(
type=UIType.div,
label='Form',
children=[
UI(
type=UIType.div,
label='Input',
children=[],
attributes=[
Attribute(name='label', value='Name')
]
),
UI(
type=UIType.div,
label='Input',
children=[],
attributes=[
Attribute(name='label', value='Email')
]
),
UI(
type=UIType.div,
label='Input',
children=[],
attributes=[
Attribute(name='label', value='Age')
]
)
],
attributes=[
Attribute(name='name', value='John Doe'),
Attribute(name='email', value='john.doe@example.com'),
Attribute(name='age', value='30')
]
)