Weaviate: pesquisa híbrida e multi-location
O Weaviate é uma base vetorial open source para instalação em contêiner, que se destaca por três características: pode calcular os próprios vetores por meio de módulos (incluindo Ollama, portanto localmente), oferece busca híbrida que combina palavras-chave e busca vetorial com peso ajustável e isola os dados por tenant. Para um RAG estritamente local, três configurações importam: um vetorizador local, a telemetria desativada (ela está ativa por padrão) e o acesso anônimo desativado.
Weaviate é escolhido mais por suas funcionalidades do que por sua simplicidade: é um serviço de fato, com um contêiner, armazenamento e memória que precisam ser dimensionados. Este guia mostra o que ele oferece em comparação com ChromaDB ou pgvector, como conectá-lo ao Ollama para que tudo permaneça na sua máquina, como ajustar a pesquisa híbrida, para que serve a multilocação e qual é o custo em memória.
#O que diferencia Weaviate das demais bases vetoriais
Weaviate é um banco de dados vetorial open source, cujo código está publicado no GitHub. Diferentemente de bibliotecas como FAISS, trata-se de um servidor: ele armazena os objetos (texto e propriedades), os vetores e o índice de busca, e responde a requisições via API. Três funções o distinguem de um simples repositório de vetores. A primeira é a codificação integrada: você insere objetos, um módulo configurado transforma o texto em vetores e as consultas são escritas em linguagem natural, em vez de arrays de números de ponto flutuante. Essa escolha elimina uma classe de bugs (dimensões incompatíveis, pergunta codificada com um modelo diferente daquele usado para o corpus), pois o mesmo módulo trata os dois lados.
A segunda é a busca híbrida, que combina palavras-chave e vetores em uma única consulta. A terceira é a multilocação: uma mesma implantação pode hospedar vários conjuntos de dados isolados, um por cliente, serviço ou usuário. O custo dessas funcionalidades é ter um componente em execução, com sua memória, seus backups e suas atualizações, enquanto o ChromaDB em modo de arquivo é apenas uma biblioteca Python.
#Manter tudo localmente: três configurações para verificar
Seus documentos, sua IA: um RAG local confiável para seus PDFs, notas e e-mails — sem enviar nada para a nuvem.
- Espaço online vitalício
- PDF + arquivos
- Atualizações vitalícias
Um módulo de codificação é uma dependência executada em algum lugar. Escolher um vetorizador hospedado por terceiros equivale a enviar cada um dos seus documentos e cada uma das suas perguntas para outro lugar; escolher o módulo Ollama mantém o cálculo no seu hardware. Dois outros ajustes são menos visíveis e merecem a mesma atenção.
- O vetorizador
- Use o text2vec-ollama, que chama a sua instância local do Ollama; a documentação indica que ele não exige nenhuma chave de API nesse caso. Atenção ao endereço: se o Weaviate estiver rodando em um contêiner e o Ollama na máquina hospedeira, a documentação recomenda host.docker.internal para que o contêiner consiga acessar a máquina hospedeira.
- A telemetria
- A documentação do Weaviate indica que ele coleta dados de telemetria por padrão: versão do servidor, sistema operacional, módulos utilizados, número de objetos e de coleções, enviados a cada 24 horas; ela esclarece que nenhum conteúdo dos seus dados é coletado. Para desativar a telemetria, defina a variável DISABLE_TELEMETRY como true. Em uma instalação que deve permanecer totalmente isolada, configure essa variável.
- Acesso anônimo
- O comando docker run de início rápido define AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED como true, e a documentação desaconselha fortemente o acesso anônimo fora de ambientes de desenvolvimento ou avaliação. Assim que a porta 8080 estiver acessível a partir de qualquer dispositivo além do seu computador, ative a autenticação por chave de API.
#Instalar Weaviate com Docker e Ollama
- 01Ter Ollama e um modelo de embeddingsInstale Ollama e baixe o modelo com ollama pull bge-m3.
- 02Escrever o arquivo docker-compose.ymlEle declara o contêiner Weaviate, seu volume de dados, a ativação do módulo Ollama, a telemetria desativada e o acesso ao host.
- 03Iniciar e verificarExecute docker compose up -d e, em seguida, teste o endereço http://localhost:8080/v1/meta: a resposta lista os módulos ativos.
- 04Criar uma coleção vinculada ao móduloA coleção indica qual modelo do Ollama vetoriza quais propriedades.
O número de versão 1.39.7 é o da documentação oficial do Weaviate na data de redação; use a versão atual indicada na página de instalação. As portas 8080 (HTTP) e 50051 (gRPC) são as usadas no início rápido da documentação.
#Esquema: coleções, propriedades, vetorizador, tenants
| Conceito | O que é | Por que isso importa |
|---|---|---|
| Coleção | Um conjunto de objetos do mesmo tipo, com seu esquema | Corpus distintos permanecem distintos, o que mantém a recuperação precisa |
| Propriedades | Campos tipados em cada objeto | Filtros verificados (data, autor, serviço) em vez de instruções no prompt |
| Vetorizador | O módulo que codifica texto e perguntas | Mesmo modelo na indexação e na consulta |
| Tenant | Uma partição isolada da coleção, com seu próprio fragmento | Cada grupo vê apenas seus próprios dados |
| Índice vetorial | O grafo de busca (HNSW), residente na memória | Ele determina a velocidade e a memória necessária |
A estrutura segue a documentação oficial: vector_config, um vetorizador nomeado, propriedades de origem e um ponto de acesso ao Ollama. O Weaviate vetoriza por padrão as propriedades do tipo texto, ordenadas alfabeticamente e depois concatenadas; source_properties permite restringir o cálculo à propriedade útil e deixar o nome do arquivo fora do vetor.
#A pesquisa híbrida no Weaviate
A busca semântica localiza trechos com significado próximo, mas falha em cadeias exatas: um número de fatura, uma referência de peça, um código de erro ou um nome próprio. A busca híbrida do Weaviate combina os resultados de uma busca vetorial e de uma busca por palavras-chave BM25F, fundindo os dois conjuntos de resultados, com pesos e um método de fusão configuráveis. O parâmetro alpha regula o equilíbrio: de acordo com a documentação, 1 corresponde a uma busca vetorial pura e 0 a uma busca por palavras-chave pura. Sem alpha, o peso efetivo depende do seu cliente: defina-o sempre explicitamente.
Desde a versão 1.24, o método de fusão padrão é a fusão por pontuações relativas; a alternativa é a fusão por posições no ranking. O princípio e a escolha entre as duas são explicados no guia sobre busca híbrida. Em um corpus técnico, isso muitas vezes faz a diferença entre um sistema em que se confia e um sistema que se abandona: as falhas da busca puramente vetorial ocorrem justamente nas buscas que os usuários consideram triviais.
#Multitenancy: um tenant por grupo de usuários
A multitenência divide uma coleção em fragmentos, um por tenant. A documentação a descreve assim: cada tenant é armazenado em um fragmento separado, e os dados de um tenant não são visíveis para outro. Ela está desativada por padrão e é ativada na definição da coleção com multi_tenancy_config. Se vários grupos consultam o mesmo sistema (clientes de uma PME, departamentos de uma empresa, membros de uma família), isso oferece uma resposta estrutural à pergunta «essa pessoa pode recuperar esse documento?», muito mais segura do que um filtro aplicado posteriormente e infinitamente mais segura do que uma instrução no prompt.
Os tenants são leves: a documentação indica que é possível ter 50.000 fragmentos ativos ou mais por nó. Eles têm um estado (ACTIVE, INACTIVE, OFFLOADED): um tenant inativo está no disco e não ocupa memória, o que permite hospedar muitos pequenos conjuntos de dados, mantendo ativos apenas os que estão em uso. O nome de um tenant aceita apenas caracteres alfanuméricos, underline e hífen.
#Quanto custa rodar o Weaviate
Weaviate é um verdadeiro serviço: um contêiner, armazenamento persistente, memória proporcional aos seus vetores. A documentação de dimensionamento é clara sobre a restrição: o índice HNSW deve ser armazenado em memória, a memória determina o tamanho máximo do conjunto de dados e não influencia diretamente a velocidade das consultas. A regra empírica da documentação é prever o dobro da memória ocupada por todos os vetores.
As 1.024 dimensões do bge-m3 são, aqui, uma hipótese a ser verificada na ficha do seu modelo. Para um corpus pessoal ou de uma PME (algumas dezenas de milhares de passagens), o consumo de memória do índice é baixo; ele passa a ser uma preocupação a partir de vários milhões de passagens. O Weaviate oferece compressão de vetores: a documentação recomenda a quantização rotacional (RQ) e também menciona a quantização por produto (PQ), binária (BQ) e escalar (SQ), ao custo de uma pequena perda de informação. Adicione o módulo de codificação local: o Ollama executa um modelo de embeddings na mesma máquina que seu modelo de linguagem. Em uma única máquina, decida qual dos dois ocupa a placa de vídeo ou aceite que a indexação e a inferência interfiram uma na outra.
#Fornecer seus próprios vetores, ou migrar do ChromaDB
O módulo de codificação não é obrigatório. A documentação do Weaviate descreve a abordagem “bring your own vectors”: em vez de deixar a base calcular os embeddings, você fornece os que já possui, sejam eles personalizados ou pré-gerados. No cliente Python, você declara então um vetor nomeado com Configure.Vectors.self_provided. É a forma mais econômica de migrar do ChromaDB: você relê os documentos e os vetores já calculados (o Chroma pode retorná-los com a opção include) e depois os envia ao Weaviate, sem chamar novamente o modelo de embeddings. Duas verificações evitam surpresas desagradáveis: a dimensão dos vetores deve ser a mesma em toda a coleção, e as perguntas devem ser codificadas com o modelo original, pois o Weaviate não fará isso por você.
Quando é melhor usar a codificação integrada? Se você quer que as consultas sejam escritas diretamente em texto, que a adição de documentos não exija código para realizar os cálculos e que a consistência do modelo seja garantida pela configuração. Quando preferir seus próprios vetores? Se você já tem um pipeline de embeddings, se precisa usar um modelo que nenhum módulo oferece ou se quer poder mudar de base vetorial sem recalcular tudo.
#Weaviate ou outra base vetorial
| Situação | Escolha |
|---|---|
| Busca híbrida e filtros avançados, corpus técnico de médio a grande porte | Weaviate ou Qdrant |
| Vários grupos de usuários isolados em uma mesma implantação | Weaviate (suporte nativo a múltiplos locatários) |
| PostgreSQL já instalado, escala modesta | pgvector |
| Protótipo ou corpus pessoal, sem servidor a manter | ChromaDB em modo de arquivo |
| Processo único, corpus fixo, sem filtragem | Uma biblioteca como a FAISS |
Se você tiver dúvidas, comece com a solução mais simples: ChromaDB para um protótipo, depois migre para um serviço quando surgir uma necessidade específica (isolamento, busca híbrida nativa, volume de dados). A escolha é reversível desde que você mantenha os documentos de origem e o script de indexação.
#Perguntas frequentes sobre Weaviate
O Weaviate é gratuito?+
A Weaviate calcula os embeddings sozinha?+
Weaviate envia dados para fora?+
Como ajustar alpha na pesquisa híbrida?+
Quanta memória é necessária para um milhão de passagens?+
A multilocação é indispensável para uso pessoal?+
- Busca híbrida: BM25 + vetorial
- Qdrant: o banco vetorial de um RAG local
- pgvector: a busca vetorial no PostgreSQL
- FAISS: a biblioteca por trás da busca vetorial
- RAG local com ChromaDB e Ollama
- Fonte: Weaviate, pesquisa híbrida
- Fonte: Weaviate, módulo Ollama
- Fonte: Weaviate, telemetria
- Fonte: Weaviate, recursos e memória
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.