AstrApp
Docs

Datasets para fine-tuning

Qué tipo de datos sirve para entrenar, cómo se convierten en texto para el modelo y qué formato espera AstrApp al entrenar.

Qué es un dataset

Una colección de ejemplos del comportamiento que quieres enseñarle al modelo.

Un modelo no lee JSON: lee texto convertido en tokens. Por eso cada ejemplo pasa por varias transformaciones antes de llegar al entrenamiento.

  1. Tus datos llegan en el formato que tengas: ChatML, ShareGPT, Alpaca, CSV o un chat exportado de WhatsApp.
  2. AstrApp los normaliza a ChatML al importarlos: una lista de mensajes con rol y contenido.
  3. El chat template del modelo convierte cada conversación en texto con los tokens especiales de esa familia de modelos.
  4. El tokenizador convierte ese texto en tokens y empieza el entrenamiento.

Tipos de datos por tipo de entrenamiento

Cada técnica de entrenamiento espera un tipo de dato distinto.

Tipo de datoQué contieneEntrenamiento
Texto crudoLibros, artículos o documentos sin estructuraPreentrenamiento continuo (CPT)
InstruccionesUna instrucción, una entrada opcional y la respuesta esperadaFine-tuning supervisado (SFT)
ConversacionesTurnos entre usuario y asistente, con system prompt opcionalFine-tuning supervisado (SFT)
PreferenciasUna pregunta con una respuesta preferida y otra rechazadaAlineación (DPO, RLHF)

En AstrApp

AstrApp hace fine-tuning supervisado (SFT) con conversaciones. No hace preentrenamiento continuo ni alineación por preferencias (DPO, RLHF): las instrucciones y los pares simples se convierten a conversaciones antes de entrenar.

ChatML, el formato de entrenamiento

El formato al que AstrApp convierte todo y el que usa al entrenar.

Cada ejemplo es un objeto con una lista messages. Cada mensaje tiene un role (system, user, assistant o tool) y un content. En un archivo JSONL va un ejemplo por línea.

dataset.jsonl (una línea)
{"messages": [{"role": "system", "content": "Eres el asistente de ventas de una tienda de bicicletas."}, {"role": "user", "content": "¿Cuál es su política de devoluciones?"}, {"role": "assistant", "content": "Aceptamos devoluciones dentro de 30 días con tu ticket de compra."}]}

ChatML con tool calling, thinking y las variantes de salida están en Formatos de importación.

Formatos que AstrApp reconoce

Al importar, AstrApp detecta el formato por el contenido, no por la extensión, y lo convierte a ChatML.

FormatoEstructuraCómo se convierte
ChatML{ messages: [{ role, content }] }Pasa tal cual, con tool_calls y name
ShareGPT{ conversations: [{ from, value }] }human → user, gpt → assistant
Qwen[{ from, value }]Igual que ShareGPT
Alpaca{ instruction, input?, output }instruction + input → user, output → assistant
input / output{ input, output }input → user, output → assistant
prompt / completion{ prompt, completion }prompt → user, completion → assistant

Alpaca, input/output y prompt/completion aceptan además un campo system, que se vuelve el primer mensaje.

Ejemplo: de Alpaca a ChatML

La instrucción y la entrada se unen, separadas por una línea en blanco, en un solo mensaje de usuario:

Antes: Alpaca
{
  "instruction": "Clasifica el sentimiento del siguiente texto.",
  "input": "El servicio fue excelente, pero el producto llegó dañado.",
  "output": "neutral"
}
Después: ChatML
{
  "messages": [
    { "role": "user", "content": "Clasifica el sentimiento del siguiente texto.\n\nEl servicio fue excelente, pero el producto llegó dañado." },
    { "role": "assistant", "content": "neutral" }
  ]
}

Chat templates

Cómo ve el modelo una conversación.

Cada familia de modelos marca los turnos con sus propios tokens especiales: Qwen usa <|im_start|> y <|im_end|>; Mistral usa [INST]. Esa plantilla es el chat template. Así se ve el ejemplo de arriba con la plantilla ChatML:

text
<|im_start|>system
Eres el asistente de ventas de una tienda de bicicletas.<|im_end|>
<|im_start|>user
¿Cuál es su política de devoluciones?<|im_end|>
<|im_start|>assistant
Aceptamos devoluciones dentro de 30 días con tu ticket de compra.<|im_end|>

En AstrApp

No escribes tokens especiales. Tu dataset va en ChatML y train.py aplica el chat template del tokenizador del modelo que elegiste (apply_chat_template).

Archivos que puedes subir

Hay dos lugares para subir datos y no aceptan lo mismo.

DóndeExtensionesQué hace con el archivo
Datasets › Importar datos.jsonl, .json, .csv, .txt, .parquetDetecta el formato, lo normaliza a ChatML y descarta duplicados. Hasta 4 MB por importación.
Entrenar › Entrenar modelo, pestaña Subir archivo.jsonl, .json, .csvLo manda tal cual a la GPU: no lo convierte.

Si subes el archivo en Entrenar modelo, que sea JSONL en ChatML

El entrenamiento lee el archivo como JSONL: una línea por conversación, cada una con messages. Un CSV, un JSON con un arreglo o un JSONL en Alpaca fallan en la validación dentro de la GPU, ya rentada. Para esos formatos, impórtalos primero en Datasets › Importar datos y elígelo en la pestaña Dataset existente.

Los pasos del importador, incluido el CSV y los chats de WhatsApp, están en Importar conversaciones y Importar CSV.

Qué valida AstrApp

Al importar

  • Detecta el formato por el contenido del archivo.
  • Convierte todo a ChatML y conserva tool_calls y name.
  • Descarta conversaciones duplicadas dentro del archivo y contra las que ya tienes en el proyecto. Dos conversaciones que solo difieren en espacios cuentan como duplicadas.

Al entrenar

  • De un dataset existente solo exporta conversaciones válidas con dos mensajes o más.
  • Cada línea debe tener messages con al menos dos mensajes.
  • Con más de 20 líneas inválidas, el entrenamiento se detiene.
  • En el log avisa cuántas conversaciones superan, aproximadamente, el largo máximo de secuencia. Esas se truncan.

¿Qué tan grande debe ser tu dataset?

No hay un número mágico: la calidad pesa más que la cantidad.

  • Empieza con pocos ejemplos buenos. Conversaciones reales y revisadas suelen enseñar más que muchos ejemplos repetitivos.
  • Cubre la variedad real. Incluye los tipos de pregunta, los tonos y los casos difíciles que tu modelo va a encontrar.
  • Mide antes de crecer. Entrena, evalúa con datos que el modelo no vio y agrega ejemplos donde falle.
  • Más datos, más costo. El tiempo de GPU crece con el número de ejemplos, su largo y las epochs.

Datos sintéticos

Cuando tienes pocos ejemplos, un modelo grande puede generar más. Estos son sus usos habituales:

Crear desde cero

Genera conversaciones nuevas cuando todavía no tienes ejemplos reales.

Diversificar

Agrega variedad a tus ejemplos para reducir el overfitting.

Aumentar

Multiplica tus ejemplos reales manteniendo su tema y su estilo.

En AstrApp se hace desde Conversaciones › Síntesis. El detalle está en Sintetizar datos.