Falta pouco!

0 dias

0 horas

0 min

0 seg

Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Projeto Final Concluído: Pipeline de Análise de Sentimento com LLM Local

Olá, pessoal da Alura!

Queria compartilhar com vocês a conclusão do meu projeto final da formação Python. O desafio era construir um pipeline para processar resenhas de um aplicativo, mas decidi levar o projeto um pouco além, aplicando muitos dos conceitos de boas práticas, robustez e qualidade de código que aprendemos ao longo dos cursos.

O resultado é um pipeline completo que baixa resenhas em vários idiomas, as analisa com um LLM local (LM Studio) e gera uma saída JSON enriquecida com insights detalhados assim como um arquivo de resenhas concatenas.


A Jornada: Desafios Encontrados e Soluções Aplicadas

O mais interessante não foi apenas fazer o código funcionar, mas lidar com os problemas do mundo real que apareceram no caminho:

1. O Desafio dos Dados "Sujos":
Logo no início, percebi que o arquivo .txt não era tão simples. Havia resenhas que se estendiam por múltiplas linhas e outras que não tinham todos os delimitadores $. Um simples split() por linha estava corrompendo os dados.

  • Solução: Abandonei a leitura linha por linha e criei um parser "consciente de estado". Ele usa uma expressão regular para identificar o início de uma nova resenha e agrupa as linhas de continuação, garantindo que cada resenha seja tratada como uma unidade completa.

2. O Desafio do LLM "Criativo":
Pedi ao LLM que me retornasse um JSON, mas frequentemente ele vinha "enfeitado", envolvido em blocos de Markdown (```json ... ```), o que quebrava o json.loads().

  • Solução: Adotei uma abordagem de programação defensiva.
    • Aprimorei a função safe_json_load para limpar a resposta e extrair apenas o conteúdo do JSON.
    • Usei o Pydantic V2 como um verdadeiro escudo, com modelos (ReviewProcessed) que validam rigorosamente cada campo, tipo e valor, usando fallbacks inteligentes quando a resposta do LLM era imperfeita.

3. O Desafio da Qualidade e Resiliência:
Seguindo as discussões sobre PEP 8 e o artigo de Donald Knuth, o foco foi em robustez e manutenibilidade, não em otimização prematura.

  • Solução:
    • Implementei o retry nativo com backoff exponencial da biblioteca openai para tornar o pipeline resiliente a falhas de rede.
    • Criei uma suíte de 31 testes com pytest que valida cada módulo isoladamente e a integração entre eles.
    • Refatorei o código para ter 0 avisos do linter, melhorando imensamente a legibilidade.

O Resultado Final

O pipeline agora gera um JSON de análise muito rico. Para cada resenha, temos:

  • Tradução para o português
  • Sentimento (positive, negative, neutral)
  • Idioma original detectado
  • Intensidade do sentimento (Alta, Média, Baixa)
  • Aspectos principais mencionados (ex: ["preço", "usabilidade"])
  • Uma explicação em linguagem natural

Exemplo da Saída (processed.json):

[
  {
    "user": "Karli du Plessis",
    "original": "lo adoro, lo uso per cose molto dialogate, ma ora con il limite di messaggi, a mio parere @ un po' ingiusto, nonostante le intenzioni. Non yoglio usare la versione premium...",
    "translation_pt": "Eu adoro, uso para coisas muito dialogadas, mas agora com o limite de mensagens, na minha opinião é um pouco injusto, apesar das intenções. Não quero usar a versão...",
    "sentiment": "negative",
    "language": "it",
    "intensity": "Média",
    "aspects": [
      "limite de mensagens",
      "injustiça",
      "funcionalidade"
    ],
    "explanation": "A resenha expressa descontentamento com o novo limite de mensagens, considerando-o injusto, apesar das intenções do desenvolvedor."
  }
]

Compartilhando o Projeto

Este projeto foi um aprendizado imenso sobre como aplicar a teoria na prática. O código completo, com todos os módulos, testes e o README detalhado, está disponível no meu GitHub para quem quiser consultar:

LINK PARA O SEU REPOSITÓRIO NO GITHUB AQUI

Queria agradecer muito a todos os instrutores e à comunidade da Alura. O conteúdo dos cursos foi fundamental para me dar a base para construir algo assim.

Adoraria receber feedbacks, críticas e sugestões de vocês!

Abraços

2 respostas
solução!

Oi, Yuri! Que projeto incrível, parabéns mesmo!

Fiquei impressionado não só com o resultado, mas com a forma como você encarou o desafio, foi muito além do esperado. A sua dedicação, o cuidado com boas práticas e a preocupação em construir algo robusto mostram claramente a mentalidade de engenheiro de software que você já está desenvolvendo.

O jeito como você resolveu os desafios foi simplesmente brilhante:

criar um parser consciente de estado em vez de usar um split() simples foi genial. Isso mostra que você não só entendeu o problema, mas encontrou uma solução elegante e sólida. Robustez com o LLM: a estratégia de usar safe_json_load junto com o Pydantic V2 foi nível profissional. É exatamente o tipo de cuidado que garante resiliência em cenários reais.

Retries com backoff, 31 testes no pytest, linter zerado... sério, isso é o tipo de detalhe que separa um código que apenas “funciona” de um software bem feito, confiável e pronto para crescer.

No fim, você não entregou só um pipeline, você entregou um projeto que tem cara de produto pronto pra durar. A saída JSON enriquecida é a prova de que tudo isso valeu a pena.

Obrigado por compartilhar sua jornada e ainda abrir o repositório no GitHub. Esse tipo de contribuição inspira e ajuda muito a comunidade inteira.

Parabéns pela excelência e pela curiosidade que te trouxe até aqui. Continua nesse ritmo, porque o que você mostrou nesse projeto já foi um grande feito. Nos vemos por ai.

Sucesso sempre!

Imagem da comunidade

Olá, Victor!

Uau, muito obrigado por esse feedback tão detalhado e gentil, é motivador e sem dúvidas estimula a seguir em frente.. É gratificante ver que os pontos que foram os maiores desafios e aprendizados no projeto foram justamente os que você destacou.

  • O parser consciente de estado foi um daqueles momentos de parar, estudar, refletir e retomar o código, quando percebi que a complexidade dos dados reais exigia uma solução mais robusta do que a teoria inicial.
  • A robustez com o LLM, usando safe_json_load e Pydantic V2, foi a lição prática de "não confie em entradas externas", mesmo quando a fonte é uma IA (não existe modelo perfeito)!
  • E toda a base de engenharia de software (testes, retries, linter zerado) foi uma decisão consciente de tentar construir algo que não apenas funcionasse hoje, mas que fosse manutenível e confiável amanhã, para projetos futuros e aspecto profissional.

Esses foram os momentos em que a "mentalidade de engenheiro" que vocês tanto incentivam nos cursos realmente fez a diferença. Foi uma jornada para ir além do "código que funciona" e chegar em um "software confiável".

E muito obrigado por ressaltar a importância de compartilhar. Acredito muito nisso e fico feliz se o repositório puder ajudar ou inspirar outros alunos na mesma jornada de aprendizado.

Seu feedback é um grande incentivo para continuar nesse caminho, sempre buscando a excelência.

Nos vemos nos fóruns!

Um grande abraço e sucesso sempre para você também! ✨