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

[Desafio Final] Problema pós acionamento do LLM

Prezados, bom momento!

Estou com um problema na resolução do último desafio do curso. Notei que a quantidade de avaliações contadas está diferente da quantidade de avaliações do arquivo txt. Para contextualizar melhor, segue abaixo a forma como abordei o problema:

  • Etapa 01: Subir o TXT
import pandas as pd

colunas = ["user_id", "username", "resenha"]

df_desafio_final = pd.read_csv("Resenhas_App_ChatGPT.txt", sep='$', header=None, names=colunas, encoding='utf-8')
  • Print diagnóstico para checar quantidade de linhas do dataframe
print(f"Linhas lidas do arquivo: {len(df_desafio_final)}")
  • Etapa 02: Chamar o LLM para traduzir e subir uma avaliação
from openai import OpenAI
import json
  • Configurar cliente
client_openai = OpenAI(
    base_url="http://127.0.0.1:1234/v1",
    api_key="lm-studio"
)


resposta_do_llm = client_openai.responses.create(
    model="google/gemma-3-1b",
    input=f"""Você é uma analista de dados. Vou te passar um dataframe contendo uma lista de resenhas de um aplicativo.
                
        Você deverá criar uma lista em texto em formato JSON, seguindo o modelo abaixo, sendo que cada objeto na lista deve conter as seguintes quatro chaves:
        
        - 'username': o valor da coluna 'username' do dataframe
        - 'resenha-ori': o valor da coluna 'resenha' do dataframe
        - 'resenha-pt': o valor da coluna 'resenha' do dataframe, traduzido para o português;
        - 'avaliacao': a avaliação atribuída à resenha, que pode ser 'Positiva', 'Neutra' ou 'Negativa' (apenas uma das opções)

        Segue abaixo exemplo de uma resenha fictícia, para que você entenda o formato do JSON que deverá ser gerado:
        {{'username': 'ftsdan',
        'resenha-ori': 'I did not find anything noteworthy about the app.',
        'resenha-pt': 'Não encontrei nada de notável sobre o app.',
        'avaliacao': 'Neutra'}}

        Importante, retornar APENAS a lista em texto em formato JSON.

        Aqui estão as resenhas do dataframe:
        {df_desafio_final.to_dict(orient='records')}
        
        
        """
        )
  • Etapa 03: Transformar resposta em lista de dicionários Python
json_resposta = (resposta_do_llm.output_text)
json_resposta_limpo = json_resposta.replace("```json", "").replace("```", "")

dicionario_resposta = json.loads(json_resposta_limpo)
  • Etapa 04: Contar avaliações através de função
def contar_avaliacoes(dicionario_resposta):
    contagem = {"Positiva": 0, "Neutra": 0, "Negativa": 0}
    for resenha in dicionario_resposta:
        avaliacao = resenha.get("avaliacao")
        if avaliacao in contagem:
            contagem[avaliacao] += 1
    return contagem

contagem_avaliacoes = contar_avaliacoes(dicionario_resposta)
print(contagem_avaliacoes)

print(f"Linhas lidas de resposta: {len(dicionario_resposta)}")

print(json_resposta_limpo)

O resultado final deste código é o seguinte:

Linhas lidas do arquivo: 24 (Check inicial do dataframe)
{'Positiva': 7, 'Neutra': 9, 'Negativa': 3} (Contagem das avaliações)
Linhas lidas de resposta: 20 (Contagem de linhas lidas do dicionário de respostas)

Notem que por algum motivo, o prompt não está fazendo a varredura completa nas resenhas presentes no dataframe.

Preciso de uma ajuda para garantir que todo o arquivo seja avaliado pelo LLM (a IA do VSCode sugeriu segmentar as avaliações em batches, mas me parece uma solução complexa demais para este problema, por isso vim recorrer à vocês).

2 respostas
solução!

Resolvido.

Criei um dicionário para dataframe "df_desafio_final" e alterei meu prompt para pegar, uma a uma, as resenhas deste dicionário e me retornar o JSON de cada objeto. Ainda dentro do loop, transformei o resultado em JSON, e compilei dentro de um segundo dicionário, que depois utilizei para fazer a contagem das avaliações.

Acredito que o problema estava em tentar processar tudo ao mesmo tempo de uma vez só, o que provavelmente acarretou nas limitações de utilização de tokens que já conhecemos. Ao segmentar tudo um-a-um, o erro foi resolvido.

Olá, Daniel! Como vai?

Excelente solução a sua.

Você identificou muito bem a limitação de tokens ao tentar processar tudo de uma vez e encontrou uma saída inteligente ao segmentar o processamento resenha por resenha. Essa abordagem incremental não só resolve o problema técnico, como também torna o fluxo mais controlado e fácil de depurar.

Transformar cada resultado em JSON dentro do loop e depois consolidar em um segundo dicionário para análise foi uma estratégia bem estruturada. Isso garante que cada etapa seja validada antes de compilar o conjunto final, evitando erros acumulados.

Parabéns pela forma como raciocinou e ajustou o processo.

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!