Los ejemplos enseñan al modelo lo que quieres
Un prompt con ejemplos, o few-shot, lleva dentro unos pocos casos resueltos. El modelo copia el patrón que ve, así que los ejemplos le enseñan tus etiquetas y tu estilo.
Los ejemplos también pueden engañar. Un prompt con cuatro comentarios buenos y uno malo dice que casi todos son buenos.
Al final de esta lección
Nota
Puedo elegir ejemplos que muestren a un modelo lo que quiero.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Ejemplo | una entrada con la respuesta que quieres |
| Etiqueta | la respuesta que lleva un ejemplo |
| Clase | una de las etiquetas que el modelo puede elegir |
| Equilibrio | cada clase aparece más o menos igual |
| Few-shot | un prompt con unos pocos ejemplos |
| Zero-shot | un prompt sin ejemplos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
¿Cuántos ejemplos necesita un prompt?
Sin ejemplos, un modelo usa su idea general de la tarea. Un ejemplo fija el formato. Dos o tres muestran el abanico. Pasados cinco o seis, cada ejemplo suma tokens y casi nada más.
Elige ejemplos distintos entre sí. Tres casi iguales enseñan lo mismo que uno.
Las mismas etiquetas, con y sin equilibrio
| Conjunto | bueno | malo | Qué aprende el modelo |
|---|---|---|---|
| Desequilibrado | 4 | 1 | Casi todo es bueno, así que dice bueno |
| Equilibrado | 2 | 2 | Las dos etiquetas son comunes |
| Falta una clase | 3 | 0 | Un comentario malo no existe |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Escribe el ayudante del modelo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el ayudante del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de ejemplos, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const examples = [' ' { text: \"El autobús llegó puntual\", label: \"bueno\" },' ' { text: \"Me dejé la mochila en el asiento\", label: \"malo\" },' ' { text: \"El conductor fue muy amable\", label: \"bueno\" },' ' { text: \"Viaje rápido y limpio\", label: \"bueno\" },' ' { text: \"El asiento estaba un poco mojado\", label: \"bueno\" },' '];' > ex2.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de ejemplos, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function counts(list) {' ' const out = {};' ' for (const e of list) out[e.label] = (out[e.label] || 0) + 1;' ' return out;' '}' 'function buildPrompt(list, text) {' ' const blocks = list.map(function (e) { return \"Texto: \" + e.text + \"\nEtiqueta: \" + e.label; });' ' blocks.push(\"Texto: \" + text + \"\nEtiqueta:\");' ' return \"Etiqueta cada comentario del autobús como bueno o malo.\n\n\" + blocks.join(\"\n\n\");' '}' >> ex2.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de ejemplos, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const c = counts(examples);' ' console.log(\"recuento: bueno \" + c.bueno + \", malo \" + c.malo);' ' for (const name of Object.keys(c)) {' ' if (c[name] * 2 > examples.length) console.log(\"aviso: \" + name + \" es más de la mitad de los ejemplos\");' ' }' ' const prompt = buildPrompt(examples, \"El conductor fue grosero\");' ' const reply = await ask([{ role: \"user\", content: prompt }], \"malo\", 5);' ' console.log(\"modelo: \" + reply.text);' '}' 'main();' >> ex2.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta y cuenta las etiquetas
docker exec -w /home/node/project agent node ex2.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué imprime el Run
La primera línea cuenta las etiquetas: bueno 4, malo 1. La segunda avisa de que bueno es más de la mitad de los ejemplos. Esa comprobación detecta un conjunto así antes de que llegue a un modelo.
La última línea es una respuesta corta. Sin modelo, antes imprime una Muestra grabada.
Un error frecuente
Advertencia
Mucha gente cree que el orden de los ejemplos no importa. Los modelos suelen fijarse más en el último. Si es uno malo, la entrada nueva tiene más opciones de salir mala. Mezcla las clases para que ninguna vaya siempre al final.