Desvendando a GenAI - Parte 7
Vamos explorar como usar a biblioteca ell para retornar dados estruturados em vez de uma simples string. A ideia é criar um "taggeador de documentos" que extrai duas tags sobre um assunto.
Neste exemplo, vamos explorar como usar a biblioteca ell para retornar dados estruturados (como um objeto) em vez de uma simples string. A ideia é criar um "taggeador de documentos" que extrai duas tags (Área e Assunto) de um conteúdo de texto, utilizando a funcionalidade de outputs estruturados fornecida pelo ell.complex.
Passo 1: Configuração do Ambiente
Primeiro, vamos configurar o ambiente e carregar as bibliotecas necessárias. Além da biblioteca ell, também vamos usar o pydantic para definir uma estrutura de dados (BaseModel) para os tags que queremos gerar a partir do modelo LLM.
import os
from openai import OpenAI
import ell
from dotenv import load_dotenv
from pydantic import BaseModel, Field
# Carregando variáveis de ambiente
load_dotenv(r".env")
OPENAI_SERVICE_ACCOUNT_KEY = os.getenv("OPENAI_SERVICE_ACCOUNT_KEY")
# Iniciando a biblioteca ell com a flag verbose true para mensagens de debug mais intuitivas
client = OpenAI(api_key=OPENAI_SERVICE_ACCOUNT_KEY)
ell.init(verbose=True, default_client=client)
Passo 2: Definindo a Estrutura de Dados para as Tags
Para capturar a resposta de maneira estruturada, criamos uma classe DocumentTags usando o pydantic. Essa classe vai definir as tags que esperamos receber do modelo: "Área" e "Assunto". Isso transforma o output do modelo em um objeto estruturado, tornando a resposta muito mais útil e manipulável.
class DocumentTags(BaseModel):
area: str = Field(description="A área do documento")
subject: str = Field(description="O assunto do documento")
Passo 3: Criando a Função com ell.complex
Agora, criamos uma função generate_tags que usa o decorador ell.complex para definir que o modelo retornará um objeto do tipo DocumentTags. O parâmetro response_format informa à biblioteca como transformar a resposta do modelo em uma instância dessa classe.
@ell.complex(model="gpt-4o-mini", response_format=DocumentTags, client=client)
def generate_tags(document_content: str):
"""Você é um taggeador de documentos. Dado o conteúdo de um documento, você deve retornar tags estruturadas sobre o documento. Caso não consiga inferir o atributo, deve preencher com None."""
return f"Generate tags for the following document: {document_content}"
Alguém conseguem imaginar porque usar o prompt como docstring pode não ser a melhor alternativa sempre? Comenta aí!
Aqui, a função generate_tags recebe o conteúdo de um documento como input e retorna um conjunto estruturado de tags, extraindo informações como "Área" e "Assunto".
Passo 4: Chamando a Função com Diferentes Documentos
Agora, vamos testar nossa função passando dois documentos diferentes. O objetivo é ver como o modelo pode identificar e extrair as tags de cada conteúdo.
Exemplo 1: Texto sobre Grafeno
tag_message = generate_tags(
"""# Grafeno: Uma Revolução Tecnológica
O grafeno é um material composto por uma única camada de átomos de carbono dispostos em uma rede hexagonal. Ele é conhecido por suas propriedades excepcionais, como alta condutividade elétrica e térmica, além de ser extremamente leve e resistente. Descoberto em 2004, o grafeno tem potencial para revolucionar diversas indústrias, incluindo eletrônica, medicina e energia. Suas aplicações vão desde baterias mais eficientes até dispositivos médicos avançados, tornando-o um dos materiais mais promissores da atualidade."""
)
tags: DocumentTags = tag_message.parsed
print(f"Area: {tags.area}, Subject: {tags.subject}")
Exemplo 2: Texto sobre o Sol
tag_message = generate_tags(
"""# O Sol: A Estrela da Nossa Vida
O Sol é a estrela central do nosso sistema solar, responsável por fornecer luz e calor essenciais para a vida na Terra. Composto principalmente de hidrogênio e hélio, ele gera energia através da fusão nuclear em seu núcleo. Essa energia é liberada como luz e calor, sustentando a vida e influenciando o clima do nosso planeta. O Sol tem aproximadamente 4,6 bilhões de anos e está a cerca de 150 milhões de quilômetros da Terra. Sua importância é vital para a existência e o desenvolvimento de todas as formas de vida que conhecemos."""
)
tags: DocumentTags = tag_message.parsed
print(f"Area: {tags.area}, Subject: {tags.subject}")
Passo 5: Resultado Esperado
O modelo agora retorna um objeto com as tags estruturadas de acordo com o conteúdo fornecido:
Para o texto sobre Grafeno:
Area: Ciência, Subject: Grafeno
Para o texto sobre o Sol:
Area: Astronomia, Subject: O Sol
Conclusão
Com o uso do ell.complex, conseguimos transformar uma interação simples com o modelo GPT em uma resposta mais rica e estruturada. Agora, em vez de retornar apenas uma string, o modelo nos fornece um objeto com campos específicos que podemos manipular diretamente no nosso código.
Esse tipo de abordagem é altamente útil quando se trabalha com APIs e modelos de LLMs, permitindo que você lide com dados estruturados ao invés de strings sem formato. Isso também torna o código mais fácil de entender, manipular e integrar com outras partes de um sistema.
Além disso, com a biblioteca ell, você não precisa se preocupar com a formatação do input ou do output — ela cuida de tudo isso para você, permitindo que você foque na lógica do seu código.
Este exemplo é só o começo! Você pode expandir essa abordagem para retornar tipos mais complexos, como listas, dicionários ou até mesmo realizar tarefas mais avançadas de processamento de dados.
Se você gostou dessa abordagem e quer ver mais exemplos práticos, fique atento às futuras postagens!