Prompt, recuperación o ajuste fino: cómo elegir
Hay tres maneras de cambiar una función respaldada por un modelo: un mejor prompt, la recuperación de documentos (RAG) y el ajuste fino (fine-tuning). Arreglan problemas distintos y cuestan muy distinto. Importa porque los equipos suelen elegir primero la más cara.
Un equipo de soporte quiere respuestas con el tono de la casa, según la lista de precios de esta semana y en un formato fijo. Son tres necesidades, y quizá no compartan una misma solución.
Al final de esta lección
Nota
Puedo elegir entre un mejor prompt, la recuperación y el ajuste fino para una necesidad.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Prompt | las instrucciones y ejemplos que se envían con una llamada |
| Recuperación | traer documentos y enviarlos con la llamada |
| Ajuste fino | entrenar más un modelo con tus propios ejemplos |
| Ejemplo de entrenamiento | una entrada unida a la salida que quieres |
| Conocimiento | los hechos de los que depende la respuesta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Aquí no se ejecuta el ajuste fino
Advertencia
El laboratorio no puede ajustar finamente un modelo. Esta lección es un ejercicio de decisión. Da las preguntas que hacer y una regla didáctica. No afirma lo que un ajuste fino lograría para ti: mídelo con tus propios casos.
Pregunta qué clase de problema es
Haz cuatro preguntas en orden. ¿La respuesta depende de hechos privados o cambiantes? ¿El modelo falla en la forma, como el tono o el formato? ¿Has probado un prompt claro con ejemplos? ¿Tienes suficientes ejemplos y una manera de medir?
Los hechos apuntan a la recuperación. La forma apunta primero al prompt, y al ajuste fino solo cuando el prompt falla y existen los ejemplos.
Ejemplo resuelto: cinco necesidades
| Necesidad | Primera pregunta | Primer paso probable |
|---|---|---|
| Un tono cercano | ¿Falla un prompt con ejemplos? | Prompt, y ajuste fino si falla y hay ejemplos |
| Precios que cambian cada semana | ¿Cambian los hechos? | Recuperación: los hechos ajustados caducan |
| Un formato de salida estricto | ¿Pueden mostrarlo los ejemplos? | Prompt, con una comprobación que analice la salida |
| Respuestas de manuales privados | ¿Son privados los hechos? | Recuperación, mostrando las fuentes |
| Un coste menor por llamada | ¿Qué tamaño tiene el prompt? | Medir primero: un prompt más corto o un modelo más pequeño |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Qué cuesta cada opción y qué no arregla
Un prompt es barato de cambiar y fácil de deshacer, pero gasta tokens en cada llamada. La recuperación añade un almacén y una búsqueda, y falla cuando la búsqueda no encuentra. El ajuste fino necesita ejemplos, un entrenamiento y un modelo nuevo que mantener, y no mantiene frescos los hechos.
Ninguna arregla un requisito que falta ni una mala evaluación. Escribe primero los casos que deciden el éxito.
Un error frecuente
Advertencia
Mucha gente cree que el ajuste fino enseña hechos nuevos a un modelo. Sobre todo moldea el estilo y el formato. Los hechos que cambian pertenecen a la recuperación, donde actualizas un documento y la respuesta cambia el mismo día.
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\";' '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 || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' return (await res.json()).choices[0].message.content;' > 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' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' const list = [].concat(sample);' ' const turn = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return list[Math.min(turn, list.length - 1)];' ' }' '}' '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 la regla de decisión, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const cases = [' ' { need: \"un tono cercano\", privateDocs: false, factChanges: false, promptFails: true, examples: 800 },' ' { need: \"precios que cambian cada semana\", privateDocs: false, factChanges: true, promptFails: false, examples: 0 },' ' { need: \"un formato de salida estricto\", privateDocs: false, factChanges: false, promptFails: false, examples: 40 },' ' { need: \"respuestas de nuestros manuales\", privateDocs: true, factChanges: false, promptFails: true, examples: 60 },' ' { need: \"un coste menor por llamada\", privateDocs: false, factChanges: false, promptFails: false, examples: 0 },' '];' > decide.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 la regla de decisión, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function choose(c) {' ' const retrieve = c.privateDocs || c.factChanges;' ' const tune = c.promptFails && c.examples >= 500;' ' if (retrieve && tune) return \"recuperacion y ajuste fino\";' ' if (retrieve) return \"recuperacion\";' ' if (tune) return \"ajuste fino\";' ' if (c.promptFails) return \"reunir ejemplos\";' ' return \"prompt\";' '}' 'cases.forEach(function (c) { console.log(c.need + \":\", choose(c)); });' >> decide.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 la regla de decisión, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const text = \"Responde solo con JSON con las claves producto y precio para: Bicicleta, 120 euros.\";' ' const sample = JSON.stringify({ producto: \"Bicicleta\", precio: 120 });' ' const answer = await ask([{ role: \"user\", content: text }], sample, 40);' ' let valid = true;' ' try { JSON.parse(answer); } catch (error) { valid = false; }' ' console.log(\"Primero el prompt:\", answer);' ' console.log(\"JSON válido:\", valid);' '}' 'main();' >> decide.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Aplica la regla a cinco casos
docker exec -w /home/node/project agent node decide.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La regla es una regla didáctica
El Run aplica una regla fácil de leer, no una medición. El umbral de 500 ejemplos es un número inventado para el ejercicio. Tu propio umbral sale de tus casos y de tu evaluación.
La llamada real prueba primero el paso más barato: un prompt que pide JSON, y luego un análisis para comprobarlo.
Una salida posible
| Línea | Qué muestra |
|---|---|
| un tono cercano: ajuste fino | El prompt falló y hay 800 ejemplos |
| precios que cambian cada semana: recuperacion | Los hechos cambian |
| un coste menor por llamada: prompt | Nada falló, así que mide primero el prompt |
| JSON válido | true o false: la respuesta se analizó, no se leyó |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.