- Pergunta no Hacker News sobre como os usuários estão implementando Retrieval-Augmented Generation (RAG) em ambientes locais
- Há uma tendência forte de que, em RAG local, é perfeitamente viável operar mesmo sem banco de dados vetorial, usando busca textual como SQLite FTS5, BM25 e grep
- Para busca de código, muitos relatos dizem que embeddings são lentos e ruidosos, e há várias opiniões de que abordagens baseadas em palavras-chave, como BM25 + trigramas, funcionam melhor
- Mesmo quando a busca vetorial é necessária, seguem aparecendo casos resolvidos com configurações leves, como Postgres + pgvector, armazenamento de vetores como BLOB no SQLite e carregamento do FAISS em memória
- É possível melhorar a qualidade da busca com combinações como busca híbrida unindo BM25 + vetores, RRF (Reciprocal Rank Fusion), reranking e expansão multiquery
- Em vez de fixar a ideia de “RAG = banco de dados vetorial”, aparece a tendência de escolher entre busca simples → híbrida → estilo agente conforme o tipo de documento, a escala e a carga operacional
Conclusões comuns na etapa de busca
- Em vez de partir da premissa de que banco de dados vetorial ou grafo é obrigatório, muitos preferem começar de forma simples, de acordo com a infraestrutura existente, os tipos de arquivo e o desempenho exigido
- Há menções de que a abordagem em que o agente consulta diretamente o sistema de arquivos ou APIs é mais fácil de configurar e manter, embora possa ser um pouco mais lenta
- A percepção de que “o que o RAG entrega ao LLM são apenas pequenos trechos de texto dos resultados de busca” leva o foco de otimização para a qualidade da busca
- Sobre a “definição de RAG”, coexistem tanto a reação de que retrieval + generation já é RAG, mesmo sem banco vetorial, quanto a de que o termo normalmente pressupõe um banco vetorial
Modelos de embedding e busca vetorial
- O modelo de embedding mdbr-leaf-ir, desenvolvido pela MongoDB, roda apenas em CPU e ficou em 1º lugar em vários leaderboards dentro do seu porte
- Em um servidor padrão de 2 vCPU, consegue processar cerca de 22 documentos por segundo e 120 consultas por segundo
- Registrou 53,55 pontos no benchmark BEIR (o all-MiniLM-L12-v2 ficou com 42,69)
- Embeddings estáticos de palavras como model2vec/minish têm inferência mais rápida, mas menor precisão de busca
- Como fazem apenas tokenização + tabela de lookup + média, são mais rápidos que abordagens baseadas em transformers
- Também é usado um método em que vetores são gerados por chunk de texto com Meta-Llama-3-8B, armazenados em uma coluna BLOB do SQLite e pesquisados com FAISS
- Para 5 milhões de chunks, o uso de memória fica em cerca de 40 GB
- No A6000, o faiss-gpu é muito rápido; no M1 Ultra, o faiss-cpu é lento, mas ainda suficiente para algumas consultas por dia
Recomendações para busca de código
- Recomenda-se evitar banco de dados vetorial para código e usar a combinação BM25 + trigramas
- Embeddings são lentos e não se adaptam bem a código
- Sem reranker, o ruído aumenta, e o custo de reindexar arquivos é alto
- A resposta de busca é rápida e a qualidade dos resultados também é boa
- No PostgreSQL, é possível implementar busca BM25 com plpgsql_bm25
- Há suporte a busca híbrida combinada com pgvector + Reciprocal Rank Fusion
- Aplicar embeddings a caminhos de arquivo + assinaturas e depois fundir com BM25 também pode gerar bons resultados
- A abordagem agentic que executa gpt-oss 20B com ripgrep em um loop
while também se mostra eficaz
Soluções baseadas em banco de dados
- SQLite FTS5: adequado para documentos baseados em arquivos Markdown, permitindo implementar RAG mesmo sem banco vetorial
- Cada arquivo pode ter um campo curto de descrição para navegação de documentos por busca de palavras-chave
- Também é possível projetar uma arquitetura em que vetores fp16 são armazenados como BLOB no SQLite, um filtro cria um subconjunto e o cálculo de similaridade é feito em memória
- Outras opções incluem sqlite-vec, sqlite-vector, vec0 e o bm25 do SQLite
- “O SQLite funciona surpreendentemente bem”
- PostgreSQL + pgvector: permite aproveitar conhecimento prévio de Postgres e facilita a transição para a equipe de operações
- Também existe a biblioteca llmemory, que oferece BM25 híbrido, expansão multiquery e reranking
- LanceDB: pode ser usado de forma conveniente como banco vetorial embarcado
- Utilizado junto com o embedding nomic-embed-text do Ollama
- DuckDB: oferece extensão para busca por similaridade vetorial e é adequado para projetos pequenos abaixo de 3 GB
- Meilisearch, Typesense, Manticore: operação mais simples que Elasticsearch/OpenSearch
Busca híbrida e agentic
- nori (usenori.ai): combina busca semântica e por palavras com SQLite + vec0 + fts5
- Turbopuffer: oferece busca híbrida de vetor + BM25
- Mesmo só com a combinação de busca agentic e busca textual já é possível obter resultados muito bons
- Ao adicionar busca vetorial e graph RAG, é possível conseguir pequenas melhorias em velocidade e qualidade
- Claude Code/Codex usam internamente ripgrep
- Aplicar embeddings em caminhos de arquivo também é eficaz; com fusão via BM25, melhora ainda mais
Casos de uso com BM25
- shebe: ferramenta CLI/MCP para indexação e busca em codebases baseada em BM25
- Especialmente útil em fluxos de refatoração (ex.: listar os pontos que precisam mudar em um upgrade do Istio)
- Em 85% dos casos, basta correspondência por tags, sem banco vetorial
- Operadores adicionaram tags tanto às entradas quanto à documentação, alcançando 100% de correspondência
- Há a opinião de que a maioria dos bancos vetoriais é um “martelo tentando resolver o problema de não conseguir encontrar algo”
Ferramentas e bibliotecas específicas
- qmd: ferramenta CLI para busca em arquivos Markdown, com resultados de consulta fuzzy melhores que o fzf
- ck: ferramenta de grep semântico baseada em Rust
- Kiln: permite adicionar arquivos por drag and drop e comparar várias configurações
- Suporta comparação de métodos de extração, modelos de embedding e formas de busca (BM25, híbrida, vetorial)
- Inclui avaliação de precisão de busca e geração automática de dataset de avaliação
- libragen: CLI/servidor MCP para criar bibliotecas de conteúdo RAG versionadas
- Pode transformar repositórios GitHub em bancos RAG
- piragi: biblioteca Python simples para RAG, com suporte a várias fontes como local/S3/API
- ragtune: ferramenta CLI para depuração e benchmark de busca em RAG local
Processamento de documentos e OCR
- discovery: faz OCR de documentos com Qwen-3-VL-8B e armazena vetores no ChromaDB
- Implementa RAG híbrido com BM25 + embeddings
- docling: ferramenta de extração de documentos usada em vários projetos de RAG
- Na conversão de PDF, é difícil lidar com tabelas, múltiplas colunas e tabelas que atravessam páginas
- O modelo Mistral OCR entrega os melhores resultados (modelo fechado)
Gestão de memória e contexto
- O que o RAG passa ao LLM são apenas strings curtas de resultados de busca
- Em modelos pequenos, TOP_K=5 costuma ser o limite; acima disso começa o esquecimento de contexto
- É possível melhorar com uma abordagem de resumo prévio de arquivos e pastas
- Também há quem use Sonnet + janela de contexto de 1M para colocar tudo diretamente no contexto
- Há casos de construção de sistema de memória para Claude Code com busca semântica em arquivos de sessão
Uso corporativo e em larga escala
- Ao processar 300 mil interações com clientes por dia, latência e precisão são críticas
- É usada uma abordagem híbrida com embeddings + busca full-text + IVF-HNSW
- Um desafio é gerenciar a propagação de informação entre cerca de 600 sistemas distribuídos
- Está em experimentação uma abordagem KAG (Knowledge Augmented Generation) para mapear regras de negócio
- Houve sucesso na implementação de RAG totalmente local com banco vetorial em Postgres para mais de 500 mil artigos de notícias
Outras ferramentas e abordagens
- AnythingLLM: inclui bundle de banco vetorial para documentos
- LibreChat: também inclui bundle de banco vetorial para documentos
- ChromaDB: usado em extensão do Obsidian para busca semântica/híbrida
- SurrealDB: usado em conjunto com vetorização local
- Interface de consulta OData: é eficaz quando fornecida ao LLM como ferramenta, permitindo analisar planilhas Excel com 40 mil linhas
- Nextcloud MCP Server: usa Qdrant como banco vetorial para oferecer busca semântica em documentos pessoais
- LSP (Language Server Protocol): foi adicionado ao Claude Code, mas atualmente há bugs
- TreeSitter pode ser mais útil (consulta por nome de símbolo, navegação para definição/uso)
3 comentários
Tenho dúvidas se o coreano está funcionando bem.
Vendo o desempenho de um sistema interno de RAG bem tosco, posts como este acabam mudando um pouco a minha perspectiva.
Comentários do Hacker News
Nossa equipe mantém um banco de dados de perguntas e respostas
As perguntas e respostas são indexadas tanto com índice trigram quanto com embeddings e armazenadas no Postgres
Na busca, usamos
pgvectorjunto com busca por trigram e combinamos os resultados com uma pontuação de relevânciaNa etapa de busca, desenvolvemos um modelo de embedding de texto altamente eficiente e amigável à CPU
É o modelo MongoDB/mdbr-leaf-ir, que ocupa o 1º lugar no leaderboard entre modelos do mesmo porte
É compatível com o modelo Snowflake/snowflake-arctic-embed-m-v1.5
Pelo demo do search-sensei, dá para comparar busca semântica vs BM25 vs híbrida
Por exemplo, o modelo de embedding reconhece que “j lo” significa “Jennifer Lopez”
Também publicamos a receita de treinamento, e dá para treinar facilmente até com hardware mediano
Desde abril de 2024, venho gerando vetores com Meta-Llama-3-8B
Usei Python e Transformers em uma RTX-A6000; era rápido, mas o ruído e o calor eram intensos
Depois migrei para um M1 Ultra e passei a usar a biblioteca MLX da Apple; a velocidade é parecida, mas é muito mais silencioso
Os modelos Llama têm 4k dimensões, então isso dá 8KB por chunk em fp16, e eu salvo isso com
numpy.save()em uma coluna BLOB do SQLiteNa busca, carrego todos os vetores do SQLite, transformo em
numpy.arraye depois pesquiso com FAISSO faiss-gpu da RTX6000 é muito rápido, e o faiss-cpu do M1 Ultra também é rápido o bastante para meu uso (algumas consultas por dia)
Com 5 milhões de chunks, o uso de memória fica em cerca de 40GB, algo que ambas as máquinas conseguem lidar com folga
A maioria dos documentos complexos é formada por arquivos Markdown
Recomendo uma ferramenta CLI simples chamada tobi/qmd
Antes eu usava um workflow baseado em fzf, mas essa ferramenta oferece busca fuzzy melhor
Não uso isso para busca em código
Recomendo não usar banco de dados vetorial para busca em código
Embeddings são lentos e não se encaixam bem em código
A combinação BM25 + trigram dá resultados melhores e responde mais rápido
Você pode olhar o projeto plpgsql_bm25
Ele inclui exemplos e notebooks Jupyter combinando BM25 e pgvector com Reciprocal Rank Fusion
Se você usar modelos que não são para código, a busca vetorial gera muito ruído
Hoje, rodar
gpt-oss 20Bem loop junto com ripgrep é muito mais rápido e precisoQuando combinado com BM25 em uma fusão (fusion), melhora ainda mais
Para experimentar RAG localmente, criei local-LLM-with-RAG
Gero embeddings com o “nomic-embed-text” do Ollama e uso LanceDB como banco de dados vetorial
Recentemente atualizei para “agentic RAG”, mas isso talvez seja exagero para projetos pequenos
Armazeno vetores fp16 como BLOB no SQLite, aplico filtros e carrego na memória para calcular similaridade com produto matriz-vetor (matvec)
Se numpy ou torch aproveitarem multithreading/BLAS/GPU, isso fica muito rápido
Se aparecer gargalo, pretendo migrar para sqlite-vector
Como os dados diminuem bastante com filtros como data ou localização, isso é eficiente
O backend fica escondido atrás de uma interface substituível
Como 95% dos meus documentos são arquivos Markdown pequenos, uso SQLite FTS5 como índice de busca de texto puro
Eu já tinha esse índice, então liguei direto a um agente mastra
Cada arquivo tem um campo curto de descrição; depois da busca por palavra-chave, se a descrição bater, eu carrego o documento inteiro
Levei cerca de uma hora para configurar, e funciona muito bem
Busca baseada em embeddings é mais comum, mas a essência é a mesma
Já tínhamos familiaridade com Postgres, então começamos com PGVector
Mais tarde descobrimos que o conteúdo correspondia 100% aos campos semiestruturados do prompt
Isso aconteceu porque os operadores começaram a colocar tags tanto na entrada quanto nos documentos (cerca de 50 documentos)
Então primeiro buscamos pelos campos, colocamos esse arquivo no prompt e só depois fazemos busca por embeddings
No fim, em 85% dos casos não precisamos de vectordb
Eu criei o llmemory e o uso tanto localmente quanto em apps da empresa
Ele é baseado em PostgreSQL + pgvector e inclui BM25 híbrido, expansão de múltiplas consultas e reranking
Estou divulgando isso publicamente pela primeira vez, então pode haver alguns bugs
Estou bem satisfeito com o desempenho