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!

1
resposta

[Projeto] Usando O llama 3.1-8b

Automatizei a geração dos comentários e, em seguida uma avaliação do sentimento:

from openai import OpenAI
from dotenv import load_dotenv
import openai
import os

load_dotenv()

client = OpenAI(
    base_url=os.getenv("BASE_URL"),
    api_key=os.getenv("API_KEY")
)

MODELO = os.getenv("MODEL_ALTERNATIVO")

# Cria a pasta caso não exista
os.makedirs("./dados", exist_ok=True)


def carrega(nome_arquivo: str) -> str:
    """Lê um arquivo de texto."""

    try:
        with open(nome_arquivo, "r", encoding="utf-8") as arquivo:
            return arquivo.read()
    except FileNotFoundError:
        return ""
    except Exception as e:
        print(f"Erro ao abrir {nome_arquivo}: {e}")
        return ""


def salva(nome_arquivo: str, conteudo: str):
    """Salva um texto em um arquivo."""

    try:
        with open(nome_arquivo, "w", encoding="utf-8") as arquivo:
            arquivo.write(conteudo)
    except Exception as e:
        print(f"Erro ao salvar {nome_arquivo}: {e}")


def gerar_avaliacoes(produto: str):
    """
    Gera avaliações fictícias para um produto.
    """

    print(f"Criando avaliações para '{produto}'...")

    prompt_sistema = """
Você é um gerador de avaliações de clientes.

Crie exatamente 30 avaliações realistas para um produto.

Regras:

- misture opiniões positivas, negativas e neutras;
- cada avaliação deve possuir entre uma e três frases;
- algumas pessoas devem reclamar;
- outras devem elogiar bastante;
- escreva apenas as avaliações;
- não numere as avaliações.
"""

    mensagens = [
        {
            "role": "system",
            "content": prompt_sistema
        },
        {
            "role": "user",
            "content": f"Gere avaliações para um {produto}."
        }
    ]

    response = client.chat.completions.create(
        model=MODELO,
        messages=mensagens
    )

    texto = response.choices[0].message.content

    arquivo = f"./dados/avaliacoes-{produto}.txt"

    salva(arquivo, texto)

    print(f"Avaliações salvas em {arquivo}\n")


def analise_sentimentos(produto: str):

    arquivo_avaliacoes = f"./dados/avaliacoes-{produto}.txt"

    if not os.path.exists(arquivo_avaliacoes):
        gerar_avaliacoes(produto)

    avaliacoes = carrega(arquivo_avaliacoes)

    prompt_sistema = """
Você é um analisador de sentimentos.

Analise as avaliações recebidas.

Responda exatamente no formato:

Nome do Produto:

Resumo das Avaliações:

Sentimento Geral:
(Positivo, Negativo ou Neutro)

Pontos Fortes:
- item
- item
- item

Pontos Fracos:
- item
- item
- item

O resumo deve possuir no máximo 50 palavras.
"""

    mensagens = [
        {
            "role": "system",
            "content": prompt_sistema
        },
        {
            "role": "user",
            "content": avaliacoes
        }
    ]

    print(f"Analisando '{produto}'...")

    try:

        response = client.chat.completions.create(
            model=MODELO,
            messages=mensagens
        )

        resultado = response.choices[0].message.content

        arquivo_saida = f"./dados/analise-{produto}.txt"

        salva(arquivo_saida, resultado)

        print(f"Análise salva em {arquivo_saida}")

        if response.usage:
            print(
                f"Tokens -> Prompt: {response.usage.prompt_tokens} | "
                f"Resposta: {response.usage.completion_tokens} | "
                f"Total: {response.usage.total_tokens}"
            )

        print("-" * 60)

    except openai.AuthenticationError as e:
        print(f"Erro de autenticação: {e}")

    except openai.APIError as e:
        print(f"Erro da API: {e}")

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


def main():

    produtos = [
        "mouse",
        "teclado",
        "monitor",
        "impressora",
        "scanner"
    ]

    print("=" * 60)
    print("ANÁLISE AUTOMÁTICA DE SENTIMENTOS")
    print("=" * 60)

    for produto in produtos:
        analise_sentimentos(produto)

    print("\nProcessamento finalizado.")


if __name__ == "__main__":
    main()

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Fala, Paulo! Tudo bom?

Agradeço por trazer sua solução para o fórum!

Curti demais como trabalhou a automação de geração de texto para criar avaliações com Python, entendeu perfeitamente a importância da estrutura de prompts para guiar o modelo e utilizou bem o tratamento de exceções para garantir robustez no fluxo.

Algo bem legal para complementar é aplicar o try-with-resources equivalente em Python usando with open(...) ao salvar ou carregar arquivos, deixando o código mais seguro e enxuto. Dessa maneira:

def salva(nome_arquivo: str, conteudo: str):
    """Salva um texto em um arquivo."""
    try:
        with open(nome_arquivo, "w", encoding="utf-8") as arquivo:
            arquivo.write(conteudo)
    except Exception as e:
        print(f"Erro ao salvar {nome_arquivo}: {e}")

Isso faz com que o fechamento do arquivo seja automático, evitando problemas de recursos abertos.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Modularização: separar geração de avaliações e análise em módulos distintos.
  • Logs estruturados: registrar erros e métricas em arquivos de log para monitorar execução.
  • Escalabilidade: permitir que os produtos sejam lidos de uma lista externa (como um CSV) em vez de fixos no código.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você prefere manter os produtos fixos no código ou já pensa em evoluir para carregar dinamicamente de uma base externa (como CSV ou banco de dados)?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!