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.
- Tus datos llegan en el formato que tengas: ChatML, ShareGPT, Alpaca, CSV o un chat exportado de WhatsApp.
- AstrApp los normaliza a ChatML al importarlos: una lista de mensajes con rol y contenido.
- El chat template del modelo convierte cada conversación en texto con los tokens especiales de esa familia de modelos.
- 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 dato | Qué contiene | Entrenamiento |
|---|---|---|
| Texto crudo | Libros, artículos o documentos sin estructura | Preentrenamiento continuo (CPT) |
| Instrucciones | Una instrucción, una entrada opcional y la respuesta esperada | Fine-tuning supervisado (SFT) |
| Conversaciones | Turnos entre usuario y asistente, con system prompt opcional | Fine-tuning supervisado (SFT) |
| Preferencias | Una pregunta con una respuesta preferida y otra rechazada | Alineació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.
{"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.
| Formato | Estructura | Có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:
{
"instruction": "Clasifica el sentimiento del siguiente texto.",
"input": "El servicio fue excelente, pero el producto llegó dañado.",
"output": "neutral"
}{
"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:
<|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ónde | Extensiones | Qué hace con el archivo |
|---|---|---|
| Datasets › Importar datos | .jsonl, .json, .csv, .txt, .parquet | Detecta el formato, lo normaliza a ChatML y descarta duplicados. Hasta 4 MB por importación. |
| Entrenar › Entrenar modelo, pestaña Subir archivo | .jsonl, .json, .csv | Lo 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_callsyname. - 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
messagescon 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.