
Construyendo un dataset de entrenamiento desde las interacciones de tu app
Tu app ya genera los datos de entrenamiento que necesitas para fine-tuning. Como recolectar, limpiar y formatear interacciones de usuarios en un dataset que produce un modelo en el dispositivo de alta calidad.
Los mejores datos de entrenamiento para tu modelo de IA vienen de tu propia app. Las interacciones reales de tus usuarios, preguntas reales y contenido real representan exactamente el dominio que tu modelo necesita aprender. Ningun dato sintetico o dataset publico igualara la calidad de datos de tu caso de uso real.
Esta guia cubre como recolectar, limpiar y formatear esos datos para fine-tuning.
Que cuenta como datos de entrenamiento
Cada interaccion del usuario en tu app es un ejemplo de entrenamiento potencial:
| Tipo de app | Datos crudos | Ejemplo de entrenamiento |
|---|---|---|
| Soporte al cliente | Pregunta del usuario + respuesta del agente | Par de Q&A |
| Notas | Notas del usuario + resumenes auto-generados | Par de resumen |
| Finanzas | Descripcion de transaccion + categoria asignada | Par de clasificacion |
| Correo | Correo entrante + respuesta del usuario | Par de generacion de respuesta |
| E-commerce | Producto + resena del usuario | Par de sentimiento |
| Salud | Descripcion de sintomas + resultado de triaje | Par de clasificacion |
El patron: cualquier par entrada-salida donde la salida "correcta" es conocida (ya sea por accion explicita del usuario o juicio de expertos) es un ejemplo de entrenamiento.
Estrategia de recoleccion de datos
Recoleccion pasiva (Inicio recomendado)
Registra interacciones de usuario que naturalmente producen pares entrada-salida:
- Consultas de busqueda + resultados clickeados: El resultado clickeado es la respuesta "correcta"
- Acciones de categorizacion: Cuando un usuario asigna una categoria a contenido, eso es un ejemplo etiquetado
- Correcciones: Cuando un usuario edita una respuesta generada por IA, la version editada es la salida "correcta"
- Completaciones: Cuando un usuario acepta una sugerencia, eso es un ejemplo positivo
// Registrar correcciones del usuario para datos de entrenamiento
function onAiResponseEdited(original: string, edited: string, context: string) {
logTrainingExample({
input: context,
output: edited, // La correccion del usuario es el objetivo de entrenamiento
source: "user_correction",
timestamp: Date.now(),
});
}
Recoleccion activa
Pide a los usuarios retroalimentacion que directamente produce datos de entrenamiento:
- Pulgar arriba/abajo en respuestas de IA: Filtra las respuestas con pulgar arriba como ejemplos positivos
- Interfaz de correccion: Deja que los usuarios corrijan respuestas de IA; registra las correcciones
- Uso de plantillas: Cuando los usuarios seleccionan y usan una plantilla, la plantilla completada es un ejemplo de entrenamiento
Aumentacion sintetica
Complementa datos reales con ejemplos sinteticos:
- Toma tus mejores ejemplos reales
- Usa un modelo mas grande (GPT-4o, Claude Sonnet) para generar variaciones
- Valida ejemplos sinteticos contra los reales
- Mezcla datos sinteticos y reales (apunta a al menos 30% datos reales)
Privacidad y consentimiento
Requisitos legales
Antes de recolectar cualquier dato de usuario para entrenamiento:
- Actualiza tu politica de privacidad para divulgar que datos de interaccion anonimizados pueden usarse para mejorar funciones de IA
- Obtener consentimiento donde sea requerido (GDPR requiere consentimiento explicito para procesar datos personales)
- Proporciona opcion de exclusion para usuarios que no quieran que sus interacciones se usen para entrenamiento
- Anonimiza datos antes de usarlos para entrenamiento. Remueve nombres, correos, numeros de telefono y otra informacion personal.
Anonimizacion tecnica
import re
def anonymize(text: str) -> str:
# Remover direcciones de correo
text = re.sub(r'\b[\w.-]+@[\w.-]+\.\w+\b', '[EMAIL]', text)
# Remover numeros de telefono
text = re.sub(r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b', '[PHONE]', text)
# Remover nombres (requiere NER o una lista de nombres)
text = replace_names(text, '[NAME]')
return text
Recoleccion en el dispositivo
El enfoque mas seguro: recolecta datos de entrenamiento en el dispositivo y solo transmite datos anonimizados y agregados. La interaccion cruda se queda en el telefono del usuario. Solo el ejemplo de entrenamiento anonimizado sale del dispositivo.
Limpieza de datos
Los datos de interaccion crudos son ruidosos. La limpieza es el paso mas importante del pipeline.
Filtros de calidad
- Elimina ejemplos demasiado cortos: Entradas menores de 10 caracteres o salidas menores de 20 caracteres raramente contienen senal util
- Elimina duplicados: Ejemplos exactos y casi-duplicados agregan ruido
- Elimina errores: Interacciones donde la app se crasheo o el usuario abandono a mitad de flujo
- Elimina fuera de tema: Interacciones que no coinciden con tu tarea objetivo
- Elimina PII que paso la anonimizacion: Segunda pasada con patrones mas estrictos
Puntuacion de calidad
No todos los ejemplos son igualmente utiles. Puntua cada ejemplo:
| Senal | Peso | Razon |
|---|---|---|
| Usuario acepto la respuesta de IA | Alto | Senal positiva directa |
| Usuario edito y luego acepto | Mas alto | La edicion es la salida ideal |
| Usuario rechazo la respuesta de IA | Bajo (usar con moderacion) | Senal negativa, util para contraste |
| Interaccion larga y detallada | Medio | Mas contexto para el modelo |
| Patron de consulta comun | Medio | Los patrones de alta frecuencia importan mas |
Distribucion objetivo
Tu conjunto de entrenamiento debe aproximadamente coincidir con tu distribucion de consultas en produccion. Si el 40% de las consultas de usuario son sobre el tema A y el 10% sobre el tema B, tu conjunto de entrenamiento debe reflejar esa proporcion. Sobre-representar temas raros puede sesgar el modelo.
Formateo para fine-tuning
Formato de chat (Estandar)
La mayoria de frameworks de fine-tuning esperan el formato de chat:
{"messages": [
{"role": "system", "content": "You are an assistant for FitTracker app."},
{"role": "user", "content": "How many calories in a banana?"},
{"role": "assistant", "content": "A medium banana has about 105 calories, 27g carbs, 1.3g protein, and 0.4g fat."}
]}
Conversaciones multi-turno
Para funciones de chat, incluye la conversacion completa:
{"messages": [
{"role": "system", "content": "You are an assistant for FitTracker app."},
{"role": "user", "content": "What should I eat before a workout?"},
{"role": "assistant", "content": "A light meal 1-2 hours before works best. Good options: banana with peanut butter, oatmeal, or a small smoothie. Focus on easily digestible carbs."},
{"role": "user", "content": "What about protein?"},
{"role": "assistant", "content": "Add a small amount of protein: a scoop of whey in your smoothie, Greek yogurt with your oatmeal, or a handful of almonds. Keep it under 20g to avoid feeling heavy during the workout."}
]}
Formato de clasificacion
Para tareas de clasificacion, el formato es mas simple:
{"messages": [
{"role": "user", "content": "Classify: Morning run in the park"},
{"role": "assistant", "content": "Cardio"}
]}
Guia de tamano de dataset
| Tarea | Minimo | Bueno | Excelente |
|---|---|---|---|
| Clasificacion (5-10 categorias) | 200 | 500-1,000 | 2,000+ |
| Q&A (dominio acotado) | 300 | 1,000-2,000 | 3,000+ |
| Chat (multi-turno) | 500 | 2,000-3,000 | 5,000+ |
| Resumen | 300 | 1,000-2,000 | 3,000+ |
| Generacion de contenido | 500 | 1,500-3,000 | 5,000+ |
La calidad importa mas que la cantidad. 500 ejemplos cuidadosamente curados superan a 5,000 ruidosos.
El pipeline
- Instrumenta tu app para registrar interacciones (con consentimiento del usuario)
- Acumula datos durante 2-4 semanas de uso normal
- Exporta y anonimiza las interacciones registradas
- Limpia y filtra usando los criterios de calidad anteriores
- Formatea en la estructura JSON de chat
- Divide en conjuntos de entrenamiento (90%) y evaluacion (10%)
- Fine-tunea usando una plataforma como Ertas: sube el dataset formateado, selecciona tu modelo base, entrena con LoRA, exporta GGUF
- Evalua en el conjunto reservado
- Despliega el modelo GGUF en el dispositivo
- Itera recolectando mas datos y re-entrenando periodicamente
Tu app esta generando datos de entrenamiento ahora mismo. La pregunta es si los estas capturando.
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

Llama 3.2 for Mobile Apps: Fine-Tuning and On-Device Deployment
A complete guide to using Meta's Llama 3.2 1B and 3B models in mobile apps. Fine-tuning with LoRA, exporting to GGUF, and deploying on iOS and Android via llama.cpp.

Gemma 3 for Mobile: Fine-Tuning and On-Device Deployment
How to use Google's Gemma 3 models for on-device mobile AI. Model selection, fine-tuning with LoRA, GGUF export, and deployment via llama.cpp on iOS and Android.

API Logs to Training Data: Using Your Cloud AI History to Fine-Tune
Your existing cloud AI API logs are a ready-made training dataset. How to extract, clean, and format API interaction logs into fine-tuning data for an on-device model.