AetherMap / docs /ARCHITECTURE.md
Madras1's picture
Update docs/ARCHITECTURE.md
4cf6e30 verified
|
Raw History Blame Contribute Delete
4.38 kB
# Arquitetura do AetherMap
Este documento descreve o desenho técnico do AetherMap como sistema de cartografia semântica e RAG híbrido.
## Visão Geral
O AetherMap tem duas capacidades principais:
1. Cartografia semântica: transformar um corpus em um mapa 3D navegável, com clusters, métricas textuais, duplicados e entidades.
2. RAG híbrido: responder perguntas usando documentos recuperados por busca semântica e lexical, com reranking e citações.
O backend fica concentrado em [../app.py](../app.py). Ele expõe uma API FastAPI, mantém jobs em cache de memória e usa modelos locais para embeddings/reranking, além de APIs externas para geração e busca web.
## Fluxo de Ingestão
```text
Upload TXT/CSV
-> leitura inteligente do arquivo
-> seleção da coluna textual, quando CSV
-> lista de textos
-> embeddings SentenceTransformer
-> UMAP ou PCA para 3D
-> HDBSCAN para clusters
-> normalização dos embeddings
-> índice FAISS
-> índice BM25
-> métricas globais
-> análise de duplicados
-> análise TF-IDF por cluster
-> cache em memória por job_id
```
O endpoint responsável é `/process/`.
### Saídas principais de `/process/`
| Campo | Significado |
| --- | --- |
| `job_id` | Identificador do processamento salvo em cache |
| `metadata.num_documents_processed` | Total de documentos processados |
| `metadata.num_clusters_found` | Número de clusters HDBSCAN sem contar ruído |
| `metadata.num_noise_points` | Pontos classificados como ruído (`-1`) |
| `metrics.riqueza_lexical` | Tamanho do vocabulário filtrado |
| `metrics.top_tfidf_palavras` | Palavras mais relevantes por TF-IDF global |
| `metrics.entropia` | Entropia de Shannon das contagens de termos |
| `duplicates` | Duplicados exatos e pares semanticamente muito similares |
| `cluster_analysis` | Top termos por cluster |
| `plot_data` | Coordenadas 3D, cluster e texto para visualização |
## Fluxo de Busca RAG
```text
Query + job_id
-> validação do job em cache
-> expansão opcional da query via LLM
-> embedding da query
-> busca FAISS
-> busca BM25
-> fusão RRF quando híbrido
-> reranking CrossEncoder quando habilitado
-> top documentos como contexto
-> prompt de resposta com regras de citação e honestidade
-> resposta via OpenRouter
```
O endpoint responsável é `/search/`.
### Modos de Ablação
| Modo | Uso |
| --- | --- |
| `faiss_only` | Mede a força da recuperação semântica pura |
| `bm25_only` | Mede a força da busca lexical pura |
| `hybrid` | Mede o ganho da fusão FAISS + BM25 por RRF |
| `hybrid_rerank` | Mede o ganho do CrossEncoder sem expansão de query |
| `full` | Mede o pipeline completo |
Esses modos são valiosos porque permitem responder a uma pergunta de engenharia importante: cada componente está pagando seu custo de latência com ganho real de qualidade?
## Escolhas Técnicas
### FAISS + BM25
FAISS cobre similaridade semântica: bom para sinônimos, paráfrases e linguagem natural. BM25 cobre correspondência lexical: bom para nomes próprios, termos raros, códigos, siglas e consultas onde a palavra exata importa. A fusão por RRF reduz a dependência de uma única fonte de ranking.
### Reranker CrossEncoder
O reranker avalia pares `(query, documento)` diretamente. Isso custa mais que cosine similarity, mas tende a melhorar precisão nos top resultados, que são justamente os documentos que entram no prompt do LLM.
### UMAP/PCA + HDBSCAN
UMAP cria uma projeção 3D mais fiel para exploração visual, mas pode ser caro em datasets grandes. O `fast_mode` troca UMAP por PCA para reduzir o custo. HDBSCAN encontra clusters por densidade sem exigir um número fixo de grupos.
### Cache em Memória
O `cache` global guarda `df`, embeddings, índices FAISS/BM25 e dados auxiliares por `job_id`. Isso simplifica o MVP e acelera buscas depois do upload, mas não é persistente. Em produção, uma evolução natural seria persistir os artefatos em disco, Redis, Postgres/pgvector, Qdrant, Milvus ou outro banco vetorial.
## Dependências Externas
| Serviço | Onde entra |
| --- | --- |
| OpenRouter | Geração de resposta, expansão de query e descrição de clusters |
| Tavily | Busca web em `/search_web/` |
| Hugging Face / SentenceTransformers | Download/carregamento dos modelos locais |
| spaCy | NER PT/EN para grafo de entidades |