Boa tarde galera! 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, avancei na construção de uma pipeline RAG com foco em avaliação automatizada de respostas, utilizando a ideia proposta pelo curso com QA-Eval e geração de pares de perguntas e respostas. O objetivo principal foi comparar respostas geradas pelo modelo com respostas esperadas, permitindo avaliar de forma mais estruturada a qualidade do pipeline.
A proposta da atividade era trabalhar com um dataset no formato query e answer, gerar respostas com e sem RAG, comparar essas respostas com os gabaritos e analisar o desempenho obtido. Também foi abordada a geração automática de perguntas e respostas a partir dos chunks dos documentos, utilizando uma abordagem baseada em QAGenerationChain / QAGenerateChain.
Como nas atividades anteriores, mantive a adaptação local por conta da limitação de uso da OpenAI. Durante os testes anteriores, a API da OpenAI retornou erro 429 - insufficient_quota, indicando ausência de crédito/quota disponível. Por esse motivo, continuei utilizando uma abordagem local-first, com Ollama e modelos locais, preservando a proposta técnica da atividade sem gerar custo de API.
O fluxo trabalhado nesta entrega foi:
documentos → chunks → vector store → perguntas de avaliação → resposta sem RAG → resposta com RAG → comparação com gabarito → análise de desempenho
O que foi implementado
Nesta atividade, implementei um script de avaliação automatizada para o pipeline RAG, contemplando os seguintes pontos:
- preparação de um dataset manual de avaliação com os atributos query e answer;
- configuração de um modelo local via ChatOllama;
- configuração de embeddings locais;
- carregamento de documentos a partir das pastas já utilizadas no projeto;
- divisão dos documentos em chunks;
- criação ou carregamento de um índice FAISS;
- configuração de um retriever para recuperação de contexto;
- criação de uma chain sem RAG, onde o modelo responde sem acesso aos documentos;
- criação de uma chain com RAG, onde o modelo responde usando contexto recuperado do vector store;
- implementação de uma função que percorre o dataset, gera respostas e acumula os resultados;
- integração com QAEvalChain para comparar respostas geradas com os gabaritos;
- cálculo de acurácia estimada;
- tentativa de geração automática de pares pergunta/resposta com QAGenerateChain;
- análise final comparando o desempenho com RAG e sem RAG.
Adaptações realizadas
A atividade original considera o uso de OpenAI como modelo principal para geração, embeddings e avaliação. Como optei por manter o projeto sem custo de API, fiz a adaptação para modelos locais:
ChatOpenAI → ChatOllama
OpenAIEmbeddings → embeddings locais via Ollama / BGE
LangSmith → desabilitado
OpenAI quota → contornado com execução local
Também deixei comentários no código explicando onde estaria o caminho original com OpenAI e onde foi aplicada a alternativa local. A ideia foi manter o aprendizado do curso, mas adaptando a implementação para um ambiente viável, gratuito e executável localmente.
Um ponto importante é que a avaliação com LLM local pode não ter a mesma estabilidade ou precisão de um modelo maior, como os modelos da OpenAI. Mesmo assim, a estrutura da avaliação foi implementada corretamente, permitindo entender o processo completo:
dataset → geração de resposta → comparação com gabarito → métrica → análise
Sobre a geração automática de perguntas e respostas
Além do dataset manual, também foi incluída a etapa de geração automática de perguntas e respostas a partir dos chunks dos documentos, usando a classe QAGenerateChain.
Essa parte foi tratada com cuidado porque as APIs do LangChain mudaram bastante entre versões. Por isso, o código foi preparado com fallback de importação entre langchain_classic e langchain.evaluation, evitando que a atividade quebrasse por diferença de versão da biblioteca.
Mesmo que a qualidade dos pares gerados dependa bastante do modelo local utilizado, a etapa foi implementada para demonstrar o fluxo técnico proposto pelo curso.
Comparação com e sem RAG
A atividade também permitiu visualizar uma diferença importante: quando o modelo responde sem RAG, ele depende apenas do conhecimento interno e pode dar respostas genéricas. Quando responde com RAG, ele passa a receber trechos recuperados dos documentos, o que tende a aumentar a aderência ao conteúdo real da base.
sem RAG → pergunta direta ao modelo
com RAG → pergunta + contexto recuperado do FAISS
Arquivos principais para validação:
Para facilitar a análise, os principais arquivos relacionados a esta atividade são:
- avaliacao_rag_qa_eval.py
- Console da atividade avaliacao_rag_qa_eval -> console do resultado da execução