Resultados estructurados para modelos abiertos

Los resultados estructurados permiten que un modelo genere resultados que siempre cumplan con un esquema específico. Por ejemplo, se le puede proporcionar un esquema de respuesta a un modelo para garantizar que la respuesta genere un JSON válido. Todos los modelos abiertos disponibles en Vertex AI Model as a Service (MaaS) admiten resultados estructurados.

Para obtener más información conceptual sobre la capacidad de resultados estructurados, consulta Introducción a los resultados estructurados.

Usa resultados estructurados

El siguiente caso de uso establece un esquema de respuesta que garantiza que el resultado del modelo sea un objeto JSON con las siguientes propiedades: nombre, fecha y participantes. El código de Python usa el SDK de OpenAI y objetos Pydantic para generar el esquema 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)

El resultado del modelo se ajustará al siguiente esquema JSON:

{ "name": STRING, "date": STRING, "participants": [STRING] }

Cuando se le proporciona la instrucción "Alice y Bob irán a una feria de ciencias el viernes", el modelo podría producir la siguiente respuesta:

{
  "name": "science fair",
  "date": "Friday",
  "participants": [
    "Alice",
    "Bob"
  ]
}

Ejemplo detallado

El siguiente código es un ejemplo de un esquema recursivo. La clase UI contiene una lista de children, que también pueden ser de la clase 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)

El resultado del modelo se ajustará al esquema del objeto Pydantic especificado en el fragmento anterior. En este ejemplo, el modelo podría generar el siguiente formulario de IU:

Form
  Input
    Name
    Email
    Age

Una respuesta podría verse de la siguiente manera:

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