# Prepara ejemplos revisados para experimentar con un modelo menor

Crea un conjunto JSONL y una evaluación independiente sin presuponer un servicio de entrenamiento de MandAPI.

## Empieza por los datos

La destilación utiliza respuestas de un modelo más capaz para ayudar a entrenar otro. Esta receta cubre un paso previo: preparar ejemplos revisados y un conjunto independiente de evaluación. No entrena, ajusta ni sube modelos mediante MandAPI.

Elige una tarea concreta que puedas evaluar, como responder las preguntas frecuentes de tu negocio. Usa información propia o que tengas derecho a utilizar. Antes de añadir respuestas generadas, comprueba las condiciones del modelo y proveedor para ese entrenamiento; poder consultar un modelo no demuestra que sus respuestas puedan usarse para entrenar otro.

## Crea un corpus pequeño y revisado

Guarda el código como prepare_examples.py y ejecútalo en un directorio de trabajo nuevo. Solo necesita la biblioteca estándar de Python. Las preguntas y respuestas ficticias son ejemplos escritos por una persona, por lo que el script no consulta a ningún modelo profesor.

```python
import json
from pathlib import Path

# Fictional, human-authored FAQ: no model requests or customer records.
examples = [
    {"id": "hours", "question": "What are your hours?", "answer": "Monday to Friday, 09:00-18:00 Mexico City time.", "split": "train"},
    {"id": "delivery", "question": "How long is delivery?", "answer": "Demo delivery takes 2-4 business days after dispatch.", "split": "train"},
    {"id": "refund", "question": "Can you refund my order?", "answer": "Please contact a support person to review the request.", "split": "train"},
    {"id": "tracking", "question": "Where is order 123?", "answer": "A support person must check that order; I cannot look it up.", "split": "holdout"},
]
seen = set()
rows = {"train": [], "holdout": []}
for example in examples:
    question = " ".join(example["question"].split())
    normalized = question.casefold()
    if not question or not example["answer"].strip() or normalized in seen:
        raise ValueError("Empty or duplicate example")
    seen.add(normalized)
    split = example["split"]
    if split not in rows:
        raise ValueError("Unknown split")
    rows[split].append({
        "example_id": example["id"],
        "source": "human-authored-demo-faq-v1",
        "reviewed": True,
        "messages": [
            {"role": "user", "content": question},
            {"role": "assistant", "content": example["answer"]},
        ],
    })

output = Path("distillation-demo")
output.mkdir(exist_ok=False)
for split, records in rows.items():
    with (output / (split + ".jsonl")).open("x", encoding="utf-8") as handle:
        for row in records:
            handle.write(json.dumps(row, ensure_ascii=False) + "\n")
print(json.dumps({name: len(records) for name, records in rows.items()}))
print("Teacher requests: 0. Training jobs: 0.")
```

```powershell
python prepare_examples.py
```

El directorio de salida no debe existir. Cada registro conserva un ID, la versión de su fuente y una marca de revisión junto a la conversación. Es un formato local de revisión; otro proveedor de entrenamiento puede exigir un esquema diferente.

El código rechaza preguntas vacías o duplicadas después de normalizarlas. Las preguntas equivalentes redactadas de otra forma necesitan revisión humana: una comparación de texto no detecta duplicados semánticos.

## Añade candidatos del modelo profesor

Si más adelante generas candidatos con MandAPI, utiliza Chat Completions normal en https://api.mandapi.com/v1, MANDAPI_API_KEY y un MANDAPI_MODEL_ID real. Anota el modelo y la versión del prompt en tu propio registro. Mantén los candidatos fuera del corpus aprobado hasta comprobar hechos, permisos e información privada.

La herramienta o proveedor que elijas para entrenar define el trabajo y su formato de entrada. Esta guía no presupone un endpoint de entrenamiento de MandAPI ni un parámetro del gateway que certifique derechos de uso.

## Evalúa y comprueba el resultado

El script debe producir tres registros de entrenamiento y uno de evaluación, con cero consultas al profesor y cero entrenamientos. Lee ambos JSONL y comprueba las preguntas y respuestas revisadas.

Amplía la evaluación con preguntas inéditas escritas de manera independiente. Mantén juntas las preguntas relacionadas al dividir conjuntos mayores. Compara cualquier modelo menor con el original usando los mismos criterios de hechos y derivación a una persona. Informa resultados medidos y errores; preparar datos no demuestra una mejora de calidad o coste.

## Referencias

- [https://openrouter.ai/docs/cookbook/evaluate-and-optimize/distillation](https://openrouter.ai/docs/cookbook/evaluate-and-optimize/distillation)
- [https://docs.python.org/3/library/json.html](https://docs.python.org/3/library/json.html)
- [https://mandapi.com/en/docs](https://mandapi.com/en/docs)
