Intermediário 17 minutosRAG

AnythingLLM: RAG pronto para produção em ambiente local

O AnythingLLM (Mintplex Labs) é uma plataforma RAG de código aberto que pode ser implantada em poucos minutos via Docker e transforma um backend Ollama local em um assistente documental corporativo. Enquanto um RAG desenvolvido por conta própria exige integrar LlamaIndex + Chroma + uma interface, o AnythingLLM entrega a stack completa: workspaces isolados, suporte a múltiplos usuários, agentes integrados e API REST. Este tutorial de RAG com AnythingLLM mostra a instalação completa via Docker, a conexão com Ollama, a criação de workspaces, os agentes e a exposição da API para suas aplicações.

Por Mohamed Meguedmi·Atualização 2026-08-27·Testado no Windows, macOS e Linux

#Por que AnythingLLM?

AnythingLLM ocupa um nicho específico no ecossistema RAG local: tem escolhas de projeto mais definidas que o Open WebUI na parte documental, é mais simples que um script LlamaIndex feito em casa e mais pronto para produção que uma demonstração Streamlit. O projeto é open source (MIT) e mantido pela Mintplex Labs, uma equipe que faz commits continuamente desde 2023.

Workspaces isolados
Cada workspace tem seu próprio corpus de documentos, seu próprio LLM, seus próprios embeddings e seu próprio prompt de sistema. Nunca se mistura o RAG jurídico com o RAG de suporte ao cliente.
Multiusuário nativo
Autenticação, papéis (admin / gerente / usuário), permissões por workspace. Não é necessário usar reverse proxy + autenticação básica como no RAG Python bruto.
Backends LLM intercambiáveis
Ollama, LM Studio, servidor llama.cpp, vLLM, além das APIs de nuvem (OpenAI, Anthropic, etc.). É possível mudar o motor sem alterar os documentos indexados.
Agentes integrados
Web scraping, execução de SQL, cálculos, pesquisa web, salvamento de documentos — invocáveis com @agent no chat. Não é necessário colocar LangChain por cima.
API REST nativa
Um endpoint /api/v1/workspace/{slug}/chat permite conectar qualquer aplicação a um workspace específico. Formato de resposta estável e documentado.
i
Quando AnythingLLM é a escolha certa
Você quer um RAG para uma equipe, com autenticação, que trabalhe com 100 a 10.000 documentos, sem escrever um pipeline em Python. Para um RAG extremamente simples para um único usuário, Msty ou Open WebUI são suficientes. Para dezenas de milhares de documentos com pesquisa híbrida personalizada, uma stack Qdrant + LlamaIndex continua mais flexível.

#Pré-requisitos

O kit RAG Local

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
Docker
Docker Desktop no Mac/Windows ou Docker Engine no Linux. Compose não é obrigatório — um comando docker run é suficiente para iniciar.
Ollama instalado e funcionando
O daemon deve responder em http://localhost:11434. Verifique com o comando ollama list. Se Ollama ainda não estiver instalado, instale-o antes — é o backend padrão deste tutorial.
Um modelo LLM Ollama
No mínimo, um modelo de 8-9B como qwen3.5:9b (256k ctx, visão) ou granite4.2:8b. Para obter qualidade em RAG em francês, optar por mistral-small (24B) ou qwen3.8:27b se a VRAM permitir.
Um modelo de embeddings
nomic-embed-text (padrão) ou bge-m3 para uso multilíngue de melhor qualidade. Baixar com ollama pull nomic-embed-text.
RAM / VRAM
No mínimo 8 GB de RAM para o contêiner; 16 GB para funcionar com folga. Quanto à GPU, depende do modelo Ollama escolhido (≈6-7 GB para um 9B Q4, ≈14 GB para um 24B Q4).
4 GB de espaço em disco
Para o contêiner, a base SQLite interna e a base vetorial (LanceDB por padrão). Aumentar conforme o volume de documentos.
→
Testar Ollama primeiro
Antes de iniciar o AnythingLLM, confirme que Ollama responde: o comando curl http://localhost:11434/api/tags deve listar seus modelos. Se o comando falhar, o AnythingLLM não conseguirá se conectar, e 80% dos problemas "AnythingLLM não funciona" vêm justamente disso.

#1. Instalação do Docker

A imagem oficial está publicada no Docker Hub com o nome mintplexlabs/anythingllm. A Mintplex mantém tags estáveis (latest, render) e a imagem inclui tudo: Node.js, o servidor de API, o frontend, LanceDB como banco de dados vetorial e o worker de coleta.

  1. 01
    Criar uma pasta de armazenamento
    O AnythingLLM armazena tudo de forma persistente (configurações, vetores, documentos) em um volume. Crie uma pasta dedicada no host para não perder nada durante uma atualização da imagem.
  2. 02
    Iniciar o contêiner
    O comando abaixo monta o diretório de armazenamento, expõe a porta 3001 e ativa SYS_ADMIN (necessário para alguns scrapers internos renderizarem PDFs e páginas web).
  3. 03
    Abrir a UI
    Após a inicialização do contêiner, a interface fica disponível em http://localhost:3001. Na primeira execução, um assistente de configuração orienta você na definição da senha de administrador e na configuração do backend LLM.
Execução via Docker (Linux/Mac)
mkdir -p $HOME/anythingllm
touch $HOME/anythingllm/.env

docker run -d -p 3001:3001 \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  --name anythingllm \
  --restart unless-stopped \
  mintplexlabs/anythingllm:latest
!
Rede Docker e Ollama
No Mac e no Windows, Ollama roda no host, mas o container está isolado. O AnythingLLM deve usar http://host.docker.internal:11434 para se comunicar com Ollama (e não localhost). No Linux, adicione --add-host=host.docker.internal:host-gateway ao docker run, ou use o IP do bridge docker0 (geralmente 172.17.0.1).
Verificação do contêiner
docker logs -f anythingllm

# À l'écran : "Primary server in HTTP mode listening on port 3001"
# puis : "Collector hot directory found and ready"

#2. Conectar Ollama como backend

No primeiro acesso a http://localhost:3001, o AnythingLLM inicia uma configuração guiada que solicita o LLM Provider, o modelo de embeddings, a base vetorial e a criação da conta de administrador. A configuração também pode ser feita posteriormente em Settings.

  1. 01
    LLM Provider → Ollama
    Selecione Ollama na lista. Insira a URL base: http://host.docker.internal:11434 (Mac/Windows) ou http://172.17.0.1:11434 (por padrão no Linux).
  2. 02
    Escolher o modelo de chat
    O menu suspenso lista seus modelos Ollama. Escolha o LLM principal (por exemplo: mistral-small (24B) para um bom equilíbrio entre qualidade e VRAM em francês, ou qwen3.5:9b se a VRAM for mais limitada). Ajuste o tamanho da janela de contexto para 8192 ou 16384, se o modelo o suportar.
  3. 03
    Embedding Provider → Ollama
    O mesmo backend para os embeddings, ou escolher Native (modelo local integrado) se você quiser evitar carregar um modelo de embeddings no Ollama. Para usar o AnythingLLM em francês, nomic-embed-text dá conta do recado; bge-m3 (via Ollama) oferece resultados melhores.
  4. 04
    Vector Database
    Mantenha o LanceDB como opção padrão. É um banco de dados embarcado, sem dependências externas, com bom desempenho até várias centenas de milhares de chunks. Se você já gerencia Qdrant ou Chroma em outro ambiente, pode configurá-los aqui.
URL Ollama conforme o sistema operacional
Mac / Windows : http://host.docker.internal:11434
Linux (bridge)  : http://172.17.0.1:11434
Linux (--network host) : http://localhost:11434
→
Verificar se a conexão está funcionando
Em Settings → LLM Preference, o botão "Save changes" dispara uma chamada de teste para o Ollama. Um erro "Could not reach" quase sempre indica um problema com a URL: host.docker.internal versus localhost. Corrija e teste antes de prosseguir.

#3. Workspaces, documentos e embeddings

Um workspace é a unidade fundamental do AnythingLLM. Ele agrupa um corpus documental, um LLM, parâmetros de chat e conversas associadas. Geralmente, cria-se um workspace por área: Jurídico, Suporte, RH, Monitoramento tecnológico.

  1. 01
    Criar um workspace
    Barra lateral esquerda → New Workspace. Dê um nome claro (ex.: "contratos-2026"). O slug é gerado automaticamente e será usado na URL da API.
  2. 02
    Enviar documentos
    Clique no ícone de upload no workspace. O AnythingLLM aceita PDF, DOCX, TXT, MD, CSV, EPUB e muito mais. Também é possível apontar para uma URL web ou um repositório GitHub — um scraper interno recupera o conteúdo.
  3. 03
    Move to Workspace + Embed
    Os arquivos carregados vão primeiro para o Document Picker (área temporária). Selecione os que deseja indexar e depois use Move to Workspace. O AnythingLLM divide os arquivos em trechos, calcula os embeddings via Ollama e os armazena no LanceDB.
  4. 04
    Configurar o prompt de sistema
    Workspace settings → Chat Settings → Prompt. É aqui que se define o papel ("Você é um assistente jurídico. Sempre cite o artigo exato do contrato"). O top-K da recuperação (Document Similarity Threshold) também é ajustado aqui.
Tamanho do chunk
Por padrão, 1000 caracteres com 20 de sobreposição. Para contratos jurídicos em que cada cláusula importa, reduzir para 500. Para documentação técnica com blocos de código, aumentar para 1500.
Modelo de embedding
nomic-embed-text (768 dimensões) é rápido, mas tem desempenho mediano em francês. bge-m3 (1024 dimensões, multilíngue) ganha 10-15% de precisão em conteúdo francês. mxbai-embed-large é uma boa opção intermediária.
Modo chat vs query
Chat utiliza o histórico da conversa + RAG. Query usa estritamente RAG: se não houver nenhuma correspondência nos documentos, o LLM se recusa a responder. Query é a configuração adequada para usos em que a alucinação é proibida.
i
Pin Document
Um documento pode ser fixado no workspace (ícone de alfinete). Seu conteúdo completo é então injetado em cada prompt, além da recuperação tradicional por RAG. Ideal para um glossário da área de atuação ou um documento de diretrizes que deve estar sempre no contexto.
Download dos modelos de embeddings via Ollama
# Modèle par défaut, multilingue correct
ollama pull nomic-embed-text

# Meilleur pour le français, 1024 dimensions
ollama pull bge-m3

# Vérifier qu'ils tournent
ollama list | grep embed

#4. Agentes integrados

Além do RAG estrito, o AnythingLLM inclui um sistema de agentes: basta chamar @agent no chat e o LLM poderá usar habilidades (ferramentas) para buscar informações fora da base documental. Não é necessário usar LangChain nem escrever chamadas de ferramenta: está integrado.

web-browsing
O agente abre uma URL e lê a página (o DOM renderizado, não apenas o HTML bruto). Útil para fazer o assistente responder sobre informações que não estão no RAG.
web-scraping
Variante: extrai o conteúdo de uma página e o adiciona como documento ao workspace. Útil para enriquecer o corpus conforme a necessidade.
save-document
O agente gera um documento (resumo, síntese) e o salva no workspace. Útil para fluxos de trabalho como 'ler 10 artigos → produzir uma anotação'.
sql-connector
Conecte um banco de dados PostgreSQL/MySQL e o agente poderá escrever e executar consultas SQL para responder a perguntas analíticas. Naturalmente, use uma conta SQL com acesso somente de leitura.
rag-memory
Memória de longo prazo entre conversas. O agente pode salvar fatos que poderá recuperar em sessões futuras.
Chamada de um agente no chat
@agent va sur https://blog.example.com/rapport-2026 et fais-moi
un résumé en 5 points des chiffres-clés.

@agent connecte-toi à la base postgres-prod et donne-moi le top 10
des clients par chiffre d'affaires sur le trimestre.

@agent enregistre la conversation précédente sous forme de note
dans ce workspace, titre : "Synthèse veille IA juin 2026".
!
Modelo forte o suficiente para chamadas de ferramentas
Os agentes exigem um LLM capaz de fazer chamadas de função corretamente. Localmente: glm-4.7-flash (MoE 30B-A3B, muito bom em agentes) ou qwen3.8:27b, mistral-small como alternativa sólida, qwen3.5:9b como mínimo. Modelos muito pequenos (2-3B) sem fine-tuning para uso de ferramentas inventam chamadas de ferramentas. Se o agente entrar em loop ou falhar nas chamadas, o problema está quase sempre aí.

#5. Expor a API

Para conectar o AnythingLLM às suas aplicações (chatbot interno, plugin Slack, integração de negócios), a API REST é a interface canônica. Cada workspace se torna um endpoint com escopo para seu corpus.

  1. 01
    Gerar uma chave de API
    Settings → API Keys → Generate New API Key. Anote a chave, pois ela é exibida apenas uma vez. Você pode criar várias, por exemplo, uma por aplicação cliente, e revogá-las individualmente.
  2. 02
    Identificar o slug do workspace
    Ele fica visível na URL quando você está no workspace: .../workspace/contrats-2026 → slug = contrats-2026.
  3. 03
    Testar com curl
    O endpoint principal é POST /api/v1/workspace/{slug}/chat. Cabeçalho Authorization: Bearer YOUR_KEY, corpo JSON com message e mode (chat ou query).
Chamada de API com curl
curl -X POST http://localhost:3001/api/v1/workspace/contrats-2026/chat \
  -H "Authorization: Bearer VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Quelle est la durée de préavis dans le contrat ACME ?",
    "mode": "query"
  }'
Cliente Python
import requests

API_KEY   = "votre-cle-api"
WORKSPACE = "contrats-2026"
BASE_URL  = "http://localhost:3001"

def ask(question: str, mode: str = "chat") -> dict:
    response = requests.post(
        f"{BASE_URL}/api/v1/workspace/{WORKSPACE}/chat",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        json={"message": question, "mode": mode},
        timeout=120,
    )
    response.raise_for_status()
    return response.json()

result = ask("Résume la clause 4 du contrat ACME signé en mars.")
print(result["textResponse"])
for source in result.get("sources", []):
    print(" -", source["title"])
→
Streaming e endpoints avançados
A API também suporta /chat/stream (SSE) para streaming token a token, /thread/new para gerenciar conversas de múltiplos turnos no lado do servidor, e /documents para automatizar a indexação. A documentação completa está em Settings → API → Open API Docs (interface Swagger integrada).

#Solução de problemas

"Could not reach Ollama at ..."
Erro mais comum. Verifique a URL: de dentro do contêiner Docker, localhost não aponta para a máquina hospedeira. Use host.docker.internal no Mac/Win, o IP da bridge ou --network host no Linux.
Embedding muito lento
O modelo de embeddings roda na CPU por padrão se você não tiver baixado o modelo no Ollama. Force o uso do Ollama como provedor de embeddings e verifique ollama ps durante a indexação para ver a GPU trabalhando.
O RAG não encontra um trecho evidente
Três causas comuns: blocos muito grandes (mude de 1000 para 500 caracteres), modelo de embeddings fraco em francês (mude para bge-m3) ou Document Similarity Threshold muito restritivo nas configurações do workspace.
Agente entra em loop na chamada de ferramenta
O modelo não é forte o suficiente. Mude para glm-4.7-flash, qwen3.8:27b se possível, ou mistral-small. Evite modelos muito pequenos (2-3B) sem fine-tuning para uso de ferramentas em agentes.
Contêiner encerrado após algumas horas
Erro OOM no kernel: o Docker não tem memória suficiente alocada. No Docker Desktop, aumente o limite de RAM para 8–16 GB (Settings → Resources).
Atualização da imagem
docker pull mintplexlabs/anythingllm:latest, depois docker rm -f anythingllm e execute novamente o run com os mesmos volumes. Os dados em $HOME/anythingllm são preservados.

#Para se aprofundar

De acordo com a direção que você quer seguir:

Comparar AnythingLLM com as alternativas sem código
« RAG local com Ollama sem programar (Open WebUI, AnythingLLM) » apresenta uma comparação direta com o Open WebUI usando o mesmo backend Ollama.
Otimizar os embeddings FR
« Os melhores modelos de embeddings FR » compara bge-m3, Solon, E5 e fornece as configurações corretas para AnythingLLM.
Avançar mais na stack de produção
« Implantar um LLM em produção com Docker Compose » mostra como combinar o AnythingLLM com um proxy reverso Traefik, Qdrant externo e backups automatizados.
Este guia ajudou você?

Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.