Intermedio 17 minRAG

AnythingLLM: RAG listo para producción en local

AnythingLLM (Mintplex Labs) es una plataforma RAG de código abierto que se despliega en pocos minutos mediante Docker y convierte un backend local de Ollama en un asistente documental empresarial. Mientras que un RAG "casero" requiere combinar LlamaIndex + Chroma + una interfaz de usuario, AnythingLLM proporciona toda la pila: espacios de trabajo aislados, soporte para múltiples usuarios, agentes integrados y API REST. Este tutorial de RAG con AnythingLLM muestra la instalación completa con Docker, la conexión con Ollama, la creación de espacios de trabajo, los agentes y cómo exponer la API a tus aplicaciones.

Por Mohamed Meguedmi·Actualización 2026-08-27·Probado en Windows, macOS y Linux

#¿Por qué AnythingLLM?

AnythingLLM ocupa un nicho preciso en el ecosistema RAG local: con un enfoque más definido que Open WebUI en la parte documental, más sencillo que un script propio de LlamaIndex y más preparado para producción que una demo de Streamlit. El proyecto es de código abierto (MIT) y lo impulsa Mintplex Labs, un equipo que realiza commits de forma continua desde 2023.

Workspaces aislados
Cada workspace tiene su propio corpus de documentos, su propio LLM, sus propios embeddings y su propio prompt de sistema. Nunca se mezcla el RAG jurídico con el RAG de soporte al cliente.
Multiusuario nativo
Autenticación, roles (admin / manager / usuario), permisos por workspace. No hace falta un proxy inverso con autenticación básica como con un RAG implementado directamente en Python.
Backends LLM intercambiables
Ollama, LM Studio, llama.cpp server, vLLM, así como las API de nube (OpenAI, Anthropic, etc.). Se puede cambiar el motor sin tocar los documentos indexados.
Agentes integrados
Web scraping, ejecución de SQL, cálculos, búsqueda web y guardado de documentos: funciones que puedes invocar con @agent en el chat. No hace falta añadir LangChain por encima.
API REST nativa
Un endpoint /api/v1/workspace/{slug}/chat permite conectar cualquier aplicación a un workspace dado. Formato de respuesta estable y documentado.
i
Cuándo AnythingLLM es la opción adecuada
Quieres un RAG de equipo con autenticación, con entre 100 y 10.000 documentos, sin escribir un pipeline en Python. Para un RAG de un solo usuario muy sencillo, Msty o Open WebUI son suficientes. Para decenas de miles de documentos con búsqueda híbrida personalizada, una pila Qdrant + LlamaIndex sigue siendo más flexible.

#Prerrequisitos

El kit RAG Local

Tus documentos, tu IA: un RAG local fiable sobre tus PDF, notas y correos — sin enviar nada a la nube.

  • Espacio en línea de por vida
  • PDF + archivos
  • Reembolsado 30 j
Docker
Docker Desktop en Mac/Windows, o Docker Engine en Linux. Compose no es obligatorio — un docker run basta para iniciar.
Ollama instalado y funcionando
El daemon debe responder en http://localhost:11434. Compruébalo con ollama list. Si Ollama aún no está instalado, instálalo antes: es el backend predeterminado de este tutorial.
Un modelo LLM en Ollama
Como mínimo, un modelo de 8-9B como qwen3.5:9b (256k ctx, visión) o granite4.2:8b. Para obtener calidad en RAG en francés, optar por mistral-small (24B) o qwen3.8:27b si la VRAM lo permite.
Un modelo de embeddings
nomic-embed-text (por defecto) o bge-m3 para un procesamiento multilingüe de mayor calidad. Descargar con ollama pull nomic-embed-text.
RAM / VRAM
8 GB de RAM como mínimo para el contenedor; 16 GB para trabajar con comodidad. En cuanto a la GPU, depende del modelo de Ollama elegido (≈6-7 GB para un 9B Q4, ≈14 GB para un 24B Q4).
4 GB de espacio en disco
Para el contenedor, la base SQLite interna, y la base vectorial (LanceDB por defecto). Aumentar según el volumen de documentos.
→
Probar Ollama primero
Antes de iniciar AnythingLLM, asegúrate de que Ollama responda: curl http://localhost:11434/api/tags debe listar tus modelos. Si el comando falla, AnythingLLM no podrá conectarse a Ollama, y el 80 % de los problemas "AnythingLLM no funciona" se deben a eso.

#1. Instalación Docker

La imagen oficial se publica en Docker Hub bajo mintplexlabs/anythingllm. Mintplex mantiene etiquetas estables (latest, render) y la imagen incluye todo: Node.js, el servidor API, el frontend, LanceDB como base de datos vectorial y el proceso de recopilación.

  1. 01
    Crear un directorio de almacenamiento
    AnythingLLM conserva todo (configuración, vectores, documentos) en un volumen. Crea un directorio dedicado en el equipo anfitrión para no perder nada durante una actualización de la imagen.
  2. 02
    Iniciar el contenedor
    El comando que aparece a continuación monta el directorio de almacenamiento, expone el puerto 3001 y activa SYS_ADMIN (necesario para que algunos scrapers internos rendericen PDF y páginas web).
  3. 03
    Abrir la UI
    Una vez iniciado el contenedor, la interfaz está disponible en http://localhost:3001. La primera vez que la abras, un asistente de configuración te guiará para configurar la contraseña de administrador y el backend LLM.
Ejecución con 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
!
Red Docker y Ollama
En Mac y Windows, Ollama funciona en el host pero el contenedor está aislado. AnythingLLM debe usar http://host.docker.internal:11434 para comunicarse con Ollama (y no localhost). En Linux, añade --add-host=host.docker.internal:host-gateway al comando docker run, o utiliza la IP del puente docker0 (a menudo 172.17.0.1).
Verificación del contenedor
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

Al acceder por primera vez a http://localhost:3001, AnythingLLM inicia un asistente de configuración que solicita el LLM Provider, el modelo de embeddings, la base vectorial y la creación de la cuenta de administrador. La configuración también puede realizarse posteriormente en Settings.

  1. 01
    LLM Provider → Ollama
    Selecciona Ollama en la lista. Introduce la URL base: http://host.docker.internal:11434 (Mac/Windows) o http://172.17.0.1:11434 (Linux por defecto).
  2. 02
    Elegir el modelo de chat
    El menú desplegable muestra tus modelos Ollama. Elige el LLM principal (por ejemplo: mistral-small (24B) para un buen equilibrio entre calidad y VRAM en francés, o qwen3.5:9b si la VRAM es más limitada). Ajusta la ventana de contexto a 8192 o 16384 si el modelo lo admite.
  3. 03
    Embedding Provider → Ollama
    El mismo backend para los embeddings, o elegir Native (modelo local integrado) si quieres evitar cargar un modelo de embeddings en Ollama. Para AnythingLLM en francés, nomic-embed-text cumple su función; bge-m3 (a través de Ollama) lo hace mejor.
  4. 04
    Vector Database
    Mantén LanceDB como opción predeterminada. Es una base de datos integrada, sin dependencias externas, que ofrece buen rendimiento hasta varios cientos de miles de chunks. Si ya gestionas Qdrant o Chroma en otro lugar, puedes configurarlos aquí.
URL de Ollama según el sistema operativo
Mac / Windows : http://host.docker.internal:11434
Linux (bridge)  : http://172.17.0.1:11434
Linux (--network host) : http://localhost:11434
→
Comprobar que la conexión funcione
En Settings → LLM Preference, el botón "Save changes" desencadena una llamada de prueba a Ollama. Un error "Could not reach" apunta casi siempre a un problema con la URL: host.docker.internal frente a localhost. Corrígelo y prueba antes de continuar.

#3. Espacios de trabajo, documentos y embeddings

Un workspace es la unidad fundamental de AnythingLLM. Agrupa un corpus documental, un LLM, los parámetros de chat y las conversaciones asociadas. Se crea típicamente un workspace por área: Jurídico, Soporte, RRHH, Vigilancia tecnológica.

  1. 01
    Crear un workspace
    Barra lateral izquierda → New Workspace. Dale un nombre explícito (por ejemplo: "contrats-2026"). El slug se genera automáticamente y se usará en la URL de la API.
  2. 02
    Subir documentos
    Haz clic en el icono de subida en el workspace. AnythingLLM acepta PDF, DOCX, TXT, MD, CSV, EPUB y mucho más. También se puede apuntar a una URL web o a un repositorio GitHub — un scraper interno recupera el contenido.
  3. 03
    Move to Workspace + Embed
    Los archivos subidos van primero al Document Picker (zona de almacenamiento temporal). Selecciona los que quieras indexar y luego pulsa Move to Workspace. AnythingLLM divide los documentos en fragmentos, calcula los embeddings mediante Ollama y los almacena en LanceDB.
  4. 04
    Ajustar el prompt del sistema
    Workspace settings → Chat Settings → Prompt. Aquí se define el rol ("Eres un asistente jurídico. Cita siempre el artículo exacto del contrato"). El top-K de recuperación (Document Similarity Threshold) también se ajusta aquí.
Chunk size
Por defecto 1000 caracteres con 20 de superposición. Para contratos jurídicos donde cada cláusula cuenta, reducir a 500. Para documentación técnica con bloques de código, aumentar a 1500.
Modelo de embeddings
nomic-embed-text (768 dims) es rápido, pero su rendimiento en francés es mediocre. bge-m3 (1024 dims, multilingüe) gana un 10-15 % de precisión en contenido francés. mxbai-embed-large es una buena opción intermedia.
Modo chat vs query
Chat utiliza el historial de conversación + RAG. Query utiliza exclusivamente RAG: si no hay ninguna coincidencia en los documentos, el LLM se niega a responder. Query es el ajuste adecuado para los usos en los que las alucinaciones están prohibidas.
i
Pin Document
Se puede fijar un documento en el espacio de trabajo (icono de chincheta). Su contenido completo se incorpora entonces a cada prompt, además de la recuperación RAG convencional. Ideal para un glosario profesional o un documento de principios que siempre deba estar en el contexto.
Descarga de modelos de embeddings a través de 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

Más allá del RAG estricto, AnythingLLM incluye un sistema de agentes: se invoca @agent en el chat y el LLM puede entonces usar habilidades (herramientas) para buscar información fuera de la base documental. No es necesario usar LangChain ni escribir llamadas a herramientas: está integrado.

web-browsing
El agente abre una URL y lee la página (el DOM renderizado, no solo el HTML sin procesar). Útil para que el asistente responda sobre información que no está en el RAG.
web-scraping
Variante: extrae el contenido de una página y lo añade como documento al espacio de trabajo. Útil para enriquecer el corpus sobre la marcha.
save-document
El agente genera un documento (resumen, síntesis) y lo guarda en el workspace. Útil para flujos de trabajo como «leer 10 artículos → producir una nota».
sql-connector
Conecta una base de datos PostgreSQL/MySQL y el agente podrá escribir y ejecutar consultas SQL para responder a preguntas analíticas. Por supuesto, hay que usar una cuenta SQL de solo lectura.
rag-memory
Memoria de largo plazo entre conversaciones. El agente puede guardar hechos que podrá recuperar en sesiones futuras.
Invocación de un agente en el 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 suficientemente potente para llamar a herramientas
Los agentes requieren un LLM capaz de realizar llamadas a funciones correctamente. En local: glm-4.7-flash (MoE 30B-A3B, muy bueno para agentes) o qwen3.8:27b, mistral-small como alternativa sólida, qwen3.5:9b como mínimo. Los modelos muy pequeños (2-3B) sin ajuste fino para el uso de herramientas inventan llamadas a herramientas. Si el agente entra en un bucle o falla al realizar sus llamadas, el problema casi siempre está ahí.

#5. Exponer la API

Para conectar AnythingLLM a tus aplicaciones (chatbot interno, plugin Slack, integración empresarial), la API REST es la interfaz canónica. Cada workspace se convierte en un endpoint limitado a su corpus.

  1. 01
    Generar una clave de API
    Settings → API Keys → Generate New API Key. Anota la clave, solo se muestra una vez. Puedes crear varias, por ejemplo una por aplicación cliente, y revocarlas individualmente.
  2. 02
    Identificar el slug del workspace
    Se ve en la URL cuando estás en el workspace: .../workspace/contrats-2026 → slug = contrats-2026
  3. 03
    Probar con curl
    El endpoint principal es POST /api/v1/workspace/{slug}/chat. Encabezado Authorization: Bearer YOUR_KEY, cuerpo JSON con message y mode (chat o query).
Llamada a la API con 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 y endpoints avanzados
La API también soporta /chat/stream (SSE) para el streaming token por token, /thread/new para gestionar conversaciones de múltiples turnos desde el servidor, y /documents para automatizar la indexación. La documentación completa está en Settings → API → Open API Docs (Swagger integrado en la interfaz).

#Solución de problemas

"Could not reach Ollama at ..."
El error más frecuente. Revisa la URL: desde el contenedor Docker, localhost no apunta al host. Utiliza host.docker.internal en Mac/Win, la IP del bridge o --network host en Linux.
Embedding muy lento
El modelo de embeddings se ejecuta en la CPU de forma predeterminada si no has descargado el modelo en Ollama. Fuerza el uso de Ollama como proveedor de embeddings y comprueba ollama ps durante la indexación para ver la GPU en funcionamiento.
El RAG no encuentra un pasaje evidente
Tres causas comunes: bloques demasiado grandes (reduce de 1000 a 500 caracteres), un modelo de embeddings débil en francés (cambia a bge-m3) o un valor de Document Similarity Threshold demasiado estricto en la configuración del espacio de trabajo.
El agente entra en un bucle de llamadas a la herramienta
El modelo no es lo bastante potente. Pasa a glm-4.7-flash, a qwen3.8:27b si es posible, o a mistral-small. Evita usar para agentes modelos muy pequeños (2-3B) que no hayan recibido fine-tuning para el uso de herramientas.
El contenedor se termina tras unas horas
OOM kernel: Docker no tiene suficiente memoria asignada. En Docker Desktop, aumenta el límite de RAM a 8-16 GB (Settings → Resources).
Actualización de la imagen
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.

#Para ir más allá

Según la dirección que quieras seguir:

Comparar AnythingLLM con las alternativas sin código
«RAG local con Ollama sin programar (Open WebUI, AnythingLLM)» ofrece una comparación directa con Open WebUI usando el mismo backend Ollama.
Optimizar embeddings FR
« Los mejores modelos de embeddings FR » compara bge-m3, Solon, E5 y proporciona los ajustes adecuados para AnythingLLM.
Llevar más lejos la pila de producción
«Desplegar un LLM en producción con Docker Compose» muestra cómo combinar AnythingLLM con un proxy inverso Traefik, Qdrant externo y copias de seguridad automatizadas.
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.