Arquitetura do RAG e Pipeline de Conhecimento
Sprint 4 – RAG Inteligente para os Serviços de Conhecimento
Objetivo da Sprint
Consolidar todo o fluxo de Recuperação Augmentada de Geração (RAG) em uma arquitetura única, rastreável e escalável. Reduzimos custo de ingestão e consulta com reuso de embeddings, cache e filtros semânticos automáticos, garantindo previsibilidade das fontes e da forma como os chunks são criados e versionados.
A arquitetura foi pensada para reuso máximo: uma única ingestão serve múltiplas consultas, evitando retrabalho de embeddings e mantendo rastreabilidade ponta a ponta.
Problema Identificado na Sprint Anterior
- Ingestão manual e sem padronização exigia reprocessar tudo a cada atualização.
- Consultas ao Qdrant não aplicavam filtros de ano/projeto, misturando contextos e reduzindo precisão.
- Falta de documentação de chunking, formatos aceitos e estrutura do banco vetorial dificultava evolução e troubleshooting.
Melhorias Implementadas
Cobertura de formatos e curadoria documental
extract_file_elementsautodetecta JSON estruturado, PDFs, DOCX, TXT e Markdown, usando a melhor estratégia por formato (backend/microservices/file_pipeline.py).- Lista explícita de extensões suportadas evita ingestão acidental (backend/microservices/file_pipeline.py).
- A pasta
documents/concentra a base oficial ingerida nesta sprint:- Edital-Processo-Seletivo-Inteli_-Graduacao-2026_AJUSTADO_V2.pdf
- FAQ-Processo-Seletivo-Inteli-Graduacao-2026.pdf
- Livro_Inteli_PDF_distribuicao.pdf
- script.md
Pipeline de ingestão end-to-end
embedding_pipelineencadeia extração → limpeza → chunking → embeddings → ingestão no Qdrant (backend/microservices/file_pipeline.py).embedding_pipeline_pathsreprocessa lotes e recria a coleção uma única vez, evitando downtime (backend/microservices/file_pipeline.py).
Limpeza e enriquecimento semântico
preprocess_elementsremove sumários, cabeçalhos/rodapés repetidos e bullets irregulares, enriquecendo metadados com seção e hierarquia (backend/microservices/file_pipeline.py).- O contexto corrente é mantido por linha, carregando
context_section,context_header, categoria inferida e sinalização de tabelas.
Chunking por seção e sobreposição controlada
create_smart_chunksagrupa por (fonte, seção, cabeçalho), preserva ordem, limita por tokens e aplica overlap proporcional (backend/microservices/file_pipeline.py).- Cada chunk recebe prefixos de contexto, prévia textual,
chunk_tokens,overlap_tokens, índice local, páginas cobertas e IDs determinísticos (safe_name_safe_section_idx_chunk).
Embeddings híbridos e ingestão Qdrant
generate_hybrid_embeddingscombina vetor denso (sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) e vetor esparso BM25 via fastembed (backend/microservices/file_pipeline.py).ingest_hybrid_embeddingscria/atualiza a coleção híbrida no Qdrant com vetor denso 384-dim e vetor esparso por ponto, armazenando payload completo do chunk (backend/microservices/file_pipeline.py).- IDs persistentes usam UUID v5 baseado no
chunk_id, garantindo idempotência na reexecução.
Como os embeddings híbridos são gerados
- Denso: o texto do chunk passa por
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2com normalização de vetor paracosinesimilarity. - Esparso: o mesmo texto é tokenizado e indexado com BM25 via fastembed, produzindo pesos lexicais que valorizam termos exatos, siglas e números.
- Combinação: cada ponto no Qdrant recebe os dois vetores; na busca, o motor soma as pontuações densa + esparsa, equilibrando recall semântico e precisão lexical.
- Idempotência e rastreio: o
chunk_iddeterminístico vira UUID v5, assegurando que reprocessamentos atualizem o mesmo ponto sem duplicar.
Por dentro do híbrido
O denso cobre sinônimos e paráfrases; o esparso ancora siglas, códigos e datas. Juntos, evitam tanto falso negativo semântico quanto falso positivo lexical.
Configuração centralizada e banco vetorial
RAGConfigreúne URL, API Key, coleção, modelo de embedding e hiperparâmetros (TOP_K, adjacência, score mínimo) lidos do.env(backend/agent_flow/config.py).- Coleção padrão de produção:
inteli-documents-embeddings; compatibilidade mantida cominteli_hybrid_finalpara ingestão.
Pipeline de inferência RAG
rag_inference_pipelineconverte pergunta em embedding, consulta Qdrant com filtros opcionais, expande nós adjacentes e formata o payload textual (backend/agent_flow/tools/knowledge_tools.py)._extract_metadata_filters_from_querydetecta Projeto X / Módulo X (mesmo projeto) e Xº ano, aplicando filtros antes da busca (backend/agent_flow/tools/knowledge_tools.py).retrieve_inteli_knowledgeexpõe a pipeline ao agente, guardando estatísticas noToolContexte retornando chunks prontos para uso (backend/agent_flow/tools/knowledge_tools.py).
Caching e métricas
- Resultados RAG cacheados por 5 min (até 200 entradas) e embeddings de consulta por 1 h (backend/agent_flow/utils/cache.py).
- Métricas Prometheus rastreiam volume de queries, chunks retornados, acertos/erros de cache e uso de LLM (backend/agent_flow/utils/metrics.py).
Pós-processamento antes do LLM
- O
ContextAgentaplicarank_context_chunks,filter_context_by_relevance,deduplicate_contextemanage_context_windowpara manter contexto compacto e anotado (backend/agent_flow/tools/context_tools.py). - Ranking híbrido, cortes por score e janelas de tokens respeitam
ContextConfig(backend/agent_flow/config.py).
Funcionamento da Pipeline
- Coleta e validação –
collect_input_fileslista arquivos aceitos em um diretório ou processa um arquivo isolado (backend/microservices/file_pipeline.py). - Extração – Cada formato passa por um extrator dedicado (PyPDFLoader/PyPDF2 para PDFs, parsing direto para TXT/MD/DOCX, leitura de JSON estruturado), já com metadados básicos (backend/microservices/file_pipeline.py).
- Limpeza e contexto – Normalização de texto, remoção de sumários e repetições, enriquecimento de metadados com seção, hierarquia e categoria inferida (backend/microservices/file_pipeline.py).
- Chunking – Agrupamento por seção, prefixos semânticos e divisão respeitando
chunk_sizeechunk_overlap, com overlaps pelas últimas linhas do chunk anterior (backend/microservices/file_pipeline.py). - Embeddings híbridos – Vetor denso (COSINE) + vetor esparso (BM25) para buscas semânticas e lexicais (backend/microservices/file_pipeline.py).
- Ingestão Qdrant – Pontos gravados em lotes de 64 com vetores, conteúdo e payload completo (backend/microservices/file_pipeline.py).
- Consulta –
retrieve_inteli_knowledgegera embedding da query, aplica filtros, expande adjacências e retorna chunks enriquecidos (backend/agent_flow/tools/knowledge_tools.py). - Formatação e cache –
build_graph_rag_payloadorganiza resultados em blocos textuais com cabeçalhos e IDs; resultado é cacheado (backend/agent_flow/tools/knowledge_tools.py). - Pós-processamento para LLM –
ContextAgentreranqueia, deduplica, resume e formata em listas numeradas, narrativa ou bullet points (backend/agent_flow/tools/context_tools.py).
Processo de Chunking em Detalhes
- Agrupamento por contexto: cada seção/cabeçalho vira grupo lógico, preservando páginas originais (backend/microservices/file_pipeline.py).
- Ajuste dinâmico de tamanho: se linhas forem curtas, o
chunk_sizelocal cai até 600 tokens para evitar blocos vazios (backend/microservices/file_pipeline.py). - Overlap semântico: linhas finais são reaproveitadas até o limite de tokens, mantendo continuidade (backend/microservices/file_pipeline.py).
- Metadados ricos: cada chunk traz preview, páginas,
chunk_tokens,total_section_chunkse hash para deduplicação (backend/microservices/file_pipeline.py).
Banco de Dados Vetorial
- Tecnologia: Qdrant (cloud/self-hosted) com collections híbridas (vetor denso + esparso) configuradas pela pipeline (backend/microservices/file_pipeline.py).
- Payload: inclui
chunk_id, texto completo, metadados, categoria e hierarquia para suportar filtros e heurísticas de busca (backend/microservices/file_pipeline.py). - Configuração: parâmetros de conexão e hiperparâmetros do RAG via
AppConfige.env(backend/agent_flow/config.py).
:::warning
Mantenha as credenciais do Qdrant e os limites de TOP_K/score_minimo sincronizados entre ambientes. Valores diferentes podem alterar relevância e métricas.
:::
Monitoramento e Governança
- Caches: TTL de 5 min para resultados RAG e 1 h para embeddings garante frescor e economia (backend/agent_flow/utils/cache.py).
- Telemetria: Prometheus contabiliza chamadas RAG, chunks retornados, hits/misses de cache e estatísticas de agentes (backend/agent_flow/utils/metrics.py).
- Ferramentas do ContextAgent: ranking, filtragem por score mínimo, deduplicação e janela de contexto asseguram qualidade antes do LLM (backend/agent_flow/tools/context_tools.py).
Conclusão
A sprint consolidou um pipeline RAG completo: ingestão padronizada para todos os formatos relevantes, chunking semântico com metadados ricos, embeddings híbridos persistidos no Qdrant e um fluxo de inferência que aplica filtros automáticos, caching e pós-processamento estruturado. A base de conhecimento torna-se rastreável, eficiente e pronta para evoluções (novos documentos, filtros ou modelos) sem retrabalho.
Por que embeddings híbridos?
Combinar vetor denso com BM25 entrega o melhor dos dois mundos: o embedding denso captura relações semânticas mesmo com vocabulário diferente, enquanto o vetor esparso preserva precisão lexical para termos exatos, siglas e números (ex.: “Projeto 7”, “2026”). O Qdrant soma as pontuações, aumentando recall em perguntas abertas sem perder aderência a filtros específicos e mantendo robustez em textos heterogêneos.