Eu me frustrei com resultados medianos de RAG no início (GPT-3.5, libs Python, vetores “mágicos”). Resolvi atacar UX, performance e previsibilidade: escrevi um banco vetorial em Rust, medi tudo (benchmarks públicos), padronizei o pipeline (BM25 + HNSW + SQ-8 + chunks 200–500 tokens) e empacotei com APIs REST/MCP/UMICP. Resultado: busca precisa, latência estável e setup zero dependências externas. Hoje o Vectorizer já conversa com o Transmutation (converter PDF/DOCX/XLSX/HTML/áudio/vídeo → Markdown), e está pronto para virar a “espinha” de RAG, MoE e treino incremental.

Antes de tudo: contexto

Programo há 20+ anos. No boom de IA, meu “starter pack” foi GPT-3.5, um pouco de TensorFlow, modelos de STT e análise semântica. Funcionava… mas não era confiável.
O jogo virou com o Cursor somado a Claude-3.7/4, Grok-Code-Fast-1, Opus e GPT-5 — passei a entregar ordens de grandeza mais rápido. No fim de 2024, integrei LangChain ao meu framework e comecei a usar Qdrant, Pinecone, Neo4j e pgvector. Sem um “reasoning” consistente e com UX frágil, os resultados foram ruins.

Quando mergulhei nos MCPs, ficou óbvio: a dor era UX + previsibilidade. E performance.

Por que Rust e não “o combo Python + GPU”?

  • Queria previsibilidade de latência, controle fino de memória e binários enxutos.

  • O ecossistema Python é ótimo para pesquisa, mas para produção (especialmente em edge/on-prem) eu queria outra curva de custo/manutenção.

  • Em Rust, mesmo sem saber Rust no início, consegui “brigar” de igual pra igual com soluções prontas — e medir tudo, sem “magia”.

O que eu testei (e por que mudei de rota)

Avaliei diversos embeddings e medidas de similaridade: TF-IDF, BM25, BERT, SVD, MiniLM, Bag-of-Words, Char n-gram, ONNXs como:

  • sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2

  • intfloat/multilingual-e5-small, intfloat/multilingual-e5-base

  • sentence-transformers/paraphrase-multilingual-mpnet-base-v2

  • Alibaba-NLP/gte-multilingual-base

  • sentence-transformers/distiluse-base-multilingual-cased-v2, LaBSE

Conclusão prática: a melhora real desses embeddings (no meu cenário) não justificava a complexidade operacional. Voltei ao BM25 (implementação nativa em Rust), normalizei o pipeline e foquei no índice.

Benchmarks públicos (com reprodutibilidade)

A fórmula que funcionou

HNSW + BM25 (512D) + Quantização SQ-8 + Chunks 200–500 tokens

  • HNSW como índice principal (rápido e consistente).

  • BM25 512D (representação “clássica”, simples e previsível).

  • SQ-8 para cortar memória mantendo qualidade.

  • Chunking disciplinado (200–500 tokens) para melhorar recall/precisão sem verborragia.

Essa combinação, empacotada como MCP, deu acerto cirúrgico nas buscas dentro do Cursor — inclusive com modelos locais (LM Studio, GPT-OSS-20B) me retornando os trechos corretos de projetos vetorizados.

UX > tudo: por que senti diferença na prática

  • Auto-mapeamento de dados locais de projetos de software.

  • Collections segmentadas (e fácil migrar para multi-index por collection >10k vetores).

  • Setup zero dependência externa (sem “traga seu modelo x, y, z”).

  • REST, MCP e UMICP já prontos, com um dashboard simples pra testar.

O Vectorizer não é “só um índice”: é runtime de contexto que orquestra ingestão, chunking, index e consulta de forma opinionada.

Transmutation: o “irmão” que faltava

Em 13/10 adicionei o Transmutation (feito literalmente em 1 dia com ajuda do Cursor + Vectorizer):

  • Converte PDF, DOCX, XLSX, HTML (e mais) para Markdown consistente.

  • OCR (Tesseract) + STT (Whisper) para áudio/vídeo → Markdown.

  • Integração direta com o Vectorizer (ingestão → chunking → index).

Repo: https://github.com/hivellm/transmutation

Próximos passos:

  • Embeddings de imagem (coleções “vision” para LLMs multimodais).

  • CUDA/Metal/Vulkan nativos para o índice (GPU).

  • Projeto em Rust para manipular VRAM + shaders (core GPU-native).

Onde chega: RAG, MoE e treino incremental

  • RAG confiável (contexto “mínimo suficiente” com latência previsível).

  • MoE: collections como especialistas (roteamento por domínio).

  • Treino incremental: usar o Vectorizer como memória persistente de fatos/snippets.

  • Persistência de contexto quase “infinita” — minhas contas indicam ~11 bilhões de tokens numa máquina comum com 32GB RAM, sem GPU e sem API.

Quer testar?

Repo do Vectorizer: https://github.com/hivellm/vectorizer

  • Setup simples, binário Rust.

  • APIs REST, MCP e UMICP embutidos.

  • Dashboard provisório para explorar collections e consultas.

  • Benchmarks públicos e reprodutíveis.

O projeto está pré-alpha (inevitáveis bugs), mas já uso diariamente e os resultados têm sido excelentes.

Conclusão

Em poucos dias, com Rust + disciplina de benchmark + foco em UX, saí de RAG inconsistente para um motor vetorial que me atende agora — e que já está puxando Transmutation, GPU nativa e vision embeddings.
Se RAG/MoE é parte do seu stack e você quer previsibilidade e custo sob controle, experimenta o Vectorizer. Pior cenário: você mede e descobre exatamente onde dói. Melhor cenário: você para de sofrer com o “hype pipeline” e volta a entregar.