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

[Projeto] Desafio do curso: criando e manipulando arquivos

Minha solução simples como nos aprendizados, sem refatoramento pra funções

#criando lista de perguntas e gravando em um txt
lista_de_perguntas = [
    "De que é feito o Sol?",
    "De que é feito o planeta Saturno?",
    "Qual é a galáxia mais antiga já encontrada?",
    "Qual é a maior estrela já encontrada?",
    "Qual é a estrela mais próxima do Sol?"
]

try:
  with open('perguntas.txt', 'w', encoding='utf-8') as arquivo:
        for pergunta in lista_de_perguntas:
            arquivo.write(pergunta + '\n')
except FileExistsError:
  print("Arquivo já existe")
#lendo o arquivo criado e criando uma lista de perguntas lidas do arquivo
lista_de_perguntas_lidas = []

try:
  with open('perguntas.txt', 'r', encoding='utf-8') as arquivo:
      for linha in arquivo:
          lista_de_perguntas_lidas.append(linha)
except FileNotFoundError:
  print("Arquivo não existe")

lista_de_perguntas_lidas
!pip install -q groq
import os
import openai
from google.colab import userdata

os.environ["GROQ_API_KEY"] = userdata.get('GROQ_API_KEY')
#respostas do LLM com groq e llama
#Terceira Etapa
#reaproveitando o que aprendemos com alguma modificações
#troquei o modelo
#removi o stream
#temperatura 0.5
#separei por ; porque um texto poderia estar vindo como resposta ou pergunta com ","
from groq import Groq

client = Groq()

def obter_resposta_sucinta_do_llm(pergunta: str) -> str:
    """
    Envia uma pergunta para a GenAI API e retorna 'resposta'.
    """
    try:
        completion = client.chat.completions.create(
            model="llama-3.3-70b-versatile",
            messages=[
                {
                    "role": "user",
                    "content": f"{pergunta} Responda de forma extremamente concisa."
                }
            ],
            temperature=0.5,
            max_completion_tokens=150,
            stream=False, # stream desativado para receber a resposta pronta
        )

        # Captura o texto completo da resposta
        resposta = completion.choices[0].message.content.strip()
        
        # Retorna formatado
        return f"{resposta}"

    except Exception as e:
        return f"Erro ao processar: {e}"


#Escrever arquivo com perguntas e respostas
try:
    with open('perguntas_e_respostas.csv', 'w', encoding='utf-8') as arquivo:
        for pergunta in lista_de_perguntas_lidas:
            pergunta_limpa = pergunta.strip()
            resultado = obter_resposta_sucinta_do_llm(pergunta_limpa)
            
            # Adicionamos o \n para que o pandas entenda que é uma nova linha
            linha = f"{pergunta_limpa};{resultado.strip()}\n"
            arquivo.write(linha)
            
            print(f"Processado: {pergunta_limpa}")

except Exception as e:
    print(f"Um erro ocorreu: {e}")

df = pd.read_csv("perguntas_e_respostas.csv", sep=';', encoding='UTF-8')

df.head(2)
df
2 respostas
solução!

Olá, Marcelo. Como vai?

Parabéns pela resolução do desafio! O seu projeto ficou excelente e muito bem estruturado. Mesmo sem refatorar tudo para funções (o que é perfeitamente compreensível e comum na fase de prototipagem), você demonstrou domínio sobre conceitos avançados e muito importantes para a engenharia de dados e IA.

Gostaria de destacar alguns pontos excelentes na sua implementação:

  • Uso correto do with open(...): Utilizar o gerenciador de contexto with é a melhor prática em Python, pois garante que o arquivo seja fechado automaticamente se ocorrer algum erro no meio do caminho.
  • Uso do parâmetro encoding='utf-8': Crucial para evitar que caracteres acentuados ou símbolos quebrem na leitura e escrita, especialmente lidando com a língua portuguesa.
  • Separação por ponto e vírgula (;): Essa foi uma sacada genial de engenharia de dados. Mudar o delimitador do CSV de vírgula para ; evita que o Pandas quebre as colunas caso o modelo Llama retorne uma frase longa cheia de vírgulas na resposta.
  • Configuração da chamada da API: Mudar para o modelo mais robusto llama-3.3-70b-versatile, fixar a temperature em 0.5 (trazendo respostas mais factuais e menos criativas) e desativar o stream para receber o bloco de texto pronto foram escolhas muito maduras.

Para enriquecer ainda mais o seu aprendizado e o seu portfólio, trago três sugestões e boas práticas bem legais que você pode aplicar ou testar:

1. Otimização na leitura de arquivos

No seu bloco de leitura, você usou um laço for para percorrer as linhas e dar um .append(). O Python possui um método nativo muito rápido chamado .readlines() que já faz exatamente isso, ou você pode usar um recurso chamado List Comprehension para limpar as quebras de linha (\n) logo na leitura. Veja como o seu código poderia ficar mais compacto:

# Lendo e limpando os espaços/quebras de linha em uma única linha de código
try:
    with open('perguntas.txt', 'r', encoding='utf-8') as arquivo:
        lista_de_perguntas_lidas = [linha.strip() for linha in arquivo.readlines()]
except FileNotFoundError:
    print("Arquivo não existe")

2. Atenção ao ler o CSV no Pandas (Nomes de Colunas)

No final do seu script, você usou df = pd.read_csv("perguntas_e_respostas.csv", sep=';', encoding='UTF-8').

Como o seu arquivo CSV foi escrito linha por linha diretamente com os dados, ele não possui uma linha de cabeçalho (a primeira linha já é uma pergunta e uma resposta). Por padrão, o Pandas vai achar que a sua primeira pergunta é o nome das colunas!

Para resolver isso de forma elegante, você pode passar o parâmetro names para dar nome às colunas no momento da leitura:

# Informando ao Pandas os nomes das colunas, já que o arquivo não tem cabeçalho
df = pd.read_csv("perguntas_e_respostas.csv", sep=';', encoding='UTF-8', names=['Pergunta', 'Resposta'])

3. Escrevendo arquivos direto pelo Pandas (Opcional)

Como você já está usando o Pandas no projeto, vale a pena conhecer o caminho inverso. Em vez de abrir o arquivo com with open e escrever as strings manualmente com arquivo.write(linha), você poderia salvar os resultados em uma lista de dicionários e usar o Pandas para gerar o arquivo CSV de forma nativa e automática com o .to_csv(). Isso economiza código e já cria o cabeçalho certinho!

O seu projeto final cumpre com maestria tudo o que foi proposto no curso e mostra que você está pronto para construir pipelines de dados que conectam arquivos locais com grandes modelos de linguagem (LLMs).

Continue com esse excelente ritmo de estudos e compartilhando suas soluções no fórum!

Espero que possa ter lhe ajudado!

Obrigado pelo feedback Evandro. Um Abraço