Í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.
DocsEl 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ón | Ejemplos | Por 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 frontera | Los casos límite fijan dónde está la línea. |
| Tono de marca | Sí | El tono se describe mal y se imita bien. |
| JSON con esquema fijo | Mejor Salida estructurada | El esquema garantiza la forma; los ejemplos solo la sugieren. |
| Tarea que el modelo ya hace bien sin ejemplos | No | Gastas 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.
| Forma | Cómo | Ventaja | Inconveniente |
|---|---|---|---|
En system, con etiquetas | Bloque <ejemplos> con <ejemplo> dentro | Fijos, se cachean con el resto del prompt de sistema | Todos los casos ven los mismos ejemplos |
| Como turnos previos | Pares user / assistant antes del mensaje real | El modelo los ve como conversación «ya ocurrida» | Ocupan historial; menos claros si la conversación sigue |
| Seleccionados dinámicamente | Recuperas los ejemplos más parecidos a la entrada (con Embeddings) | Ejemplos relevantes para cada caso | Má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
envioEl 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
- Ejemplos few-shot: enseñar con casos: la lección.
- Prompt de sistema: dónde viven los ejemplos fijos.
- Salida estructurada: cuando lo que necesitas es forma garantizada.
- Few-shot y Zero-shot.