Saídas estruturadas
Saídas Estruturadas garantem que os dados gerados pelos modelos sigam esquemas predefinidos fornecidos pelo usuário, como JSON, simplificando integrações em aplicações. Quando o formato da resposta é crítico, estratégias como expressões regulares (regex) podem ser usadas, mas essas abordagens são frequentemente frágeis, complexas e incapazes de garantir que todos os campos sejam extraídos de forma precisa e consistente. Por outro lado, Saídas Estruturadas oferecem uma solução mais confiável, reduzindo erros e facilitando a integração direta. Contudo, para casos em que respostas narrativas ou flexibilidade são prioritárias, seu uso não é necessário.
Exemplos de Uso
1. Extração de Dados
Extraia informações estruturadas de textos não estruturados:
from pydantic import BaseModel
import openai
client = openai.OpenAI(
api_key="", #Sua API_KEY
base_url="https://chat.maritaca.ai/api",
)
class DetalhesEvento(BaseModel):
nome_evento: str
data: str
participantes: list[str]
traje: list[str]
completion = client.beta.chat.completions.parse(
model="sabia-3",
messages=[
{"role": "system", "content": "Extraia detalhes do evento."},
{"role": "user", "content": "João e Maria vão a uma festa junina no sábado, às 18h, em Campina Grande. Eles vão vestidos a caráter: Maria com um vestido florido e João com camisa xadrez e chapéu de palha."},
],
response_format=DetalhesEvento,
)
evento = completion.choices[0].message.parsed
print(evento)
2. Análise de Sentimentos
Identifique sentimentos em textos:
import openai
client = openai.OpenAI(
api_key="", #Sua API_KEY
base_url="https://chat.maritaca.ai/api",
)
sentimento_schema = {
"type": "object",
"schema":{
"properties": {
"texto": {"type": "string"},
"sentimento": {"type": "string", "enum": ["positivo", "negativo", "neutro"]},
},
"required": ["texto", "sentimento"],
}
}
completion = client.beta.chat.completions.parse(
model="sabia-3",
messages=[
{"role": "system", "content": "Classifique o sentimento do texto em positivo, negativo ou neutro."},
{"role": "user", "content": "Odiei o trabalho oferecido!"},
],
response_format={"type": "json_schema", "json_schema": sentimento_schema}
)
resultado = completion.choices[0].message.content
print(resultado)
3. Plano de Leitura
Gere um plano de leitura estruturado com base na solicitação do usuário, validando os dados com um esquema JSON e exibindo os livros com seus detalhes.
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel
import openai
import json
client = openai.OpenAI(
api_key="", #Sua API_KEY
base_url="https://chat.maritaca.ai/api",
)
class TipoLeitura(str, Enum):
classico = "clássico"
contemporaneo = "contemporâneo"
class Livro(BaseModel):
tipo: TipoLeitura
titulo: str
autor: str
descricao: str
Livro.model_rebuild()
class PlanoLeitura(BaseModel):
nome_plano: str
livros: List[Livro]
schema = {
"type": "object",
"schema": {
"properties": {
"nome_plano": {"type": "string"},
"livros": {
"type": "array",
"items": {
"type": "object",
"properties": {
"tipo": {"type": "string", "enum": ["clássico", "contemporâneo"]},
"titulo": {"type": "string"},
"autor": {"type": "string"},
"descricao": {"type": "string"},
"subitens": {"type": ["array", "null"]}
},
"required": ["tipo", "titulo", "autor", "descricao"]
}
}
},
"required": ["nome_plano", "livros"]
}
}
completion = client.beta.chat.completions.parse(
model="sabia-3",
messages=[
{"role": "system", "content": "Você é um gerador de planos de leitura. Converta a solicitação do usuário em um plano de leitura estruturado."},
{"role": "user", "content": "Crie um plano de leitura para explorar a literatura brasileira, incluindo clássicos e literatura contemporânea."}
],
response_format={"type": "json_schema", "json_schema": schema}
)
plano_leitura = PlanoLeitura.model_validate(json.loads(completion.choices[0].message.content))
print("Nome do Plano:", plano_leitura.nome_plano)
print("Livros:")
for livro in plano_leitura.livros:
print(f" - {livro.titulo} por {livro.autor}: {livro.descricao}")