Saída estruturada para modelos abertos

As saídas estruturadas permitem que um modelo gere uma saída que cumpre sempre um esquema específico. Por exemplo, pode ser fornecido a um modelo um esquema de resposta para garantir que a resposta produz um JSON válido. Todos os modelos abertos disponíveis no Vertex AI Model as a Service (MaaS) suportam resultados estruturados.

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

Use resultados estruturados

O exemplo de utilização seguinte define um esquema de resposta que garante que a saída do modelo é um objeto JSON com as seguintes propriedades: name, date e participants. O código Python usa o SDK da OpenAI e os 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 seguir o seguinte esquema JSON:

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

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

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

Exemplo detalhado

O código seguinte é um exemplo de um 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 seguir o esquema do objeto Pydantic especificado no fragmento anterior. Neste exemplo, o modelo pode gerar o seguinte formulário de IU:

Form
  Input
    Name
    Email
    Age

Uma resposta pode ter o seguinte aspeto:

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