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')
]
)
Obtén respuestas de objetos JSON
Puedes restringir el modelo para que solo genere objetos JSON sintácticamente válidos si configuras el campo response_format
en { "type": "json_object" }
. A menudo, se denomina modo JSON. El modo JSON es útil cuando se genera JSON para usarlo con llamadas a funciones o con otras tareas posteriores que requieren entrada JSON.
Cuando se habilita el modo JSON, el modelo se limita a generar solo cadenas que se analizan en objetos JSON válidos. Si bien este modo garantiza que el resultado sea un JSON sintácticamente correcto, no aplica ningún esquema específico. Para asegurarte de que el modelo genere un JSON que siga un esquema específico, debes incluir instrucciones en la instrucción, como se muestra en el siguiente ejemplo.
En los siguientes ejemplos, se muestra cómo habilitar el modo JSON y darle instrucciones al modelo para que devuelva un objeto JSON con una estructura específica:
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Python.
Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Antes de ejecutar esta muestra, asegúrate de configurar la variable de entorno OPENAI_BASE_URL
.
Para obtener más información, consulta Autenticación y credenciales.
from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="MODEL", response_format={ "type": "json_object" }, messages=[ {"role": "user", "content": "List 5 rivers in South America. Your response must be a JSON object with a single key \"rivers\", which has a list of strings as its value."}, ] ) print(response.choices[0].message.content)
Reemplaza MODEL
por el nombre del modelo que deseas usar, por ejemplo, meta/llama3-405b-instruct-maas
.
REST
Después de configurar tu entorno, puedes usar REST para probar una instrucción de texto. En el siguiente ejemplo, se envía una solicitud al extremo del modelo de publicador.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
- PROJECT_ID es el ID del proyecto de Google Cloud.
- LOCATION: Una región que admite modelos abiertos.
- MODEL: El nombre del modelo que deseas usar, por ejemplo,
meta/llama3-405b-instruct-maas
.
Método HTTP y URL:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions
Cuerpo JSON de la solicitud:
{ "model": "MODEL", "response_format": { "type": "json_object" }, "messages": [ { "role": "user", "content": "List 5 rivers in South America. Your response must be a JSON object with a single key \"rivers\", which has a list of strings as its value." } ] }
Para enviar tu solicitud, elige una de estas opciones:
curl
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions"
PowerShell
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions" | Select-Object -Expand Content
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
¿Qué sigue?
- Obtén más información sobre las llamadas a funciones.
- Obtén más información sobre Thinking.
- Obtén más información sobre las predicciones por lotes.