Intermédiaire 17 minRAG

AnythingLLM : RAG production-ready en local

AnythingLLM (Mintplex Labs) est une plateforme RAG open source qui se déploie en quelques minutes via Docker et transforme un backend Ollama local en assistant documentaire d'entreprise. Là où un RAG "maison" demande de coller LlamaIndex + Chroma + une UI, AnythingLLM livre la stack entière : workspaces isolés, multi-utilisateurs, agents intégrés, API REST. Ce tutoriel AnythingLLM RAG montre l'installation Docker complète, le branchement sur Ollama, la création de workspaces, les agents, et l'exposition de l'API à vos applications.

Par Mohamed Meguedmi·Màj 2026-06-09·Testé sur Windows, macOS, Linux

#Pourquoi AnythingLLM ?

AnythingLLM occupe une niche précise dans l'écosystème RAG local : plus opinioné qu'Open WebUI sur la partie documentaire, plus simple qu'un script LlamaIndex maison, plus production-ready qu'une démo Streamlit. Le projet est open source (MIT) et porté par Mintplex Labs, une équipe qui commit en continu depuis 2023.

Workspaces isolés
Chaque workspace a son propre corpus de documents, son propre LLM, ses propres embeddings et son propre system prompt. On ne mélange jamais le RAG juridique avec le RAG support client.
Multi-utilisateurs natif
Authentification, rôles (admin / manager / utilisateur), permissions par workspace. Pas besoin de Reverse proxy + auth basic comme avec un RAG Python brut.
Backends LLM interchangeables
Ollama, LM Studio, llama.cpp server, vLLM, ainsi que les API cloud (OpenAI, Anthropic, etc.). On peut changer de moteur sans toucher aux documents indexés.
Agents intégrés
Web scraping, exécution SQL, calculs, recherche web, sauvegarde de documents — invocables avec @agent dans le chat. Pas besoin de coller LangChain par-dessus.
API REST native
Un endpoint /api/v1/workspace/{slug}/chat permet de brancher n'importe quelle application sur un workspace donné. Format de réponse stable et documenté.
i
Quand AnythingLLM est le bon choix
Vous voulez un RAG d'équipe avec authentification, sur 100 à 10 000 documents, sans écrire de pipeline Python. Pour un RAG mono-utilisateur ultra-simple, Msty ou Open WebUI suffisent. Pour des dizaines de milliers de docs avec recherche hybride custom, une stack Qdrant + LlamaIndex reste plus flexible.

#Prérequis

Docker
Docker Desktop sur Mac/Windows, ou Docker Engine sur Linux. Compose n'est pas obligatoire — un docker run suffit pour démarrer.
Ollama installé et fonctionnel
Le daemon doit répondre sur http://localhost:11434. Vérifiez avec ollama list. Si Ollama n'est pas encore installé, faites-le avant — c'est le backend par défaut de ce tutoriel.
Un modèle LLM Ollama
Au minimum un 7B comme mistral, llama3.1:8b, ou qwen2.5:7b. Pour de la qualité RAG en français, viser 14B ou plus si la VRAM le permet.
Un modèle d'embeddings
nomic-embed-text (par défaut) ou bge-m3 pour du multilingue de meilleure qualité. À puller avec ollama pull nomic-embed-text.
RAM / VRAM
8 Go RAM minimum pour le conteneur, 16 Go confortable. Côté GPU, dépend du modèle Ollama choisi (5 Go pour 7B Q4, 9 Go pour 14B Q4).
4 Go d'espace disque
Pour le conteneur, la base SQLite interne, et la base vectorielle (LanceDB par défaut). À augmenter selon le volume documentaire.
Tester Ollama d'abord
Avant de lancer AnythingLLM, confirmez qu'Ollama répond : curl http://localhost:11434/api/tags doit lister vos modèles. Si la commande échoue, AnythingLLM ne pourra pas se brancher dessus, et 80% des problèmes "AnythingLLM ne marche pas" viennent de là.

#1. Installation Docker

L'image officielle est publiée sur Docker Hub sous mintplexlabs/anythingllm. Mintplex maintient des tags stables (latest, render) et l'image embarque tout : Node.js, le serveur API, le frontend, LanceDB en base vectorielle, le worker de collection.

  1. 01
    Créer un dossier de stockage
    AnythingLLM persiste tout (config, vecteurs, documents) dans un volume. Créez un dossier dédié sur l'hôte pour ne rien perdre lors d'une mise à jour de l'image.
  2. 02
    Lancer le conteneur
    La commande ci-dessous monte le dossier de stockage, expose le port 3001, et active SYS_ADMIN (requis par certains scrapers internes pour le rendu PDF/web).
  3. 03
    Ouvrir l'UI
    Une fois le conteneur démarré, l'interface est disponible sur http://localhost:3001. Au premier lancement, un assistant de configuration vous guide pour le mot de passe admin et le backend LLM.
Lancement 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
!
Réseau Docker et Ollama
Sur Mac et Windows, Ollama tourne sur l'hôte mais le conteneur est isolé. AnythingLLM doit utiliser http://host.docker.internal:11434 pour parler à Ollama (et pas localhost). Sur Linux, ajoutez --add-host=host.docker.internal:host-gateway au docker run, ou utilisez l'IP du bridge docker0 (souvent 172.17.0.1).
Vérification du conteneur
docker logs -f anythingllm

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

#2. Brancher Ollama comme backend

Au premier accès à http://localhost:3001, AnythingLLM lance un onboarding qui demande le LLM Provider, le modèle d'embeddings, la base vectorielle et la création du compte admin. La configuration peut aussi se faire après coup dans Settings.

  1. 01
    LLM Provider → Ollama
    Sélectionnez Ollama dans la liste. Renseignez l'URL de base : http://host.docker.internal:11434 (Mac/Windows) ou http://172.17.0.1:11434 (Linux par défaut).
  2. 02
    Choisir le modèle de chat
    Le menu déroulant liste vos modèles Ollama. Choisissez le LLM principal (ex : qwen2.5:14b pour un bon compromis qualité/VRAM en FR). Réglez la fenêtre de contexte sur 8192 ou 16384 si le modèle le supporte.
  3. 03
    Embedding Provider → Ollama
    Même backend pour les embeddings, ou choisir Native (modèle local embarqué) si vous voulez éviter de charger un embedder dans Ollama. Pour AnythingLLM en français, nomic-embed-text fait le job, bge-m3 (via Ollama) fait mieux.
  4. 04
    Vector Database
    Laissez LanceDB par défaut. Embarqué, sans dépendance externe, performant jusqu'à plusieurs centaines de milliers de chunks. Si vous gérez déjà Qdrant ou Chroma ailleurs, vous pouvez les configurer ici.
URL Ollama selon l'OS
Mac / Windows : http://host.docker.internal:11434
Linux (bridge)  : http://172.17.0.1:11434
Linux (--network host) : http://localhost:11434
Vérifier que la connexion passe
Dans Settings → LLM Preference, le bouton "Save changes" déclenche un appel test vers Ollama. Une erreur "Could not reach" pointe presque toujours sur l'URL host.docker.internal vs localhost. Corrigez et testez avant d'aller plus loin.

#3. Workspaces, documents et embeddings

Un workspace est l'unité fondamentale d'AnythingLLM. Il regroupe un corpus documentaire, un LLM, des paramètres de chat, et les conversations associées. On crée typiquement un workspace par domaine : Juridique, Support, RH, Veille tech.

  1. 01
    Créer un workspace
    Sidebar gauche → New Workspace. Donnez-lui un nom explicite (ex : "contrats-2026"). Le slug est généré automatiquement et sera utilisé dans l'URL API.
  2. 02
    Uploader des documents
    Cliquez sur l'icône upload dans le workspace. AnythingLLM accepte PDF, DOCX, TXT, MD, CSV, EPUB, et bien plus. On peut aussi pointer vers une URL web ou un repo GitHub — un scraper interne récupère le contenu.
  3. 03
    Move to Workspace + Embed
    Les fichiers uploadés vont d'abord dans le Document Picker (zone tampon). Sélectionnez ceux à indexer puis Move to Workspace. AnythingLLM chunk, calcule les embeddings via Ollama, et les stocke dans LanceDB.
  4. 04
    Régler le system prompt
    Workspace settings → Chat Settings → Prompt. C'est ici qu'on cadre le rôle ("Tu es un assistant juridique. Cite toujours l'article exact du contrat"). Le top-K du retrieval (Document Similarity Threshold) se règle aussi ici.
Chunk size
Par défaut 1000 caractères avec 20 de chevauchement. Pour des contrats juridiques où chaque clause compte, baisser à 500. Pour de la doc technique avec des blocs de code, monter à 1500.
Embedding model
nomic-embed-text (768 dims) est rapide mais moyen en FR. bge-m3 (1024 dims, multilingue) gagne 10-15% de précision sur du contenu français. mxbai-embed-large est un bon intermédiaire.
Mode chat vs query
Chat utilise l'historique de conversation + RAG. Query est strict RAG : si rien ne matche dans les documents, le LLM refuse de répondre. Query est le bon réglage pour les usages où l'hallucination est interdite.
i
Pin Document
Un document peut être épinglé dans le workspace (icône punaise). Son contenu complet est alors injecté dans chaque prompt en plus du retrieval RAG classique. Idéal pour un glossaire métier ou une charte qui doit toujours être en contexte.
Pull des modèles d'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. Agents intégrés

Au-delà du RAG strict, AnythingLLM embarque un système d'agents : on invoque @agent dans le chat et le LLM peut alors utiliser des skills (outils) pour aller chercher de l'info hors de la base documentaire. Pas besoin de LangChain ni d'écrire de tool calling : c'est intégré.

web-browsing
L'agent ouvre une URL et lit la page (rendu DOM, pas juste le HTML brut). Utile pour faire répondre l'assistant sur de l'info qui n'est pas dans le RAG.
web-scraping
Variante : scrape une page et l'ajoute en document au workspace. Pratique pour enrichir le corpus à la volée.
save-document
L'agent génère un document (résumé, synthèse) et l'enregistre dans le workspace. Utile pour des workflows "lire 10 articles → produire une note".
sql-connector
Connectez une base PostgreSQL/MySQL et l'agent peut écrire et exécuter des requêtes SQL pour répondre à des questions analytiques. Évidemment, à coupler avec un compte SQL en lecture seule.
rag-memory
Mémoire long terme inter-conversations. L'agent peut sauvegarder des faits qu'il pourra retrouver dans des sessions futures.
Invocation d'un agent dans le 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".
!
Modèle assez fort pour le tool calling
Les agents requièrent un LLM capable de faire du function calling propre. En local : qwen2.5:14b ou plus, llama3.1:8b minimum, mistral-small. Les 7B simples (sans fine-tuning tool-use) hallucinent les appels d'outils. Si l'agent boucle ou rate ses appels, le problème est presque toujours là.

#5. Exposer l'API

Pour brancher AnythingLLM à vos applications (chatbot interne, plugin Slack, intégration métier), l'API REST est l'interface canonique. Chaque workspace devient un endpoint scopé à son corpus.

  1. 01
    Générer une API key
    Settings → API Keys → Generate New API Key. Notez la clé, elle n'est affichée qu'une fois. Vous pouvez en créer plusieurs, par exemple une par application cliente, et révoquer individuellement.
  2. 02
    Identifier le slug du workspace
    Il est visible dans l'URL quand vous êtes dans le workspace : .../workspace/contrats-2026 → slug = contrats-2026.
  3. 03
    Tester avec curl
    L'endpoint principal est POST /api/v1/workspace/{slug}/chat. Header Authorization: Bearer YOUR_KEY, body JSON avec message et mode (chat ou query).
Appel API en 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"
  }'
Client 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 et endpoints avancés
L'API supporte aussi /chat/stream (SSE) pour le streaming token-par-token, /thread/new pour gérer des conversations multi-tours côté serveur, et /documents pour automatiser l'indexation. La doc complète est dans Settings → API → Open API Docs (UI Swagger embarquée).

#Dépannage

"Could not reach Ollama at ..."
Erreur la plus fréquente. Vérifiez l'URL : depuis le conteneur Docker, localhost ne pointe pas sur l'hôte. Utilisez host.docker.internal sur Mac/Win, l'IP du bridge ou --network host sur Linux.
Embedding très lent
L'embedder tourne sur CPU par défaut si vous n'avez pas pull le modèle dans Ollama. Forcez Ollama comme embedding provider et vérifiez ollama ps pendant l'indexation pour voir le GPU travailler.
Le RAG ne retrouve pas un passage évident
Trois causes classiques : chunks trop gros (passez de 1000 à 500 caractères), modèle d'embeddings faible en FR (passez à bge-m3), ou Document Similarity Threshold trop strict dans les settings du workspace.
Agent boucle sur l'appel d'outil
Modèle pas assez fort. Passez à qwen2.5:14b, llama3.1:70b si possible, ou mistral-small. Évitez les 7B sans fine-tuning tool-use pour les agents.
Conteneur kill après quelques heures
OOM kernel : Docker n'a pas assez de mémoire allouée. Sur Docker Desktop, augmentez la limite RAM à 8-16 Go (Settings → Resources).
Mise à jour de l'image
docker pull mintplexlabs/anythingllm:latest puis docker rm -f anythingllm et relancer le run avec les mêmes volumes. Les données dans $HOME/anythingllm sont conservées.

#Pour aller plus loin

Selon la direction que vous voulez prendre :

Comparer AnythingLLM avec les alternatives no-code
« RAG local avec Ollama sans coder (Open WebUI, AnythingLLM) » fait le match direct avec Open WebUI sur le même backend Ollama.
Optimiser les embeddings FR
« Les meilleurs modèles d'embeddings FR » compare bge-m3, Solon, E5 et donne les bons réglages pour AnythingLLM.
Pousser plus loin la stack production
« Déployer un LLM en production avec Docker Compose » montre comment empiler AnythingLLM avec un reverse proxy Traefik, Qdrant externe, et de la sauvegarde automatisée.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.