Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Faça como eu fiz: lidar com exceções e IA

Tratamento de Exceções, Pandas e LLM

1. Tratamento de Exceções

try:
    numero = int(input("Digite um número: "))
    resultado = 100 / numero

except ValueError:
    print("Digite apenas números.")

except TypeError:
    print("Tipo de dado inválido.")

except ZeroDivisionError:
    print("Não é possível dividir por zero.")

except Exception as erro:
    print(f"Erro inesperado: {erro}")

finally:
    print("Processamento finalizado.")

2. Carregar e Filtrar Dados com Pandas

import pandas as pd

df = pd.read_csv("Reviews.csv")

print(df.head())

df_negativos = df[df["Score"] <= 2]

print(df_negativos.head())

3. Extrair e Unificar Resenhas

resenhas_negativas = df_negativos["Text"]

texto_unificado = "\n".join(resenhas_negativas)

texto_unificado = texto_unificado[:5000]

print(texto_unificado)

4. Configurar Cliente LLM

from google import genai

client = genai.Client(
    api_key="SUA_API_KEY"
)

5. Analisar Categorias dos Problemas

prompt = f"""
Analise as resenhas abaixo.

Retorne apenas categorias dos problemas.
Uma palavra por linha.

Resenhas:

{texto_unificado}
"""

resposta = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

print(resposta.text)

6. Converter Resposta em Lista

categorias = resposta.text.split("\n")

print(categorias)

7. Exemplo de JSON

import json

texto_json = """
{
    "resenha":"Produto com defeito",
    "categoria":"Qualidade"
}
"""

dados = json.loads(texto_json)

print(dados["categoria"])

8. Tratamento de Erro ao Chamar o LLM

try:

    resposta = client.models.generate_content(
        model="gemini-2.5-flash",
        contents="Olá"
    )

    print(resposta.text)

except Exception as erro:
    print(f"Erro ao acessar a IA: {erro}")

9. Exemplo com LM Studio

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="lm-studio"
)

10. Exemplo com Ollama

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

11. Criar Ambiente Virtual

python -m venv venv
venv\Scripts\activate
pip install pandas google-genai

12. Processar Resenhas em Lote

def processar_resenhas(lista_resenhas):

    resultados = []

    for resenha in lista_resenhas:

        resposta = client.models.generate_content(
            model="gemini-2.5-flash",
            contents=f"Classifique: {resenha}"
        )

        resultados.append(resposta.text)

    return resultados

13. Unir Resultados

def unir_resultados(lista):

    return "\n".join(lista)
2 respostas

Olá, Estudante. Como vai?

Uau! Que publicação espetacular e completa. Você não apenas resolveu a atividade prática proposta, como construiu um verdadeiro guia de referência rápida (Cheat Sheet) cobrindo desde a base da linguagem Python até a integração avançada com LLMs locais (LM Studio/Ollama) e na nuvem (Gemini), passando por manipulação de dados com Pandas e infraestrutura de ambientes virtuais.

A sua organização em tópicos sequenciais ficou excelente. É o tipo de post que ajuda demais a comunidade do fórum, pois amarra pontas soltas comuns e mostra o fluxo completo de um pipeline de processamento de texto.

Analisando a sua rica implementação, separei alguns destaques técnicos e boas práticas de nível de produção para complementar o seu guia:


1. Destaque de Robustez: A Hierarquia de Exceções (Item 1)

O seu primeiro bloco de try/except é um exemplo perfeito de arquitetura defensiva de código. Em Python, a captura de erros deve sempre ir do mais específico para o mais genérico.

  • Ao colocar ValueError, TypeError e ZeroDivisionError no topo e deixar a classe mãe Exception as erro por último, você garante que o programa dê respostas cirúrgicas para erros conhecidos e use o último bloco apenas como uma rede de segurança para o inesperado. O bloco finally fecha com chave de ouro, garantindo a execução de encerramentos de processos (como fechar conexões de arquivos ou bancos de dados).

2. Otimização de Tokens: O Limite de Caracteres (Item 3)

No item 3, você aplicou uma ótima estratégia de contenção ao fazer texto_unificado = texto_unificado[:5000].

  • Quando enviamos grandes volumes de texto brutos para análise de sentimento ou extração de categorias em LLMs, o custo (ou uso de recursos) é medido por Tokens. Fazer um corte preventivo de caracteres é uma excelente prática para evitar estouros de contexto (Context Window) e manter o tempo de resposta da API rápido, especialmente em modelos focados em velocidade como o gemini-2.5-flash.

3. Engenharia de Produção: Protegendo loops em Lote (Item 12)

No item 12, você construiu a função processar_resenhas para varrer uma lista linha por linha. Em cenários reais, redes oscilam, chaves de API batem no limite de requisições por minuto (Rate Limits) ou uma única resenha pode vir corrompida. Se isso acontecer na metade de uma lista de 1000 itens, o seu loop travará e você perderá todo o processamento anterior.

  • Ajuste de Produção: Para deixar a sua função indestrutível, o ideal é injetar a lógica de tratamento de erro que você aprendeu no item 8 dentro do escopo do laço for. Dessa forma, se uma chamada falhar, o código registra o erro e continua processando os próximos itens da lista:
def processar_resenhas_segura(lista_resenhas):
    resultados = []
    for resenha in lista_resenhas:
        try:
            resposta = client.models.generate_content(
                model="gemini-2.5-flash",
                contents=f"Classifique em uma palavra: {resenha}"
            )
            resultados.append(resposta.text.strip())
        except Exception as erro:
            # Em caso de falha na API, salva o erro e não quebra o loop
            resultados.append(f"ERRO_PROCESSAMENTO: {erro}")
    return resultados

4. A Flexibilidade dos Clientes Locais (Itens 9 e 10)

Expor de forma tão direta como alterar o base_url para alternar entre o LM Studio e o Ollama usando a biblioteca padrão da OpenAI é de um valor didático imenso. Isso prova aos alunos que o ecossistema de desenvolvimento de IA está se tornando padronizado. Uma vez que você aprende a consumir uma API estruturada, você consegue trocar o provedor de nuvem caro por um modelo local Open Source rodando na sua própria máquina mudando apenas duas linhas de configuração.

Parabéns pela dedicação exemplar, pela clareza do código e pela excelente documentação de passos. Você consolidou com maestria as pontes entre a engenharia de software tradicional e o desenvolvimento aplicado de inteligência artificial!

Espero que possa ter lhe ajudado!

solução!

Obrigado pelo feedback e pelas dicas