Implementando um RAG
Motivação
Este projeto tem como objetivo construir um sistema de RAG (Retrieval-Augmented Generation) com foco em baixo custo, levando em consideração principalmente os gastos com infraestrutura. Por isso, a prioridade foi o uso de CPU em vez de GPU, tornando a solução acessível para qualquer pessoa.
A ideia central foi desenvolver o melhor RAG possível utilizando técnicas adequadas, e não necessariamente as ferramentas mais caras ou robustas do mercado. O lema do projeto é: “Fazer muito com pouco”, utilizando modelos menores, porém eficientes, que entreguem bons resultados sem elevar os custos.
Linguagem e Framework
A linguagem escolhida foi Python, principalmente por sua forte aderência a bibliotecas de NLP e modelos de embeddings. Trata-se de uma linguagem madura e amplamente utilizada para esse tipo de aplicação.
Além disso, foi utilizado o FastAPI como framework web, responsável por fornecer uma API com endpoints que permitem ao usuário realizar buscas na base de dados de forma simples e eficiente.
Banco de Dados Vetorial
Para o banco de dados, a escolha foi o Qdrant, um banco vetorial sólido e amplamente utilizado em aplicações de RAG. Ele possui boa documentação, é estável e já está bem consolidado no mercado.
Estrutura e Fluxo de Dados
A partir dessas escolhas, o fluxo do sistema se torna simples e direto. Na pasta data existem três arquivos que são processados para gerar os embeddings, os quais são posteriormente persistidos no banco de dados vetorial. Cada embedding possui 384 dimensões.
Explicando o Fluxo do Processo
Pré-processamento e Split de Texto
Os documentos (por exemplo, textos sobre Ariano Suassuna, História do Brasil e Ayrton Senna) são carregados e processados.
Para facilitar a recuperação da informação sem perda de contexto, os textos são divididos em trechos menores, com até 80 palavras cada. Esse processo de divisão é realizado utilizando técnicas de NLP, garantindo que cada trecho mantenha sentido e coesão semântica.
Geração de Embeddings
Cada trecho de texto é transformado em um vetor numérico de 384 dimensões.
Esses vetores representam semanticamente o conteúdo dos textos, permitindo que as buscas sejam realizadas com base em similaridade semântica, e não apenas por palavras-chave.
O modelo de embeddings utilizado é pré-treinado e multilíngue, com suporte ao português, garantindo boa qualidade semântica para diferentes tipos de documentos.
Indexação no Banco Vetorial
Os embeddings gerados são enviados para o banco de dados vetorial (Qdrant).
Cada chunk de texto é armazenado juntamente com metadados, como o título do documento original. A indexação utiliza métricas de similaridade, como distância cosseno, possibilitando buscas rápidas e precisas.
Resumo
O pipeline implementado garante que:
Cada documento seja fragmentado de forma coerente.
Os embeddings capturem corretamente o significado semântico dos trechos.
A indexação eficiente permita uma recuperação rápida das informações.
As respostas geradas estejam sempre ancoradas na base de conhecimento indexada.
Tecnologias Utilizadas
Linguagem: Python / FastAPI
Banco de Dados: Qdrant
Modelo de Embeddings: paraphrase-multilingual-MiniLM-L12-v2
Modelo de Linguagem Natural (NLP): pt_core_news_sm