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.
#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é.
#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.
#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.
- 01Créer un dossier de stockageAnythingLLM 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.
- 02Lancer le conteneurLa 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).
- 03Ouvrir l'UIUne 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.
#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.
- 01LLM Provider → OllamaSé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).
- 02Choisir le modèle de chatLe 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.
- 03Embedding Provider → OllamaMê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.
- 04Vector DatabaseLaissez 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.
#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.
- 01Créer un workspaceSidebar 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.
- 02Uploader des documentsCliquez 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.
- 03Move to Workspace + EmbedLes 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.
- 04Régler le system promptWorkspace 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.
#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.
#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.
- 01Générer une API keySettings → 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.
- 02Identifier le slug du workspaceIl est visible dans l'URL quand vous êtes dans le workspace : .../workspace/contrats-2026 → slug = contrats-2026.
- 03Tester avec curlL'endpoint principal est POST /api/v1/workspace/{slug}/chat. Header Authorization: Bearer YOUR_KEY, body JSON avec message et mode (chat ou query).
#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.
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.