Empezar aquí
Índice de la sección

Ejemplos few-shot

Cómo incluir ejemplos de entrada y salida en el prompt, cuántos poner, dónde colocarlos y cómo evitar que el modelo los copie.

Publicado 3 min de lectura

El prompting few-shot consiste en incluir en el prompt varios ejemplos resueltos de la tarea (entrada y salida esperada) para que el modelo infiera el patrón. Es la forma más fiable de comunicar formato, tono y criterio en casos donde describirlos con palabras resulta ambiguo. La capacidad de aprender así, sin reentrenar, se describió en Brown et al., 2020, Language Models are Few-Shot Learners.

Lo contrario es zero-shot: solo instrucciones, sin ejemplos. Empieza por ahí y añade ejemplos cuando las salidas no sean consistentes.

Para practicarlo con ejercicios, ve a Ejemplos few-shot: enseñar con casos.

Cuándo usar ejemplos

SituaciónEjemplosPor qué
Formato peculiar (un estilo de resumen, una plantilla interna)SíUn ejemplo vale más que una especificación larga.
Criterio difuso («urgente» frente a «normal»)Sí, con casos fronteraLos casos límite fijan dónde está la línea.
Tono de marcaSíEl tono se describe mal y se imita bien.
JSON con esquema fijoMejor Salida estructuradaEl esquema garantiza la forma; los ejemplos solo la sugieren.
Tarea que el modelo ya hace bien sin ejemplosNoGastas tokens y puedes sesgarlo.

Dónde ponerlos

Hay dos formas habituales. Las dos funcionan; elige según si los ejemplos son fijos o dependen de la petición.

FormaCómoVentajaInconveniente
En system, con etiquetasBloque <ejemplos> con <ejemplo> dentroFijos, se cachean con el resto del prompt de sistemaTodos los casos ven los mismos ejemplos
Como turnos previosPares user / assistant antes del mensaje realEl modelo los ve como conversación «ya ocurrida»Ocupan historial; menos claros si la conversación sigue
Seleccionados dinámicamenteRecuperas los ejemplos más parecidos a la entrada (con Embeddings)Ejemplos relevantes para cada casoMás infraestructura; rompe la caché si van en system

Cómo elegir los ejemplos

  • Entre 3 y 5 para empezar. Mide con tu conjunto de prueba antes de añadir más; a partir de cierto punto ganas poco y pagas tokens en cada llamada.
  • Variados. Cubre las categorías y longitudes que verás en producción. Si todos los ejemplos son cortos, el modelo acortará.
  • Incluye casos frontera. El ejemplo más útil es el que está cerca de la línea entre dos respuestas.
  • Equilibrados. Si 4 de 5 ejemplos son «normal», el modelo tenderá a «normal».
  • Realistas. Mejor ejemplos sacados de datos reales (anonimizados) que inventados.
  • Correctos. Un ejemplo con un error enseña ese error.

Ejemplo completo

Clasificador de tickets de soporte con ejemplos fijos en system:

import anthropic

MODEL = "claude-sonnet-5-5"
client = anthropic.Anthropic()

SISTEMA = """Clasificas tickets de soporte en una categoría: envio, devolucion, pago, otro.
Responde solo con la categoría, en minúsculas.

<ejemplos>
<ejemplo>
<ticket>Mi pedido lleva 10 días en "en reparto" y no llega.</ticket>
<categoria>envio</categoria>
</ejemplo>
<ejemplo>
<ticket>Me cobrasteis dos veces el mismo pedido.</ticket>
<categoria>pago</categoria>
</ejemplo>
<ejemplo>
<ticket>El libro llegó con la tapa rota, ¿cómo lo cambio?</ticket>
<categoria>devolucion</categoria>
</ejemplo>
<ejemplo>
<ticket>Me devolvieron el dinero de la devolución pero falta el envío.</ticket>
<categoria>pago</categoria>
</ejemplo>
<ejemplo>
<ticket>¿Tenéis tienda física en Valencia?</ticket>
<categoria>otro</categoria>
</ejemplo>
</ejemplos>"""

CATEGORIAS = {"envio", "devolucion", "pago", "otro"}

def clasificar(ticket: str) -> str:
    resp = client.messages.create(
        model=MODEL,
        max_tokens=10,
        system=SISTEMA,
        messages=[{"role": "user", "content": f"<ticket>{ticket}</ticket>"}],
    )
    etiqueta = "".join(b.text for b in resp.content if b.type == "text").strip().lower()
    return etiqueta if etiqueta in CATEGORIAS else "otro"  # valida siempre

print(clasificar("Quiero cambiar la dirección de entrega de mi pedido."))
import Anthropic from "@anthropic-ai/sdk";

const MODEL = "claude-sonnet-5-5";
const client = new Anthropic();

const SISTEMA = `Clasificas tickets de soporte en una categoría: envio, devolucion, pago, otro.
Responde solo con la categoría, en minúsculas.

<ejemplos>
<ejemplo><ticket>Mi pedido lleva 10 días en "en reparto" y no llega.</ticket><categoria>envio</categoria></ejemplo>
<ejemplo><ticket>Me cobrasteis dos veces el mismo pedido.</ticket><categoria>pago</categoria></ejemplo>
<ejemplo><ticket>El libro llegó con la tapa rota, ¿cómo lo cambio?</ticket><categoria>devolucion</categoria></ejemplo>
<ejemplo><ticket>Me devolvieron el dinero de la devolución pero falta el envío.</ticket><categoria>pago</categoria></ejemplo>
<ejemplo><ticket>¿Tenéis tienda física en Valencia?</ticket><categoria>otro</categoria></ejemplo>
</ejemplos>`;

const CATEGORIAS = new Set(["envio", "devolucion", "pago", "otro"]);

async function clasificar(ticket: string): Promise<string> {
  const resp = await client.messages.create({
    model: MODEL,
    max_tokens: 10,
    system: SISTEMA,
    messages: [{ role: "user", content: `<ticket>${ticket}</ticket>` }],
  });
  const etiqueta = resp.content
    .map((b) => (b.type === "text" ? b.text : ""))
    .join("")
    .trim()
    .toLowerCase();
  return CATEGORIAS.has(etiqueta) ? etiqueta : "otro";
}

console.log(await clasificar("Quiero cambiar la dirección de entrega de mi pedido."));
# salida de ejemplo
envio

El cuarto ejemplo es un caso frontera: menciona «devolución» pero el problema es de pago. Ese tipo de ejemplo es el que más mejora la precisión. La receta Clasificar y enrutar tickets de soporte lleva esto a un enrutador completo.

Como turnos previos

La misma idea con pares de mensajes:

mensajes = [
    {"role": "user", "content": "<ticket>Me cobrasteis dos veces.</ticket>"},
    {"role": "assistant", "content": "pago"},
    {"role": "user", "content": "<ticket>¿Tenéis tienda en Valencia?</ticket>"},
    {"role": "assistant", "content": "otro"},
    {"role": "user", "content": f"<ticket>{ticket}</ticket>"},
]

Errores frecuentes

  • El modelo copia los ejemplos. Reutiliza frases, nombres o longitudes. Varía los ejemplos y di explícitamente que son ilustrativos: «sigue el formato, no el contenido».
  • Ejemplos desequilibrados. Sesgan hacia la clase mayoritaria. Cuenta las etiquetas.
  • Ejemplos sin delimitar. Si el modelo no distingue dónde acaba un ejemplo y empieza la tarea real, mezcla. Usa etiquetas.
  • Ejemplos que contradicen las instrucciones. El modelo suele seguir al ejemplo. Revísalos cada vez que cambies una regla.
  • No medir. Añadir ejemplos «por si acaso» sin un conjunto de evaluación es ir a ciegas: Iterar con casos de prueba.

Ver también