File size: 4,378 Bytes
971cb75
 
20f9e2e
971cb75
20f9e2e
971cb75
 
 
20f9e2e
 
971cb75
20f9e2e
971cb75
20f9e2e
971cb75
 
 
 
20f9e2e
971cb75
 
 
 
20f9e2e
 
 
 
 
 
 
971cb75
 
20f9e2e
971cb75
20f9e2e
971cb75
 
 
 
 
20f9e2e
 
 
971cb75
 
 
 
20f9e2e
971cb75
 
 
 
 
20f9e2e
 
971cb75
 
 
20f9e2e
971cb75
 
20f9e2e
971cb75
 
 
20f9e2e
971cb75
 
 
 
 
20f9e2e
 
 
 
971cb75
 
20f9e2e
971cb75
20f9e2e
971cb75
 
 
20f9e2e
971cb75
 
 
20f9e2e
971cb75
 
 
20f9e2e
971cb75
20f9e2e
971cb75
20f9e2e
971cb75
20f9e2e
971cb75
20f9e2e
971cb75
20f9e2e
971cb75
 
 
20f9e2e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 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 |