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.
- Aprimorei a função
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.
- Implementei o retry nativo com backoff exponencial da biblioteca
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