Inicio / Blog / LLM local
IA local y arquitectura backend

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.

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ímiteDecisión operativaPor qué importa
EntradaLimitar tamaño, prompt y tipos de archivoControla memoria, latencia y abuso
ConcurrenciaSemáforo de inferencia o cola de trabajosEvita agotar RAM/VRAM ante picos
TimeoutPresupuestos separados para búsqueda y generaciónEvita conexiones colgadas y fallos impredecibles
IdentidadAutenticar antes de filtrar por clienteEvita exponer documentos entre usuarios
ObservabilidadID, modelo, tiempos y estado sin prompts sensiblesFacilita 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.

Referencias