
Prueba A/B de API en la nube vs IA en el dispositivo en produccion
Como ejecutar una prueba A/B justa entre tu API en la nube y modelo en el dispositivo en una app movil en vivo. Metricas, diseno de cohortes, significancia estadistica y las metricas que realmente importan.
Tienes una funcion de IA en la nube en produccion. Tienes un modelo fine-tuned en el dispositivo listo para desplegar. Antes de migrar a todos los usuarios, necesitas evidencia de que el modelo en el dispositivo iguala o supera la calidad del modelo en la nube.
Una prueba A/B en produccion te da esa evidencia con usuarios reales, consultas reales y comportamiento real.
Que probar
El objetivo no es probar que el modelo en el dispositivo es "tan bueno" como el modelo en la nube. El objetivo es medir si los usuarios notan o les importa alguna diferencia, y cuantificar las mejoras operativas (latencia, costo, capacidad offline).
Metricas primarias
| Metrica | Por que importa | Como medir |
|---|---|---|
| Tasa de completacion de tarea | El usuario obtuvo lo que necesitaba? | % de interacciones de IA que resultaron en accion del usuario (enviar, guardar, aceptar) |
| Engagement de la funcion (D7/D30) | Los usuarios siguen usando la funcion de IA? | Tasa de retorno a la funcion de IA en 7/30 dias |
| Tiempo a primera accion | La UX es mas rapida o lenta? | Tiempo desde la consulta hasta la siguiente accion del usuario |
| Tasa de error/reintento | La IA falla o frustra? | % de interacciones donde el usuario reintenta o abandona |
Metricas secundarias
| Metrica | Por que importa |
|---|---|
| Latencia (TTFT, respuesta completa) | El dispositivo deberia ganar, pero hay que verificar |
| Costo por usuario | La cohorte nube tiene costos de API; en dispositivo tiene ~$0 |
| Uso offline | La cohorte en dispositivo deberia mostrar uso de IA en condiciones offline |
| Tasa de crashes de la app | La carga del modelo en dispositivo puede causar problemas de memoria |
| Impacto en bateria | La inferencia en dispositivo usa recursos del dispositivo |
Metricas a evitar
Puntuaciones de calidad del modelo (perplejidad, BLEU, ROUGE): A los usuarios no les importa la perplejidad. Les importa si la funcion resolvio su problema. Las metricas de calidad automatizadas son utiles durante el desarrollo pero no como metricas primarias de prueba A/B.
Longitud de respuesta: Mas largo no es mejor. Mas corto no es peor. La longitud es un proxy de nada util.
Diseno de cohortes
Asignacion aleatoria
Asigna usuarios a cohortes en la primera interaccion de IA:
fun getAiCohort(userId: String): AiCohort {
// Hash deterministico asegura que el mismo usuario siempre obtiene la misma cohorte
val hash = userId.hashCode().absoluteValue
return if (hash % 100 < 50) AiCohort.CLOUD else AiCohort.ON_DEVICE
}
Usa el hash del ID de usuario (no aleatorio) para que cada usuario permanezca en su cohorte entre sesiones.
Tamanos de cohorte
| Duracion de prueba | Usuarios por cohorte | Tamano de efecto detectable |
|---|---|---|
| 1 semana | 500 | Diferencia de 10%+ |
| 2 semanas | 1,000 | Diferencia de 5-7% |
| 4 semanas | 2,500 | Diferencia de 3-5% |
Para una division 50/50 con 10K MAU, tienes 5,000 usuarios por cohorte. Dos semanas te dan resultados estadisticamente significativos para diferencias de 5% o mas.
Despliegue gradual
Comienza conservador:
- Semana 1: 10% en dispositivo, 90% nube (detectar crashes y problemas criticos)
- Semana 2: 25% en dispositivo, 75% nube (recopilar metricas iniciales)
- Semana 3-4: 50/50 (prueba A/B completa con poder estadistico)
- Despues de resultados: Escalar a 100% en dispositivo si las metricas pasan
Arquitectura de implementacion
La abstraccion del proveedor de IA
Ambas variantes deben pasar por la misma interfaz:
interface AiProvider {
generate(prompt: string, options: GenerateOptions): Promise<AiResponse>;
isAvailable(): boolean;
}
class CloudProvider implements AiProvider {
async generate(prompt, options) {
const response = await callCloudAPI(prompt, options);
return { text: response.text, source: "cloud", latencyMs: response.latency };
}
isAvailable() { return navigator.onLine; }
}
class OnDeviceProvider implements AiProvider {
async generate(prompt, options) {
const response = await llamaGenerate(prompt, options);
return { text: response.text, source: "on_device", latencyMs: response.latency };
}
isAvailable() { return this.modelLoaded; }
}
Enrutamiento
function getProvider(userId: string): AiProvider {
const cohort = getAiCohort(userId);
if (cohort === "on_device" && onDeviceProvider.isAvailable()) {
return onDeviceProvider;
}
// Respaldo a nube si el modelo en dispositivo no esta cargado aun
return cloudProvider;
}
Registro de eventos
Registra cada interaccion de IA con cohorte y metricas:
function logAiInteraction(event: AiInteractionEvent) {
analytics.track("ai_interaction", {
cohort: event.cohort, // "cloud" o "on_device"
action: event.action, // "generate", "accept", "retry", "abandon"
latency_ttft_ms: event.ttft, // Tiempo al primer token
latency_total_ms: event.total, // Tiempo total de respuesta
tokens_generated: event.tokens,
user_action: event.userAction, // Que hizo el usuario despues (enviar, editar, descartar)
offline: !navigator.onLine,
device_model: getDeviceModel(),
timestamp: Date.now(),
});
}
Analizando resultados
Significancia estadistica
Usa una prueba chi-cuadrado para metricas de tasa (tasa de completacion, tasa de reintento) y una prueba t para metricas continuas (latencia, tiempo a accion).
Nivel de confianza minimo: 95% (p menor a 0.05). Para metricas criticas, usa 99%.
Resultados esperados
Basado en migraciones tipicas de en dispositivo vs nube:
| Metrica | Nube esperado | En dispositivo esperado | Direccion |
|---|---|---|---|
| Latencia (TTFT) | 500-2,000ms | 50-200ms | En dispositivo gana significativamente |
| Tasa de completacion de tarea | Linea base | -2% a +3% | Usualmente comparable |
| Engagement de funcion (D7) | Linea base | +0% a +10% | En dispositivo frecuentemente gana (mas rapido = mas uso) |
| Tasa de reintento | Linea base | -5% a +2% | Usualmente comparable o mejor |
| Uso offline de IA | 0% | 5-15% de sesiones | Nueva capacidad |
| Costo por usuario | $0.05-0.10 | ~$0.00 | En dispositivo gana |
Cuando enviar en dispositivo
Envia si:
- La tasa de completacion de tarea esta dentro del 3% de la nube (no estadisticamente peor)
- Sin aumento en tasa de crashes
- La latencia es mediblemente mejor (esperado)
- El engagement de la funcion es estable o mejorado
No envies si:
- La tasa de completacion de tarea es significativamente menor (caida mayor al 5%)
- La tasa de crashes aumenta (problemas de memoria en algunos dispositivos)
- Los usuarios en la cohorte en dispositivo tienen satisfaccion mediblemente menor
Cuando iterar
Si el modelo en dispositivo tiene menor rendimiento en completacion de tarea pero gana en latencia y engagement, la calidad del modelo necesita mejora. Opciones:
- Agregar mas datos de entrenamiento y re-entrenar
- Cambiar a un modelo mas grande (1B a 3B)
- Mejorar fine-tuning (mas epocas, diferentes hiperparametros)
- Expandir cobertura de datos de entrenamiento para los casos fallidos
Re-ejecuta la prueba A/B con el modelo mejorado.
Casos extremos
Modelo en dispositivo aun no descargado
Los usuarios en la cohorte en dispositivo que no han descargado el modelo aun deben recurrir a la nube. Rastrea cuanto tiempo toma para que la cohorte en dispositivo se active completamente (todos los usuarios tienen el modelo).
Desajuste de capacidad de dispositivo
Algunos dispositivos de usuarios pueden no soportar el modelo en dispositivo (RAM insuficiente). Estos usuarios deben permanecer en la nube independientemente de la asignacion de cohorte. Rastrea que porcentaje de la cohorte en dispositivo recurre a la nube y en que dispositivos.
Comparacion offline
La cohorte en dispositivo tiene una capacidad que la cohorte nube no: IA offline. Rastrea el uso de IA offline por separado. Esto es valor incremental que no aparece en una comparacion directa de calidad.
El caso de negocio
La prueba A/B produce los datos para la decision de migracion:
- Delta de calidad: La experiencia del usuario es equivalente?
- Delta de costo: Cuanto cuesta la cohorte nube por mes?
- Delta de engagement: Los usuarios interactuan mas con IA mas rapida?
- Nueva capacidad: Cuanto uso de IA offline existe?
Para la mayoria de modelos bien fine-tuned, la prueba A/B confirma lo que el equipo de ingenieria espera: calidad equivalente, mejor latencia, cero costo, mas capacidad offline. Los datos hacen que la decision de migracion sea directa.
La calidad del fine-tuning es la variable clave. Plataformas como Ertas habilitan iteracion rapida: re-entrena con datos mejorados, exporta GGUF, despliega a la cohorte en dispositivo y mide de nuevo.
Ship AI that runs on your users' devices.
Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.
Keep reading

Migrating from Cloud API to On-Device AI: The Complete Guide
A step-by-step migration plan for moving your mobile app from cloud AI APIs to on-device inference. Data extraction, fine-tuning, integration, testing, rollout, and monitoring.

How to Add AI to Your Mobile App: A Developer's Decision Guide
A comprehensive guide covering every approach to adding AI features to iOS and Android apps. Cloud APIs, on-device models, and hybrid architectures compared with real cost and performance data.

AI in iOS Apps: CoreML, Cloud APIs, and On-Device LLMs Compared
Three paths to AI in your iOS app. CoreML for Apple's ecosystem, cloud APIs for capability, and on-device LLMs via llama.cpp for cost and privacy. A practical comparison for Swift developers.