Saltar al contenido principal

Datasets y Formatos

Tu modelo es tan bueno como tus datos. Aquí está cómo formatearlos correctamente.

Formatos de Archivo Soportados

AITraining soporta múltiples fuentes de datos:
FormatoCómo Se CargaCaso de Uso
JSONLpandas.read_json(lines=True)Entrenamiento LLM, conversaciones
CSVpandas.read_csv()Clasificación, datos tabulares
HF Dataset IDdatasets.load_dataset()Datasets remotos del Hub
Local HF Datasetload_from_disk()Datasets pre-procesados
Los archivos Parquet son soportados indirectamente a través de datasets HuggingFace que exponen formato Parquet.

Formatos Comunes

CSV (Más Común)

Simple y universal. Funciona para clasificación, regresión y tareas básicas.
text,label
"This product is amazing",positive
"Terrible experience",negative
"Average quality",neutral

JSON/JSONL

Mejor para datos complejos, conversaciones y estructuras anidadas.
{"messages": [
  {"role": "user", "content": "What is Python?"},
  {"role": "assistant", "content": "Python is a programming language"}
]}

Carpetas para Imágenes

Organiza imágenes por categoría:
dataset/
  cats/
    cat1.jpg
    cat2.jpg
  dogs/
    dog1.jpg
    dog2.jpg

Básicos de Calidad de Datos

Balancea Tus Clases

Mal:
  • 1000 ejemplos positivos
  • 50 ejemplos negativos
Bueno:
  • 500 ejemplos positivos
  • 500 ejemplos negativos

Limpia Tus Datos

Elimina:
  • Duplicados
  • Valores vacíos
  • Errores obvios
  • Formato inconsistente

Directrices de Tamaño

Tipo de TareaMínimoBuenoExcelente
Text Classification1001,00010,000+
Image Classification2002,00020,000+
Language Generation505005,000+

Columnas Requeridas por Entrenador

Diferentes entrenadores requieren columnas específicas:
EntrenadorColumnas RequeridasOpcional
sft / defaulttext (o messages)-
dpoprompt, chosen, rejected-
orpoprompt, chosen, rejected-
rewardtext (chosen), rejected-
Si faltan columnas requeridas, obtendrás un error de validación claro listando las columnas faltantes y disponibles.

Formatos Especiales

DPO/ORPO (Datos de Preferencia)

{
  "prompt": "Explain gravity",
  "chosen": "Gravity is a force that attracts objects...",
  "rejected": "gravity is thing that make stuff fall"
}

Token Classification

John    B-PERSON
Smith   I-PERSON
visited O
Paris   B-LOCATION

Formato de Conversación

Las conversaciones esperan listas de objetos {role, content}:
{"messages": [
  {"role": "user", "content": "Hello"},
  {"role": "assistant", "content": "Hi there!"}
]}
O formato ShareGPT (detectado y convertido automáticamente):
{"conversations": [
  {"from": "human", "value": "Hello"},
  {"from": "assistant", "value": "Hi there!"}
]}

Soporte para Rol Tool

AITraining soporta el rol tool para datos de entrenamiento con llamadas a funciones:
{"messages": [
  {"role": "user", "content": "¿Cuánto es 2+2?"},
  {"role": "assistant", "content": "Déjame calcularlo."},
  {"role": "tool", "content": "4"},
  {"role": "assistant", "content": "La respuesta es 4."}
]}
Compatibilidad automática: Para modelos que no soportan el rol tool nativamente (como Gemma), AITraining convierte automáticamente los mensajes tool a mensajes user con el prefijo [Tool Result]. Los modelos con soporte nativo de tool (Llama 3.1+, Qwen, etc.) usan su formato nativo.
Soporte de formato legado: El rol function antiguo de OpenAI (usado antes de que se introdujera tool) también es soportado y manejado de forma idéntica al rol tool.

Tool Calls (Llamadas a Funciones)

AITraining también soporta el campo tool_calls para entrenar modelos a hacer llamadas a funciones:
{"messages": [
  {"role": "user", "content": "¿Cómo está el clima en París?"},
  {
    "role": "assistant",
    "content": "Déjame verificar.",
    "tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"city\": \"Paris\"}"}}]
  },
  {"role": "tool", "content": "Soleado, 20C"},
  {"role": "assistant", "content": "Está soleado y 20C en París."}
]}
Deteccion inteligente de formato: AITraining detecta si tu modelo soporta tool_calls nativamente:
  • Qwen, Llama 3.1+: Usa formato nativo <tool_call>
  • Gemma, modelos antiguos: Serializa tool calls como JSON formato OpenAI en el contenido
En inferencia, parsea el JSON del output del asistente para extraer los tool calls.

Transformacion de Formato de Tool Call

Para modelos sin soporte nativo de herramientas, AITraining serializa los tool calls como JSON formato OpenAI agregado al contenido del asistente: Entrada (mensaje con campo tool_calls):
{
  "role": "assistant",
  "content": "Dejame buscar eso.",
  "tool_calls": [{"id": "call_123", "type": "function", "function": {"name": "search", "arguments": "{\"query\": \"weather\"}"}}]
}
Salida (serializado en contenido):
Dejame buscar eso.
{"content": "Dejame buscar eso.", "tool_calls": [{"id": "call_123", "type": "function", "function": {"name": "search", "arguments": "{\"query\": \"weather\"}"}}]}
El formato serializado preserva la estructura completa de OpenAI con los campos id, type y function. Esto coincide con el formato descrito en las instrucciones del system prompt para mejor aprendizaje del modelo.

Manejo de Alternancia de Mensajes

Algunos modelos (Gemma, Mistral) requieren alternancia estricta user/assistant. AITraining corrige automáticamente problemas comunes: Mensajes consecutivos del mismo rol se fusionan:
// Antes (fallaría en Gemma)
[
  {"role": "assistant", "content": "¡Hola!"},
  {"role": "assistant", "content": "¿Cómo puedo ayudarte?"}
]

// Después (corregido automáticamente)
[
  {"role": "assistant", "content": "¡Hola!\n¿Cómo puedo ayudarte?"}
]
User faltante antes de assistant recibe un placeholder:
// Antes (system → assistant, sin user)
[
  {"role": "system", "content": "Eres útil"},
  {"role": "assistant", "content": "¡Hola!"}
]

// Después (corregido automáticamente)
[
  {"role": "system", "content": "Eres útil"},
  {"role": "user", "content": "[Continued]"},
  {"role": "assistant", "content": "¡Hola!"}
]
Estas correcciones solo se aplican cuando el tokenizador rechaza el formato original. Los modelos que aceptan orden flexible de mensajes mantienen la estructura original.

Conversión Automática de Dataset

AITraining puede detectar y convertir automáticamente formatos comunes de dataset. Sin preprocesamiento manual necesario.

Formatos Soportados

FormatoDetecciónColumnas de Ejemplo
AlpacaAutoinstruction, input, output
ShareGPTAutoconversations con from/value
MessagesAutomessages con role/content
Q&AAutoquestion/answer, query/response
User/AssistantAutouser, assistant
DPOAutoprompt, chosen, rejected
Plain TextAutotext
El mapeo de columnas es opcional - úsalo para convertir nombres de columnas variados al formato esperado.

Usando Auto-Conversión

aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path tatsu-lab/alpaca \
  --auto-convert-dataset \
  --chat-template gemma3 \
  --trainer sft

Chat Templates

Los chat templates formatean tus datos en la estructura de conversación esperada del modelo.
OpciónDescripción
tokenizerUsa el chat template integrado del modelo (predeterminado para SFT/DPO/ORPO)
chatmlFormato estándar ChatML
zephyrFormato Zephyr/Mistral
noneSin template (texto plano)
Los templates se auto-seleccionan basándose en tu entrenador, o especifica manualmente:
--chat-template tokenizer  # Usa template del modelo (recomendado)
--chat-template chatml     # Fuerza ChatML
--chat-template none       # Deshabilita para texto plano
El renderizador unificado aplica templates consistentemente. Las rutas de template legacy todavía son soportadas para compatibilidad hacia atrás.

Extensión de Conversación

Fusiona ejemplos de turno único en conversaciones multi-turno:
aitraining llm --train \
  --model google/gemma-3-270m \
  --data-path ./qa_pairs.jsonl \
  --auto-convert-dataset \
  --conversation-extension 3 \
  --trainer sft

Salida del Dataset Procesado

Después del procesamiento, tu dataset tendrá:
ColumnaDescripción
textDatos de entrenamiento formateados con plantilla de chat aplicada
_original_messagesColumna de mensajes original (preservada para inspección)
_original_*Otras columnas originales renombradas con prefijo
Las columnas originales se renombran a _original_* para prevenir que otras herramientas auto-detecten y usen incorrectamente datos no procesados.

Guardando Datos Procesados

Controla dónde se guardan los datos procesados con --save-processed-data:
OpciónComportamiento
autoGuardar localmente; también subir a Hub si la fuente era de Hub
localGuardar solo en {project}/data_processed/
hubSubir solo a Hub como dataset privado
bothGuardar localmente y subir a Hub
noneNo guardar datos procesados

Consejos Rápidos

  1. Comienza pequeño - Prueba con 100 ejemplos antes de escalar
  2. Valida temprano - Verifica que tu formato funciona antes de recopilar miles de ejemplos
  3. Mantén consistente - Mismo formato en todo tu dataset
  4. Documenta todo - Anota cualquier preprocesamiento o reglas especiales
  5. Usa auto-convert - Deja que AITraining detecte y convierta formatos automáticamente

Próximos Pasos