RAG con ChromaDB y Mistral
Para un RAG local con Mistral, la pila más sencilla es Ollama (generación y embeddings con bge-m3) más ChromaDB en modo archivo, sin servidor ni PyTorch. En cuanto al modelo, ministral-3:8b (6,0 GB, licencia Apache 2.0, contexto de 256K anunciado) es una buena opción por defecto para una tarjeta de 8 a 12 GB, ministral-3:14b para 16 GB y mistral-small3.2:24b (15 GB) para capacidades superiores. El ajuste que no se debe olvidar: la ventana de contexto de Ollama, que hay que aumentar para que los pasajes quepan en el prompt.
Esta guía muestra cómo construir un asistente documental completo en dos scripts Python, con un modelo Mistral ejecutado en tu máquina: tus PDF y archivos de texto se dividen en fragmentos, se indexan en ChromaDB y luego los pasajes recuperados se entregan al modelo, que responde citando sus fuentes. También especifica qué modelo Mistral elegir según tu memoria gráfica y los errores que hacen que un RAG dé respuestas que no vienen al caso.
#Lo que construimos: un RAG Mistral completamente local
El RAG (generación aumentada por recuperación) consiste en buscar los pasajes de tus documentos relacionados con la pregunta y luego pegarlos en el prompt del modelo para que responda a partir de ellos. El resultado esperado aquí es una pequeña herramienta de línea de comandos: un script indexa un directorio de documentos; un segundo lee una pregunta, encuentra los cinco pasajes más cercanos en ChromaDB, los envía a un modelo Mistral a través de Ollama junto con la pregunta y muestra la respuesta seguida de los archivos consultados. Nada sale de la máquina: Ollama sirve el modelo de generación y el modelo de embeddings, y ChromaDB almacena los vectores en un directorio local.
El término «Mistral» se usa con dos sentidos: los modelos de pesos abiertos de Mistral AI, que descargas y ejecutas tú mismo (objeto de esta guía), y las API alojadas de la empresa, que envían tus pasajes a sus servidores. Para documentos confidenciales, solo el primero cumple el requisito de ser «100 % local».
#Qué modelo Mistral elegir para el RAG
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
Un RAG tiene necesidades especiales: el modelo debe seguir una instrucción estricta («responde únicamente a partir de los pasajes»), leer varios pasajes sin perderse y responder en francés. El tamaño importa menos que en una conversación libre; en cambio, la memoria disponible para el contexto es más importante. Los tamaños que aparecen a continuación son los que muestra la biblioteca de Ollama, con la cuantización predeterminada.
| Modelo | Tamaño en Ollama | Contexto anunciado | Para quién |
|---|---|---|---|
| ministral-3:3b | 3,0 GB | 256K | Sin GPU dedicada; respuestas simples, baja tolerancia a instrucciones complejas |
| ministral-3:8b | 6,0 GB | 256K | Opción predeterminada razonable para una tarjeta de 8 a 12 GB o un portátil con 16 GB de memoria |
| ministral-3:14b | 9,1 GB | 256K | Tarjeta de 16 GB, o 12 GB con un contexto moderado |
| mistral-nemo (12B) | ver la página Ollama | 128K | Alternativa más antigua, aún ampliamente utilizada |
| mistral-small3.2:24b | 15 GB | 128K | Tarjeta de 24 GB o memoria unificada de 32 GB o más; el más fiable a la hora de seguir instrucciones de formato |
| mistral (7B, versión 0.3) | 4,4 GB | 32K | Modelo antiguo: reservado para máquinas muy limitadas |
La familia Ministral 3 (3B, 8B y 14B) está publicada bajo licencia Apache 2.0, como indica el anuncio de Mistral 3, y la página de Ollama la describe como diseñada para un despliegue en el borde, capaz de funcionar en una amplia gama de hardware. Mistral Small 4, publicado en 2026 con 119 mil millones de parámetros en total según el nombre de su ficha de Hugging Face, está dirigido a hardware de servidor: no es un candidato para un equipo personal. Para hacerse una idea del orden de magnitud de la memoria necesaria, la calculadora de VRAM del sitio ofrece el tamaño del modelo más la caché de contexto.
#La pila tecnológica
- Generación
- Un modelo Mistral servido por Ollama, a través de la API HTTP local en el puerto 11434.
- Embeddings
- bge-m3 servido por Ollama: la página de la biblioteca lo describe como un modelo de BAAI versátil, multilingüe y con múltiples niveles de granularidad, de 567 millones de parámetros. Evita tener que instalar PyTorch y sentence-transformers.
- Base de datos vectorial
- ChromaDB en modo local (PersistentClient): un directorio, sin servidor. Chroma proporciona un wrapper, OllamaEmbeddingFunction, que llama a la API de embeddings de Ollama.
- Lectura de archivos
- pypdf para PDFs que contienen texto, lectura directa para Markdown y texto plano. Un PDF escaneado es una imagen: primero se necesita reconocimiento de caracteres.
#Preparar el entorno
- 01Instalar Ollama y descargar los modelosInstala Ollama y luego descarga el modelo de generación y el modelo de embeddings con los dos comandos que aparecen a continuación.
- 02Crear el entorno PythonPython 3.10 o superior. Un entorno virtual mantiene las dependencias del proyecto separadas.
- 03Colocar los documentosCopia tus PDF y tus archivos Markdown y de texto en una carpeta docs/ junto a los scripts.
#2. Indexar los documentos en ChromaDB
El script lee cada archivo, divide el texto en fragmentos de aproximadamente 1.800 caracteres cortando entre párrafos, luego los entrega a Chroma, que llama a bge-m3 por Ollama para calcular los vectores. Dos detalles importan: cada fragmento mantiene el nombre del archivo como metadato (para citar la fuente) y los añadidos se realizan por lotes en lugar de uno a la vez.
El uso de upsert con identificadores construidos a partir del nombre de archivo y del número de pasaje permite volver a ejecutar el script: reindexar la misma carpeta actualiza los pasajes en lugar de duplicarlos. Sin embargo, ten en cuenta que, si un documento se acorta, los pasajes antiguos que sobran permanecen en la base de datos; para un cambio importante, elimina la carpeta chroma_db y vuelve a indexar. La elección del tamaño de los pasajes se detalla en la guía sobre estrategias de chunking.
#3. Consultar: búsqueda y después generación
El segundo script incorpora la pregunta, recupera los cinco pasajes más cercanos y construye el prompt. La instrucción es decisiva: pide responder únicamente a partir de los pasajes, reconocer cuando falta información y citar el archivo. El parámetro num_ctx amplía la ventana de contexto: la documentación de Ollama indica que la ventana predeterminada es de 4096 tokens y que la variable OLLAMA_CONTEXT_LENGTH o el parámetro num_ctx la modifican. Con cinco pasajes de 400 a 500 tokens, la instrucción y la respuesta, 4096 tokens están al límite: un contexto demasiado corto se trunca silenciosamente y el modelo responde sin haber leído el final de tus pasajes.
#Verificar lo que devuelve ChromaDB antes de culpar al modelo
Cuando una respuesta es mala, la causa está en uno de dos puntos: la búsqueda no ha recuperado el pasaje correcto o el modelo lo ha usado mal. Puedes distinguir ambos casos mostrando los pasajes recuperados con su distancia, sin llamar al modelo. Si el pasaje correcto no está entre los cinco primeros, cambia la segmentación, añade una búsqueda por palabras clave o un reranker. Si está presente y la respuesta sigue siendo incorrecta, el problema viene del prompt, del contexto truncado o del modelo: prueba un modelo de mayor tamaño antes de sacar conclusiones.
#Presupuesto de memoria: lo que debe caber al mismo tiempo
El RAG hace coexistir dos modelos, el que genera y el que calcula los vectores, además de la caché de contexto del primero. Ollama carga cada modelo bajo demanda y puede liberar de la memoria uno para hacer espacio al otro, lo que añade un retraso en cada cambio si la memoria es escasa. La tabla ofrece un orden de magnitud para tres configuraciones; el tamaño del modelo procede de la biblioteca de Ollama y el resto es un cálculo que hay que afinar con la calculadora de VRAM del sitio.
| Configuración | Peso del modelo de generación | A añadir | Tarjeta objetivo |
|---|---|---|---|
| ministral-3:8b + bge-m3 | 6,0 GB | Caché de contexto, modelo de embeddings (567 millones de parámetros, apenas más de un GB en media precisión), margen del sistema | 8 a 12 GB |
| ministral-3:14b + bge-m3 | 9,1 GB | Ídem; el contexto largo se convierte en el factor limitante con 12 GB | 12 a 16 GB |
| mistral-small3.2:24b + bge-m3 | 15 GB | Lo mismo; prever un margen holgado | 24 GB o más |
#Las trampas que llevan a respuestas que no vienen al caso
- El contexto predeterminado es demasiado corto
- Ver más arriba: si no se aumenta num_ctx, los últimos pasajes se truncan. Síntoma típico: ChromaDB recupera correctamente la respuesta, pero el modelo dice que no la encuentra.
- PDF escaneados
- pypdf solo lee texto ya presente. Un documento escaneado devuelve un resultado vacío: el script lo muestra. Primero procesa el documento con OCR, como se describe en la guía sobre Tesseract.
- Fragmentos sin contexto
- Un fragmento extraído de su documento («el plazo es de 30 días») no indica de qué trata. Antepón a cada fragmento el título del documento o de la sección.
- Pregunta sin respuesta en los documentos
- Sin la instrucción «dilo claramente», un modelo rellena el vacío con lo que sabe. Prueba siempre una pregunta cuya respuesta no esté en tus archivos.
- Identificadores y términos exactos
- Un número de contrato o de expediente no se encuentra bien mediante los embeddings: añade una búsqueda por palabras clave, como se describe en la guía sobre búsqueda híbrida.
#Para ir más allá
| Mejora | Esfuerzo | Cuándo hacerlo |
|---|---|---|
| Aumentar el número de pasajes (k) de 5 a 8 | Una línea | La respuesta se distribuye en varios pasajes |
| Chunking por títulos en lugar de párrafos | Medio | Documentos estructurados (documentación, contratos por artículos) |
| Búsqueda híbrida BM25 + vectorial | Medio | Preguntas por identificador, sigla o nombre propio |
| Reranker (bge-reranker-v2-m3) | Medio | La respuesta correcta se recupera pero se coloca más allá del 5.º puesto |
| Interfaz de chat (Open WebUI, API FastAPI) | Variable | Otras personas deben usar la herramienta |
| Copia de seguridad y reindexación programadas | Bajo | El directorio de documentos evoluciona cada semana |
Cada mejora tiene su propia guía: mide el recall con entre 30 y 50 preguntas reales antes y después, en lugar de acumular técnicas. Si prefieres una interfaz ya preparada sin escribir código, la guía sobre RAG sin programar presenta Open WebUI y AnythingLLM.
#Preguntas frecuentes sobre RAG con Mistral
¿Qué modelo Mistral para un RAG local?+
¿Puede Ollama calcular los embeddings en lugar de sentence-transformers?+
¿Por qué el modelo dice que no encuentra la respuesta si está en mis documentos?+
¿Se puede usar la API Mistral en lugar de Ollama?+
¿Cómo agregar nuevos documentos sin volver a indexarlo todo?+
¿Se necesita un GPU para este RAG?+
- RAG en local con ChromaDB y Ollama: tutorial en Python
- Estrategias de chunking
- Búsqueda híbrida BM25 + vectorial
- Añadir un reranker a tu pipeline
- Calculadora de VRAM
- RAG local con Ollama sin programar
- Fuente: Ollama, ministral-3
- Fuente: Ollama, mistral-small3.2
- Fuente: Ollama, bge-m3
- Fuente: Chroma, embeddings Ollama
- Fuente: preguntas frecuentes de Ollama, ventana de contexto
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.