RAG com ChromaDB e Mistral
Para um RAG local com Mistral, a pilha mais simples é Ollama (geração e embeddings com bge-m3) mais ChromaDB em modo arquivo, sem servidor nem PyTorch. Quanto ao modelo, ministral-3:8b (6,0 GB, licença Apache 2.0, contexto anunciado de 256K) é uma boa opção padrão para uma placa de 8 a 12 GB, ministral-3:14b para 16 GB e mistral-small3.2:24b (15 GB) para capacidades superiores. O ajuste que você não deve esquecer: aumentar a janela de contexto do Ollama para que os trechos caibam no prompt.
Este guia constrói um assistente documental completo, em dois scripts Python, com um modelo Mistral executado na sua máquina: seus PDFs e arquivos de texto são divididos, indexados no ChromaDB, e os trechos encontrados são passados para o modelo, que responde citando suas fontes. Ele também especifica qual modelo Mistral escolher de acordo com a sua memória gráfica e as armadilhas que fazem um RAG responder fora do assunto.
#O que construímos: um RAG Mistral totalmente local
O RAG (geração aprimorada por recuperação) consiste em localizar os trechos dos seus documentos relacionados à pergunta e colá-los no prompt do modelo para que ele responda com base nesses trechos. O resultado esperado aqui é um pequeno utilitário de linha de comando: um script indexa uma pasta de documentos; um segundo lê uma pergunta, encontra os cinco trechos mais próximos no ChromaDB, os envia a um modelo Mistral via Ollama juntamente com a pergunta e exibe a resposta seguida dos arquivos consultados. Nada sai da máquina: Ollama fornece o modelo de geração e o modelo de embeddings, o ChromaDB armazena os vetores em uma pasta local.
O termo “Mistral” é usado em dois sentidos: os modelos de pesos abertos da Mistral AI, que você baixa e executa por conta própria (objeto deste guia), e as APIs hospedadas pela empresa, que enviam seus trechos para os servidores dela. Para documentos confidenciais, apenas o primeiro atende à exigência “100% local”.
#Qual modelo Mistral escolher para o RAG
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 RAG tem necessidades específicas: o modelo deve seguir uma instrução rigorosa (« responda apenas com base nos trechos »), ler vários trechos sem se perder e responder em francês. O tamanho importa menos do que na conversa livre; no entanto, a memória disponível para o contexto é mais importante. Os tamanhos abaixo são os exibidos pela biblioteca Ollama, com a quantização padrão.
| Modelo | Tamanho do Ollama | Contexto anunciado | Para quem |
|---|---|---|---|
| ministral-3:3b | 3,0 GB | 256K | Máquina sem GPU dedicada; respostas simples, baixa tolerância a instruções complexas |
| ministral-3:8b | 6,0 GB | 256K | Opção padrão razoável para uma placa de 8 a 12 GB ou um notebook com 16 GB de memória |
| ministral-3:14b | 9,1 GB | 256K | Placa de 16 GB, ou 12 GB com contexto moderado |
| mistral-nemo (12B) | ver a página Ollama | 128K | Alternativa mais antiga, ainda amplamente utilizada |
| mistral-small3.2:24b | 15 GB | 128K | Placa de 24 GB ou memória unificada de 32 GB ou mais; o mais confiável no cumprimento das instruções de formato |
| mistral (7B, versão 0.3) | 4,4 GB | 32K | Modelo antigo: reservar para máquinas muito limitadas |
A família Ministral 3 (3B, 8B e 14B) é publicada sob licença Apache 2.0, conforme indicado no anúncio do Mistral 3, e a página do Ollama a descreve como projetada para implantação na borda, capaz de rodar em uma ampla gama de equipamentos. Mistral Small 4, lançado em 2026 com 119 bilhões de parâmetros no total segundo o nome de sua ficha no Hugging Face, é voltado para hardware de servidor: não é um candidato para uma máquina pessoal. Para ter uma ideia da ordem de grandeza da memória necessária, a calculadora de VRAM do site fornece o tamanho do modelo mais o cache de contexto.
#Stack técnica
- Geração
- Um modelo Mistral servido por Ollama, via API HTTP local na porta 11434.
- Embeddings
- bge-m3 disponibilizado pelo Ollama: a página da biblioteca o descreve como um modelo da BAAI versátil, multilíngue e com múltiplas granularidades, de 567 milhões de parâmetros. Ele dispensa a instalação de PyTorch e sentence-transformers.
- Base vetorial
- ChromaDB em modo local (PersistentClient): uma pasta, nenhum servidor. O Chroma fornece um wrapper, OllamaEmbeddingFunction, que chama a API de embeddings do Ollama.
- Leitura de arquivos
- pypdf para PDFs que contêm texto, leitura direta para Markdown e texto simples. Um PDF escaneado é uma imagem: primeiro é necessário fazer o reconhecimento de caracteres.
#Preparar o ambiente
- 01Instalar Ollama e baixar os modelosInstale o Ollama, depois baixe o modelo de geração e o modelo de embeddings com os dois comandos abaixo.
- 02Criar o ambiente PythonPython 3.10 ou superior. Um ambiente virtual mantém as dependências do projeto separadas.
- 03Colocar os documentosCopie seus arquivos PDF, Markdown e texto para uma pasta docs/ ao lado dos scripts.
#2. Indexar os documentos no ChromaDB
O script lê cada arquivo, divide o texto em trechos de aproximadamente 1.800 caracteres, cortando entre parágrafos, e depois entrega esses trechos ao Chroma, que chama o bge-m3 via Ollama para calcular os vetores. Dois pontos são importantes: cada trecho mantém o nome do arquivo como metadado (para citar a fonte) e as adições são feitas em lotes, em vez de um trecho por vez.
O uso de upsert com identificadores construídos a partir do nome do arquivo e do número do trecho permite executar o script novamente: reindexar a mesma pasta atualiza os trechos em vez de duplicá-los. Atenção, porém: se um documento ficar mais curto, os trechos antigos excedentes permanecem na base; para uma alteração importante, exclua a pasta chroma_db e reindexe. A escolha do tamanho dos trechos é detalhada no guia sobre estratégias de chunking.
#3. Consultar: busca e depois geração
O segundo script incorpora a pergunta, recupera os cinco trechos mais próximos e compõe o prompt. A instrução é decisiva: ela pede que o modelo responda apenas com base nos trechos, admita quando faltar informação e cite o arquivo. O parâmetro num_ctx aumenta a janela de contexto: a documentação do Ollama indica que a janela padrão é de 4.096 tokens e que a variável OLLAMA_CONTEXT_LENGTH ou o parâmetro num_ctx a modificam. Com cinco trechos de 400 a 500 tokens, a instrução e a resposta, 4.096 tokens ficam no limite: um contexto muito curto é cortado silenciosamente, e o modelo responde sem ter lido o final dos seus trechos.
#Verificar o que o ChromaDB retorna antes de culpar o modelo
Quando uma resposta é ruim, a causa está em um de dois pontos: a busca não trouxe o trecho correto ou o modelo o usou mal. É possível distinguir os dois casos exibindo os trechos recuperados com suas respectivas distâncias, sem chamar o modelo. Se o trecho correto não estiver entre os cinco primeiros, mude a divisão do texto em trechos, adicione uma busca por palavras-chave ou um reranker. Se ele estiver presente e a resposta continuar errada, o problema está no prompt, no contexto truncado ou no modelo: experimente o modelo de tamanho superior antes de concluir.
#Orçamento de memória: o que deve caber ao mesmo tempo
O RAG faz dois modelos coexistirem, o que gera e o que calcula os vetores, além do cache de contexto do primeiro. O Ollama carrega cada modelo sob demanda e pode descarregar um para liberar espaço para o outro, o que acrescenta um atraso a cada troca se houver pouca memória disponível. A tabela apresenta uma ordem de grandeza para três configurações; o tamanho do modelo vem da biblioteca do Ollama, e o restante é um cálculo a refinar com a calculadora de VRAM do site.
| Configuração | Peso do modelo de geração | A adicionar | Placa-alvo |
|---|---|---|---|
| ministral-3:8b + bge-m3 | 6,0 GB | Cache de contexto, modelo de embeddings (567 milhões de parâmetros, pouco mais de um GB em meia precisão), margem para o sistema | 8 a 12 GB |
| ministral-3:14b + bge-m3 | 9,1 GB | Idem; o contexto longo torna-se o fator limitante em 12 GB | 12 a 16 GB |
| mistral-small3.2:24b + bge-m3 | 15 GB | Idem; prever uma margem confortável | 24 GB ou mais |
#As armadilhas que levam a respostas que fogem da pergunta
- O contexto padrão é muito curto
- Veja mais acima: sem aumentar num_ctx, os últimos trechos são truncados. Sintoma típico: a resposta correta é de fato recuperada pelo ChromaDB, mas o modelo diz que não a encontra.
- PDFs escaneados
- pypdf lê apenas texto já presente. Um documento digitalizado retorna um resultado vazio: o script mostra isso. Primeiro, passe o documento por um OCR, descrito no guia sobre Tesseract.
- Trechos sem contexto
- Um trecho retirado de seu documento (« o prazo é de 30 dias ») não indica a que se refere. Acrescente o título do documento ou da seção ao início de cada trecho.
- Pergunta sem resposta nos documentos
- Sem a instrução « diga claramente », um modelo preenche o vazio com o que sabe. Sempre teste uma pergunta cuja resposta não está em seus arquivos.
- Identificadores e termos exatos
- Um número de contrato ou de processo não é bem recuperado pelos embeddings: adicione uma busca por palavras-chave, como descrito no guia sobre busca híbrida.
#Para se aprofundar
| Melhoria | Esforço | Quando fazer |
|---|---|---|
| Aumentar o número de passagens (k) de 5 para 8 | Uma linha | A resposta está distribuída em vários trechos |
| Chunking por títulos em vez de parágrafos | Médio | Documentos estruturados (documentação, contratos divididos em artigos) |
| Busca híbrida BM25 + vetorial | Médio | Perguntas por identificador, sigla ou nome próprio |
| Reranker (bge-reranker-v2-m3) | Médio | A resposta correta é recuperada, mas fica abaixo da 5ª posição na classificação |
| Interface de chat (Open WebUI, API FastAPI) | Variável | Outras pessoas precisam usar a ferramenta |
| Backup e reindexação programados | Baixo | O diretório de documentos evolui semanalmente |
Cada melhoria tem seu próprio guia: meça o recall em 30 a 50 perguntas reais antes e depois, em vez de acumular técnicas. Se você prefere uma interface pronta sem escrever código, o guia de RAG sem código apresenta Open WebUI e AnythingLLM.
#Perguntas frequentes sobre RAG com Mistral
Qual modelo Mistral para um RAG local?+
Ollama consegue calcular os embeddings no lugar de sentence-transformers?+
Por que o modelo diz que não encontra a resposta, mesmo que ela esteja em meus documentos?+
É possível usar a API Mistral no lugar do Ollama?+
Como adicionar novos documentos sem reindexar tudo?+
É necessário um GPU para esse RAG?+
- RAG local com ChromaDB e Ollama: tutorial em Python
- Estratégias de chunking
- Busca híbrida BM25 + vetorial
- Adicionar um reranker ao seu pipeline
- Calculadora de VRAM
- RAG local com Ollama sem programar
- Fonte: Ollama, ministral-3
- Fonte: Ollama, mistral-small3.2
- Fonte: Ollama, bge-m3
- Fonte: Chroma, embeddings Ollama
- Fonte: FAQ Ollama, janela de contexto
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.