1
resposta

[Projeto] Faça como eu fiz: pipeline RAG

Olá! Tudo bem?

Segue o link do repositório com a implementação da atividade:

Link do Git: https://github.com/Moquiuti/tecnicas_avancadas_rag

Nesta etapa final, implementei uma pipeline RAG com avaliação baseada em um arquivo JSON, seguindo a proposta da atividade de carregar um dataset de perguntas e respostas, transformar os dados para manter apenas os campos query e answer, gerar respostas sem RAG e com RAG, comparar os resultados e medir a precisão do sistema.

Como nas atividades anteriores, mantive a abordagem local-first por conta da limitação encontrada anteriormente com a OpenAI, que retornou erro 429 - insufficient_quota. Dessa forma, em vez de utilizar GPT/OpenAI diretamente, adaptei a solução para rodar localmente com ChatOllama, OllamaEmbeddings, modelo llama3.2:3b, embeddings bge-m3 e FAISS como banco vetorial local.

O fluxo implementado foi:

JSON de avaliação
→ extração dos campos query e answer
→ carregamento da base documental
→ chunking dos documentos
→ criação/carregamento do FAISS
→ geração de respostas sem RAG
→ geração de respostas com RAG
→ avaliação local das respostas
→ cálculo de precisão
→ gravação dos resultados em JSON

O que foi feito

Nesta entrega, criei um arquivo JSON de avaliação com perguntas e respostas esperadas sobre políticas corporativas. O script carrega esse JSON, ignora campos auxiliares como id e category, e transforma os dados para manter apenas os campos exigidos pela atividade:

query
answer

Depois disso, o pipeline carrega os documentos da base de conhecimento, incluindo arquivos .txt e PDFs, realiza o chunking com RecursiveCharacterTextSplitter, cria uma vector store FAISS local e configura um retriever com k=4.

Também foram implementados dois fluxos de resposta:

Pipeline sem RAG:
pergunta → modelo local → resposta

Pipeline com RAG:
pergunta → retriever → contexto recuperado → modelo local → resposta

A comparação foi feita por uma função de avaliação local, criada para evitar dependência de serviços pagos. Essa função mede a resposta usando dois critérios:

similaridade textual com o gabarito
cobertura de termos importantes da resposta esperada

Com isso, o sistema calcula um score_final, define se a resposta foi considerada correta e gera as métricas finais de precisão.

Resultado obtido

A execução foi concluída com sucesso. O pipeline carregou o dataset com 6 perguntas, configurou os modelos locais, carregou 72 documentos da base, gerou 274 chunks, criou a vector store FAISS e executou a avaliação comparativa.

O resultado final foi:

SEM RAG:
Acertos: 1/6
Precisão: 16,67%
Score médio: 0,3904

COM RAG:
Acertos: 4/6
Precisão: 66,67%
Score médio: 0,5833

Esse resultado mostrou uma melhora objetiva com o uso de RAG. O pipeline com recuperação de contexto respondeu melhor à maior parte das perguntas, especialmente nos casos em que a resposta estava claramente presente nos documentos, como regras sobre cartão corporativo, despesas sem comprovante, prazo de reembolso e aprovação de viagens.

Também foi possível observar pontos de melhoria. Em algumas perguntas, o RAG recuperou contexto insuficiente ou não localizou corretamente a informação esperada, o que reforça a importância de ajustar parâmetros como chunk_size, chunk_overlap, k do retriever, qualidade dos documentos, embeddings e estratégia de avaliação.

Ajustes e cuidados implementados

Durante a implementação, fiz alguns ajustes para tornar o pipeline mais estável e evitar erros comuns de indexação e leitura de dados:

validação da existência do arquivo JSON
extração apenas dos campos query e answer
uso de encoding utf-8-sig
validação de documentos carregados
validação de chunks gerados
persistência do FAISS em disco
configuração explícita do k do retriever
salvamento dos resultados em resultado_avaliacao_rag.json

Também deixei comentários no código explicando como seria o caminho original com OpenAI e qual foi o caminho alternativo utilizado por falta de crédito/quota.

Arquivos principais para validação

Os principais arquivos desta entrega são:

pipeline_rag_avaliacao_json.py
dataset_avaliacao.json
resultado_avaliacao_rag.json

O resultado final demonstrou melhora com RAG, saindo de 16,67% de precisão sem recuperação para 66,67% com recuperação, o que reforça o valor da arquitetura RAG quando bem estruturada e avaliada.

1 resposta

Oi, Leandro! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura. Sua implementação ficou bem completa ao montar uma pipeline RAG local com ChatOllama, OllamaEmbeddings, FAISS e uma avaliação própria baseada em query e answer. Chamou atenção o cuidado em comparar respostas sem RAG e com RAG, além de registrar métricas como precisão e score_final, mostrando de forma objetiva a melhora obtida com recuperação de contexto.

Uma dica interessante para o futuro é testar variações do k do retriever para comparar se mais documentos recuperados melhoram a resposta ou trazem ruído. Veja este exemplo:

retriever = vectorstore.as_retriever(search_kwargs={"k": 6})

resposta = rag_chain.invoke({"query": pergunta})
print(resposta)

Esse código ajusta o numero de documentos recuperados para 6 antes de gerar a resposta, ajudando a avaliar se a qualidade melhora com mais contexto.

Alura

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

Conteúdos relacionados
Classificação: validação de modelos e métricas de avaliação
O que é Engenharia de Prompt e quais as suas principais técnicas? Aprenda a escrever um bom comando para IA