Saída estruturada para modelos abertos

Com as saídas estruturadas, um modelo pode gerar resultados que sempre seguem um esquema específico. Por exemplo, um modelo pode receber um esquema de resposta para garantir que a resposta produza um JSON válido. Todos os modelos abertos disponíveis no Modelo como serviço (MaaS) da Vertex AI oferecem suporte a saídas estruturadas.

Para mais informações conceituais sobre a capacidade de saída estruturada, consulte Introdução à saída estruturada.

Usar saídas estruturadas

O caso de uso a seguir define um esquema de resposta que garante que a saída do modelo seja um objeto JSON com as seguintes propriedades: nome, data e participantes. O código Python usa o SDK da OpenAI e objetos Pydantic para gerar o 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)

A saída do modelo vai obedecer ao seguinte esquema JSON:

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

Quando recebe o comando "Alice e Bob vão a uma feira de ciências na sexta-feira", o modelo pode gerar a seguinte resposta:

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

exemplo detalhado

O código a seguir é um exemplo de esquema recursivo. A classe UI contém uma lista de children, que também podem ser da 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)

A saída do modelo vai obedecer ao esquema do objeto Pydantic especificado no snippet anterior. Neste exemplo, o modelo pode gerar o seguinte formulário de UI:

Form
  Input
    Name
    Email
    Age

Uma resposta pode ser semelhante a esta:

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