Las salidas estructuradas permiten que un modelo genere resultados que siempre se ajusten a un esquema específico. Por ejemplo, se puede proporcionar a un modelo un esquema de respuesta para asegurarse de que la respuesta genere un JSON válido. Todos los modelos abiertos disponibles en Vertex AI Model as a Service (MaaS) admiten salidas estructuradas.
Para obtener más información conceptual sobre la función de salida estructurada, consulta el artículo Introducción a la salida estructurada.
Usar salidas estructuradas
En el siguiente caso práctico se define un esquema de respuesta que asegura que el resultado del modelo sea un objeto JSON con las siguientes propiedades: name, date y participants. El código de Python usa el SDK de OpenAI y los objetos de 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)
La salida del modelo se ajustará al siguiente esquema JSON:
{ "name": STRING, "date": STRING, "participants": [STRING] }
Si se le da la petición "Alice and Bob are going to a science fair on Friday" ("Alice y Bob van a una feria de ciencias el viernes"), el modelo podría generar 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)
La salida 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 interfaz de usuario:
Form
Input
Name
Email
Age
Una respuesta podría tener este aspecto:
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')
]
)