Arquitectura local de LLM con Ollama, ChromaDB y FastAPI
Ejecutar un modelo en tu propio equipo puede mejorar el control de los datos, permitir trabajo sin conexión y abaratar los experimentos. No convierte automáticamente el servicio en seguro ni listo para producción. Una arquitectura útil separa la API, el runtime de inferencia, el modelo de embeddings, la base vectorial y el ciclo de vida documental; además, hace visibles la latencia, la memoria, los permisos y los fallos.
Publicado el 28 de septiembre de 202614 min de lecturaInferencia privada y RAG
Asigna una responsabilidad clara a cada componente
Mantén operables por separado la ejecución, la recuperación y el contrato de la API
1 / ClienteSolicitud autenticada y entrada limitada.
2 / FastAPIValidación, política, timeout y respuesta.
3 / BúsquedaConsulta Chroma con filtros de origen y cliente.
4 / OllamaEmbeddings y generación en hardware gestionado.
5 / RespuestaContenido fundamentado, citas e ID de trazabilidad.
Separa la indexación de las consultas
La ingesta documental es una tarea controlada: procesa archivos, adjunta metadatos estables de origen y versión, segmenta según la estructura, genera embeddings y guarda IDs deterministas. En cada consulta, autentica al usuario, aplica permisos, genera el embedding con el mismo modelo compatible, recupera un conjunto limitado de pasajes y arma el contexto con referencias. Separar ambos flujos facilita reindexar, reintentar y revisar la calidad.
Usa el mismo modelo de embeddings y el mismo preprocesamiento para indexar y consultar. Cambiar el modelo o las dimensiones es una migración: crea una colección compatible, compara resultados y realiza el cambio de forma deliberada. Guarda versiones, configuración de segmentación y hashes de origen para poder explicar cómo se construyó el corpus.
Trata el límite de FastAPI como una API real
Límite
Decisión operativa
Por qué importa
Entrada
Limitar tamaño, prompt y tipos de archivo
Controla memoria, latencia y abuso
Concurrencia
Semáforo de inferencia o cola de trabajos
Evita agotar RAM/VRAM ante picos
Timeout
Presupuestos separados para búsqueda y generación
Evita conexiones colgadas y fallos impredecibles
Identidad
Autenticar antes de filtrar por cliente
Evita exponer documentos entre usuarios
Observabilidad
ID, modelo, tiempos y estado sin prompts sensibles
Facilita el diagnóstico sin registrar secretos
Usa el ciclo de vida de la aplicación para inicializar clientes compartidos y cerrarlos bien. Evita cargar una copia del modelo por cada worker de la API: a menudo la memoria del modelo es el recurso escaso, no el procesamiento HTTP. Comprueba el despliegue con la configuración exacta de workers y GPU que vas a operar.
Planifica memoria, carga y rendimiento
Los pesos, el contexto, los lotes, las generaciones simultáneas y la búsqueda compiten por recursos. La cuantización puede reducir memoria con un posible coste de calidad; mide la tarea y los tokens por segundo en el hardware objetivo. La carga en frío, la espera en cola y el tiempo de generación son componentes distintos de la latencia. Regístralos por separado.
Limita concurrencia y longitud de cola. Si el usuario puede esperar, devuelve un ID de trabajo y un endpoint de estado en vez de mantener conexiones HTTP ilimitadas. Define qué ocurre si el modelo no está disponible, el disco se llena o el índice se reconstruye. Un servicio local también necesita copias de seguridad de fuentes y metadatos vectoriales, además de una restauración probada.
Local no significa privado por defecto
Vincula los puertos de inferencia y de la base a loopback o a una interfaz privada protegida; no los expongas directamente a internet. Define autenticación, TLS, autorización y límites de tasa en una frontera clara. Mantén las claves fuera del repositorio y limita qué usuarios y procesos acceden al modelo y a los documentos. Revisa también telemetría, informes de fallos, cargas temporales y registros, que pueden filtrar texto sensible.
Los archivos recuperados pueden contener instrucciones maliciosas. Trátalos como contexto no confiable, no habilites herramientas salvo necesidad explícita y nunca permitas que un pasaje otorgue autoridad. Implementa retención y borrado para eliminar coherentemente la fuente y sus fragmentos derivados.
Evalúa el servicio completo
Prepara un conjunto fijo de consultas, fuentes esperadas, requisitos de respuesta y casos de abstención. Prueba recall y ranking por separado de la fundamentación, exactitud de las citas y utilidad. Incluye concurrencia, entradas largas, índice vacío, versiones obsoletas, permisos y reinicios del modelo. Compara cambios de modelo y cuantización tanto en calidad como en operación.
En resumen
Ollama, ChromaDB y FastAPI forman una pila local práctica si separas responsabilidades: la ingesta mantiene el corpus, la búsqueda aplica permisos, la inferencia tiene límites y la API ofrece un contrato fiable. “Local” es una decisión de despliegue, no una garantía de seguridad. Mide calidad, capacidad y recuperación en el equipo y flujo que realmente mantendrás.