Remove a cópia zipada/extraída redundante do premiere-pro-mcp em bm/, os scripts e schema do RAG de outro sistema (Tigre) que foram parar aqui por engano, os backups manuais .prev do cep-plugin já superados pelo git, um arquivo solto ":memory:.ses" e pastas vazias sem uso em code/engine (domain, skills, dominio/objetos_de_valor, scanner/modelos, scanner/contratos, integracoes/premiere/contratos). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
RAG deste projeto
Esta pasta é o padrão Genial Sistemas para dar a qualquer sistema (CRM, Doza, contabilidade, o que vier depois) um banco de RAG próprio — usado só para a IA indexar código/documentação e responder consultas gastando menos tokens, sem precisar reler o repositório inteiro a cada tarefa.
Não é o banco de dados do sistema. É infraestrutura de apoio ao desenvolvimento, mantida à parte da aplicação em si.
Como funciona a infra
Existe um único container Postgres + pgvector compartilhado, rodando na
VPS da equipe (rag-hub-db, em /docker/rag-hub/). Cada sistema recebe o
seu próprio banco de dados dentro desse container — não um container
Docker novo por projeto. Isso é intencional: mais barato de manter (1
backup, 1 upgrade, 1 lugar pra olhar) do que uma stack isolada por sistema.
rag-hub-db (container único na VPS)
├── rag_doza ← banco deste projeto
├── rag_crm ← banco do CRM (quando existir)
├── rag_contabilidade ← banco da contabilidade (quando existir)
└── ... ← um banco por sistema novo
Arquivos desta pasta
README.md— este arquivo.SETUP.md— passo a passo para provisionar o banco deste projeto na primeira vez (ou reprovisionar do zero).schema.sql/schema-tigre.sql— schema de cada sistema (extensões, tabelas, índices). São o estado FINAL desejado: num banco novo basta rodá-los. Num banco que já existe, use as migrations.migrations/— mudanças de schema numeradas e idempotentes, aplicadas commigrate_tigre.sh(precisa derag_admin; o usuário de indexação não tem DDL). Cada arquivo abre com o motivo da mudança e o que fazer depois.index_code.py— indexador.swift_chunker.pyfaz o corte de arquivos Swift por declaração.search.py— busca.bench.pymede recall e custo.reindex_hook.sh— hook de reindexação do arquivo recém-editado..env.example— variáveis de ambiente que o código deste projeto precisa para se conectar ao banco (sem valores reais — apenas o formato).
Como a busca funciona
Três listas em paralelo, fundidas com RRF ponderado:
- densa — embedding do trecho de código;
- lexical —
pg_trgmsobre os símbolos declarados, para consultas que citam o nome exato de um tipo; - resumo — embedding só do doc-comment do arquivo, sem código para diluir, que resgata arquivos pequenos e precisos.
Cada trecho guarda start_line/end_line, então o resultado aponta a janela
exata (arquivo.swift:120-180) em vez de mandar ler o arquivo inteiro.
Os números que justificam esse desenho estão em bench.py (18 consultas
douradas) e nos cabeçalhos das migrations. Antes: recall@5 de 33%. Depois:
94%, com 67% menos bytes por consulta. Ao mexer nos parâmetros de fusão ou
no cortador, rode bench.sh antes e depois.
Modos de saída
| Comando | O que traz |
|---|---|
search_tigre.sh "consulta" |
caminho, faixa de linhas e uma linha de descrição (padrão) |
… --snippet |
+ 300 chars do trecho |
… --full |
+ o trecho inteiro |
… --json |
saída estruturada |
… --module X / --path Y / --ext .swift |
restringe o escopo |
… --map [termo] |
inventário de arquivos, sem nenhum código |
Os dois bancos, lado a lado
O mesmo search.py/index_code.py atende rag_tigre (Swift) e rag_doza
(Python legado) — só muda o wrapper (_tigre.sh / _doza.sh) e o .env
carregado. index_code.py escolhe o cortador pela extensão:
swift_chunker.py para .swift, python_chunker.py para .py, janela de
linhas para o resto (.md, .sql, .sh).
O legado tem uma diferença estrutural real: não segue "uma classe por
arquivo" (ai_analysis.py e app.py passam de 5000 linhas, com dezenas de
funções soltas), então o python_chunker desce um nível dentro de blocos
grandes demais em vez de aceitar o arquivo inteiro como um só trecho.
Números do legado em rag/bench_doza.sh: recall@5 de 72% (18 consultas).
Mais baixo que os 94% do Tigre — a causa identificada não é bug do
pipeline, é o modelo de embedding (nomic-embed-text, majoritariamente
inglês) perdendo para conteúdo em português que soa tematicamente próximo:
"transcrever o áudio para texto" caiu atrás de markdown em português sobre
edição de voz, na frente do próprio transcribe.py (docstring em inglês).
Um modelo multilíngue deve fechar essa lacuna — ver README no que muda ao
trocar de modelo antes de decidir.
Onde ficam as credenciais reais
Nunca neste diretório (ele é comitado no git). Credenciais reais —
host da VPS, senha do Postgres, chave SSH — ficam em admin/VPS-ACCESS.md
na raiz do projeto (nunca comitado, chmod 600).
Convenção para um sistema novo
Ao começar um sistema novo (ou adicionar RAG a um já existente):
- Copiar esta pasta
rag/inteira para a raiz do novo projeto. - Trocar todas as referências de
doza/rag_dozapelo nome do novo sistema (ex:crm→ bancorag_crm). - Seguir
SETUP.mdpara criar o banco na VPS (usa a mesmarag-hub-db, não sobe container novo). - Preencher
admin/VPS-ACCESS.mddo novo projeto com as credenciais reais (copiando o padrão de acesso SSH/túnel já documentado nos projetos existentes).