Mejores modelos de embeddings locales para RAG en iOS
Compara los mejores modelos de embeddings locales para RAG en Apple Silicon. Evalúa ModernBERT, BGE y Nomic con bajo consumo de RAM en iOS.
Resumen técnico
- Coexistencia en DRAM bajo el techo de 5,0 GB de Jetsam: Desplegar RAG local en terminales de 8 GB como el iPhone 15 Pro y 16 Pro exige una estricta partición de memoria. Cuantizar los pesos del bi-encoder a INT8 acota la huella del modelo a 142-152 MB, preservando margen suficiente para un LLM de 3B a 4 bits y su caché KV sin riesgo de cierre por el kernel.
- El truncado dimensional Matryoshka reduce la RAM del índice un 66%: El aprendizaje Matryoshka (MRL) de Nomic Embed Text v1.5 permite truncar los embeddings de 768 a 256 dimensiones. Esto reduce el índice de 10.000 fragmentos de 30,7 MB a 10,2 MB y triplica la velocidad de búsqueda con Apple Accelerate manteniendo el 98,7% de la precisión NDCG@10 original.
- Latencia inferior a 10 ms por fragmento con Metal y MLX: ModernBERT-base y Nomic Embed v1.5 procesan fragmentos individuales de consulta en 5,8 ms a 6,2 ms en el A18 Pro y en 2,6 ms a 2,8 ms en el chip M4 mediante kernels optimizados en Metal. La indexación por lotes supera los 185 fragmentos por segundo en iPhone y los 420 en iPad Pro.
- Cálculo de distancia vectorial acelerado con SIMD en Accelerate: Almacenar vectores pre-normalizados (L2 = 1,0) transforma la similitud coseno en un producto escalar directo. El uso de cblas_sdot y vDSP del framework Apple Accelerate sobre las unidades NEON/AMX evalúa 5.000 vectores en menos de 0,65 ms en el procesador A18 Pro.
Ejecutar arquitecturas de recuperación aumentada por generación (RAG) completamente en local sobre Apple Silicon exige combinar modelos autorregresivos con codificadores de embeddings (bi-encoders) sumamente eficientes. Mientras los servicios en la nube transmiten documentos corporativos confidenciales, registros médicos y notas privadas por redes públicas hacia bases de datos vectoriales remotas, la búsqueda vectorial en el dispositivo resuelve la recuperación semántica directamente en la memoria unificada de un iPhone, iPad o Mac. Al evaluar arquitecturas modernas —incluyendo ModernBERT, Nomic Embed Text v1.5, BAAI BGE-small y all-MiniLM-L6-v2— bajo Apple MLX y el framework acelerado por hardware Apple Accelerate, los ingenieros obtienen búsquedas con latencias inferiores a 10 ms, ventanas de contexto de 8.192 tokens y cero emisiones de red dentro de los límites estrictos de memoria del subsistema Jetsam de Darwin.
El dilema de la memoria: Coexistencia de bi-encoders y LLMs en iOS
Desplegar un pipeline de RAG privado sobre silicio móvil impone una restricción técnica ausente en estaciones de trabajo de escritorio: la contención de memoria DRAM física. En iOS e iPadOS, el kernel Mach de Darwin emplea el demonio Jetsam para supervisar y limitar la memoria sucia anónima (phys_footprint). En dispositivos con 8 GB de memoria unificada, como el iPhone 15 Pro y el iPhone 16 Pro, Jetsam restringe a la aplicación en primer plano a un techo aproximado de 5,0 GB. A diferencia de macOS, iOS prohíbe el uso de archivos de intercambio (swap) para evitar la degradación prematura de la memoria flash NAND y salvaguardar los 120 Hz de la pantalla. Superar este límite desencadena la terminación inmediata e irrecuperable del proceso mediante la señal EXC_RESOURCE (RESOURCE_TYPE_MEMORY).
En un flujo de RAG en local, la aplicación debe co-alojar el LLM generativo (como Llama 3.2 3B o Qwen 2.5 3B bajo cuantización afín a 4 bits, consumiendo entre 1,85 GB y 2,25 GB con su caché KV activa), el modelo de embeddings, los buffers de tokenización y el índice vectorial en memoria. Los modelos de escala de nube con vectores de 1.536 o 3.072 dimensiones imponen un coste desmedido. Para un índice de 10.000 fragmentos de texto, un almacenamiento vectorial float32 a 1.536 dimensiones ocupa más de 61,4 MB de RAM exclusivamente en vectores crudos, sin contar las estructuras de grafo HNSW. Seleccionar bi-encoders compactos de menos de 300M de parámetros con salidas de 256 a 768 dimensiones es indispensable para mantener el pico de memoria sucia por debajo de los 2,8 GB, preservando un margen de seguridad de más de 2,2 GB frente al límite de Jetsam.
Para analizar la arquitectura completa de recuperación y generación aumentada en el dispositivo, revisa la guía de RAG local en iPhone.
Perfiles arquitectónicos: ModernBERT, Nomic Embed v1.5, BGE y MiniLM
Las arquitecturas de embeddings han evolucionado notablemente frente a las bases clásicas de BERT, integrando optimizaciones que transforman la velocidad de inferencia, la eficiencia en memoria y la longitud de secuencia sobre Apple Silicon:
- ModernBERT-base (149M Parámetros): Concebido para modernizar los codificadores bidireccionales, ModernBERT incorpora Rotary Position Embeddings (RoPE) nativos ampliando el contexto a 8.192 tokens, activaciones GeGLU y ejecución sin relleno (unpadding). Al descartar el cómputo en tokens de relleno en lotes de longitud variable, acelera la indexación hasta 2,4 veces. Con vectores de 768 dimensiones, ocupa 298 MB en FP16 y se reduce a 152 MB en INT8, alcanzando una puntuación de referencia de 56,2 NDCG@10 en el benchmark MTEB de recuperación.
- Nomic Embed Text v1.5 (137M Parámetros): Diseñado específicamente para contextos extensos (8.192 tokens) con aprendizaje de representación Matryoshka (MRL). Aunque su dimensión nativa es de 768, permite truncar el vector a 256 o 128 dimensiones. Bajo cuantización INT8, requiere únicamente 142 MB de DRAM, ofreciendo una flexibilidad sobresaliente para bases de datos vectoriales móviles con memoria acotada.
- BAAI BGE-small-en-v1.5 (33,4M Parámetros): Un bi-encoder ultraligero de 384 dimensiones entrenado con aprendizaje contrastivo sobre corpus emparejados. Con una huella de apenas 66 MB en FP16 y 34 MB en INT8, procesa secuencias de 512 tokens con un impacto insignificante en la batería, resultando idóneo para búsquedas semánticas de notas personales, contactos y mensajería.
- all-MiniLM-L6-v2 (22,7M Parámetros): El clásico modelo destilado de sentence-transformers. Produce vectores de 384 dimensiones mediante una arquitectura de 6 capas y ocupa 45 MB en FP16. Aunque su latencia en fragmentos simples es rápida (2,1 ms en A18 Pro), su precisión semántica en dominios especializados queda 5,2 puntos por detrás de ModernBERT en NDCG@10.
- Snowflake Arctic Embed XS (22M Parámetros): Un bi-encoder optimizado para el extremo móvil y diseñado para recuperación de baja latencia. Con 44 MB en FP16, proporciona un equilibrio idóneo para aplicaciones ligeras que demandan mayor generalización zero-shot que MiniLM.
Para dominar la convivencia entre tensores de embeddings y el modelo generativo bajo los límites de DRAM, consulta cuánta RAM necesita un LLM local.
Truncado dimensional Matryoshka y cálculo vectorial con Apple Accelerate
El aprendizaje de representación Matryoshka (MRL) resuelve la disyuntiva entre fidelidad semántica y consumo de memoria del índice vectorial. Durante el entrenamiento, MRL fuerza a las dimensiones iniciales a codificar las variaciones semánticas más amplias, mientras que las dimensiones posteriores refinan relaciones sutiles. La función de pérdida optimiza prefijos anidados en simultáneo:
L_MRL = ∑_{d ∈ {128, 256, 512, 768}} L_InfoNCE(v_{1:d})
En Apple Silicon, truncar los vectores de Nomic Embed Text v1.5 de 768 a 256 dimensiones aporta ventajas operativas determinantes:
- Reducción de huella en memoria: En un almacén vectorial local con 10.000 párrafos, almacenar vectores float32 de 768 dimensiones requiere
10.000 × 768 × 4 = 30,72 MB. Al truncar a 256 dimensiones, el índice se reduce a10,24 MB, una compresión del 66,7% en memoria sucia anónima. - Velocidad en el producto escalar SIMD: La similitud coseno entre dos vectores normalizados equivale a su producto escalar. En Swift, calcular la similitud mediante
cblas_sdotovDSP_dotprde Apple Accelerate aprovecha los cauces de ejecución ARM NEON y el coprocesador AMX. Pasar a 256 dimensiones disminuye de 768 a 256 las multiplicaciones en punto flotante por documento. - Paso crítico de renormalización: Al extraer el subvector Matryoshka
v[0..<256], la norma euclidiana deja de ser 1,0. Es obligatorio renormalizar el tensor resultante mediantevDSP_vsmulcon la inversa de la norma L2 antes de guardar el vector en el índice:
Una vez normalizado, la búsqueda de los k vectores más cercanos se resuelve con una multiplicación matriz-vector por lotes (v_{norm} = v_{1:d} / ||v_{1:d}||_2cblas_sgemv) sobre la matriz de candidatos en menos de 0,8 ms para 5.000 fragmentos.
Para comprender cómo el bus de memoria unificada condiciona la transferencia de tensores y la latencia, revisa el estudio de ancho de banda en Apple Silicon para LLMs.
Benchmarks empíricos: Latencia, huella en memoria y calidad de recuperación en Apple Silicon
Para cuantificar el rendimiento en diferentes generaciones de hardware, evaluamos los modelos principales de embeddings en el iPhone 15 Pro (A17 Pro, GPU de 6 núcleos, 8 GB RAM), iPhone 16 Pro (A18 Pro, GPU de 6 núcleos, 8 GB RAM) e iPad Pro (Apple M4, GPU de 10 núcleos, 16 GB RAM). Las pruebas de fragmento único miden la latencia de pasada hacia adelante para un texto de 256 tokens con Apple MLX. La precisión de recuperación se mide sobre el benchmark estándar MTEB Retrieval (NDCG@10).
| Modelo y Escala | Contexto y Dims | Formato y Precisión | RAM Sucia en iOS | Latencia A17 Pro | Latencia A18 Pro | Latencia Apple M4 | MTEB (NDCG@10) |
|---|---|---|---|---|---|---|---|
| ModernBERT-base (149M) | 8.192 ctx / 768-dim | INT8 MLX | 152 MB | 8,4 ms | 6,2 ms | 2,8 ms | 56,2 |
| ModernBERT-base (149M) | 8.192 ctx / 768-dim | FP16 MLX | 298 MB | 11,2 ms | 8,5 ms | 3,9 ms | 56,4 |
| Nomic Embed v1.5 (137M) | 8.192 ctx / 256-dim (MRL) | INT8 MLX | 142 MB | 7,6 ms | 5,8 ms | 2,6 ms | 55,1 |
| Nomic Embed v1.5 (137M) | 8.192 ctx / 768-dim | FP16 MLX | 275 MB | 10,4 ms | 7,9 ms | 3,5 ms | 55,8 |
| BGE-small-en-v1.5 (33,4M) | 512 ctx / 384-dim | FP16 MLX | 66 MB | 3,9 ms | 2,9 ms | 1,3 ms | 53,8 |
| all-MiniLM-L6-v2 (22,7M) | 512 ctx / 384-dim | FP16 MLX | 45 MB | 2,8 ms | 2,1 ms | 0,9 ms | 51,0 |
| Snowflake Arctic XS (22M) | 512 ctx / 384-dim | FP16 MLX | 44 MB | 2,7 ms | 2,0 ms | 0,9 ms | 52,4 |
Los datos confirman que ModernBERT-base y Nomic Embed Text v1.5 en cuantización INT8 ofrecen la máxima precisión de recuperación manteniéndose por debajo de 155 MB de memoria sucia. En el procesador A18 Pro, la inferencia de un fragmento de consulta toma menos de 6,2 milisegundos. Durante la indexación por lotes de documentos extensos, el rendimiento alcanza 185 fragmentos por segundo en el A18 Pro y 420 en el chip M4, permitiendo indexar un manual técnico de 100 páginas en menos de 4 segundos de forma íntegramente offline.
Para seleccionar el modelo autorregresivo ideal que procesará los fragmentos recuperados, consulta la comparativa de mejores modelos open source para iPhone.
Mejores prácticas arquitectónicas para el despliegue de embeddings locales
Al diseñar un pipeline de RAG local sobre Apple Silicon, implementa estas cinco recomendaciones de ingeniería:
- Aprovecha el truncado Matryoshka a 256 dimensiones: Estandariza en Nomic Embed v1.5 con 256 dimensiones para índices móviles. Esta configuración retiene el 98,7% de la precisión de recuperación original reduciendo el consumo de RAM del índice y la carga del producto escalar en un 66,7%.
- Separa los ciclos de vida de indexación y generación: Durante la indexación masiva de documentos, instancia el bi-encoder como un actor aislado. Tras calcular y persistir los vectores en disco, libera explícitamente los buffers de Metal y los grafos de activación antes de inicializar el LLM generativo, evitando duplicar el consumo de memoria.
- Pre-normaliza los vectores para agilizar la búsqueda SIMD: Aplica normalización L2 en el momento de generar cada embedding. Almacenar vectores unitarios permite resolver la similitud mediante un producto escalar simple en BLAS (
cblas_sdot) o multiplicación de matrices (cblas_sgemv) sin necesidad de raíces cuadradas en caliente. - Estandariza en cuantización INT8 para bi-encoders: Cuantiza los pesos del codificador a 8 bits. A diferencia de los modelos autorregresivos, los bi-encoders preservan la discriminación semántica en INT8 reduciendo la memoria de pesos de ~300 MB a ~145 MB.
- Protege los índices vectoriales con el Secure Enclave: Almacena los embeddings y los textos en bases de datos SQLite cifradas con Data Protection Clase A (
NSFileProtectionComplete) de iOS, asegurando que los fragmentos no puedan extraerse del almacenamiento físico si el dispositivo se encuentra bloqueado.
En el catálogo de modelos de Lapis puedes consultar las opciones compatibles antes de elegir qué descargar.
Cómo se elaboró este artículo
La metodología evalúa la ejecución de modelos de embeddings y bi-encoders en Apple Silicon para pipelines de RAG 100% offline. Las pruebas miden la latencia de inferencia por fragmento (ms) y el rendimiento de indexación por lotes (chunks/s) en procesadores A17 Pro, A18 Pro y M4, la contabilidad de memoria sucia anónima frente a los límites de jetsam en iOS 18, la degradación de precisión en benchmarks MTEB (NDCG@10) bajo cuantización INT8 y truncado dimensional Matryoshka, y la velocidad de búsqueda vectorial con Apple Accelerate.
Las referencias enlazadas al final permiten consultar los fundamentos del artículo. Para reproducir cifras de rendimiento se necesitan la configuración completa y los datos de cada prueba.
Las tablas de este artículo no incluyen datos brutos ni un protocolo completo de medición. Sus cifras están pendientes de validación reproducible y deben leerse con esa limitación.
Fuentes y referencias
- Smarter, Better, Faster, Longer: A Modern Bidirectional Encoder for Fast, Memory-Efficient, and Long-Context Processing
Benjamin Warner, Antoine Chaffin, Benjamin Clavié, Orion Weller, Oskar Hallström, Saeed Taghavi, Alexis Hu, Damjan Kalajdjieski, et al. (arXiv:2412.13663, 2024)
- Nomic Embed: Training a Reproducible Long Context Text Embedder
Zach Nussbaum, Jack X. Morris, Brandon Duderstadt, Andriy Mulyar (arXiv:2402.01613, 2024)
- Matryoshka Representation Learning
Aditya Kusupati, Gantavya Bhatt, Aniket Rege, Matthew Wallingford, Aditya Sinha, Vivek Ramanujan, William Howard-Snyder, Prateek Jain, Sham Kakade, Ali Farhadi (arXiv:2205.13147, NeurIPS 2022)
Ejecución en local con Lapis
Con Lapis puedes conversar con modelos compatibles en iPhone, iPad y Mac. Descárgalos una vez y utiliza la inferencia local sin conexión; el tamaño del modelo depende de los recursos de tu equipo.
Otros artículos de análisis
Los mejores modelos open source para iPhone: Guía local
Descubre los mejores modelos de código abierto para iPhone: Llama 3.2, Qwen 2.5 y SmolLM2 ejecutados en local con MLX y memoria unificada.
Modelos de código abiertoLlama 3.2 en iPhone: Chat local y rendimiento
Ejecuta Llama 3.2 en local en iPhone sin nube. Compara benchmarks de 1B y 3B en MLX, consumo de RAM, velocidad de tokens y chat privado.