Sortie structurée pour les modèles ouverts

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')
    ]
)