El modelo mayor no siempre es el mejor
Elegir el tamaño de un modelo es hacer coincidir el modelo más pequeño que hace bien una tarea con esa tarea. Un modelo pequeño en una tarea concreta puede igualar a uno grande por una fracción del precio.
Importa porque el precio de cada llamada se acumula, y la espera también. El tamaño adecuado se halla probando, nunca adivinando.
Al final de esta lección
Nota
Puedo elegir el tamaño de un modelo para una tarea a partir de una prueba y un precio.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Tarea concreta | un trabajo pequeño y claro |
| Conjunto de prueba | casos fijos con los que se puntúa un modelo |
| Tasa de aciertos | la parte de casos que un modelo acierta |
| Precio por llamada | lo que cuesta cada petición |
| Suficientemente bueno | una tasa de aciertos que la tarea acepta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Prueba cada tamaño con los mismos casos
Escribe un conjunto de prueba: una lista fija de casos reales de tu tarea, como diez mensajes de clientes que hay que clasificar. Pasa cada tamaño de modelo por los mismos casos y anota acierto o fallo en cada uno.
La tasa de aciertos es la parte que acierta. El módulo 68 trata más a fondo los conjuntos de prueba. Esta lección usa resultados grabados, así que ahora no se ejecuta nada.
Resultados grabados en seis mensajes
| Tamaño | Aciertos de 6 | Tasa de aciertos | Precio por 1000 llamadas |
|---|---|---|---|
| pequeño | 4 | 66,7% | 2 |
| mediano | 5 | 83,3% | 9 |
| grande | 6 | 100% | 40 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira los casos que falla un modelo pequeño
Una tasa de aciertos oculta qué casos fallan. El modelo pequeño de arriba falla los mensajes 5 y 6. Léelos. Si en la vida real son raros, el pequeño puede seguir valiendo.
Después calcula el precio por acierto: el precio dividido entre la parte que aprueba. Un modelo barato que falla a menudo puede salir más caro por acierto que otro más caro.
Un error frecuente
Advertencia
Mucha gente cree que el modelo más grande es la opción segura. Es el más caro y es más lento. Si un tamaño menor aprueba tu propio conjunto de prueba, es suficientemente bueno. Elige el tamaño más barato que aprueba y vuelve a probar cuando cambie la tarea.
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 selector de tamaño, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const recorded = {' ' pequeño: { cost: 2, passed: [1, 1, 1, 1, 0, 0] },' ' mediano: { cost: 9, passed: [1, 1, 1, 1, 1, 0] },' ' grande: { cost: 40, passed: [1, 1, 1, 1, 1, 1] },' '};' 'function wins(m) {' ' return m.passed.reduce(function (a, b) { return a + b; }, 0);' '}' 'function rate(m) {' ' return wins(m) * 100 / m.passed.length;' '}' > choose.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 selector de tamaño, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function perCorrect(m) {' ' return m.cost * m.passed.length / wins(m);' '}' 'function choose(need) {' ' let best = \"ninguno\";' ' let bestCost = Infinity;' ' for (const name of Object.keys(recorded)) {' ' const m = recorded[name];' ' if (rate(m) >= need && m.cost < bestCost) { best = name; bestCost = m.cost; }' ' }' ' return best;' '}' >> choose.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 selector de tamaño, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"Resultados grabados en 6 mensajes (no se ejecutan ahora):\");' ' for (const name of Object.keys(recorded)) {' ' const m = recorded[name];' ' console.log(name + \": \" + rate(m).toFixed(1) + \"% de aciertos, precio \" + m.cost + \", precio por acierto \" + perCorrect(m).toFixed(2));' ' }' ' console.log(\"si hace falta 80%: \" + choose(80) + \" | 95%: \" + choose(95) + \" | 100%: \" + choose(100));' ' const q = \"En una frase corta, ¿por qué probar un modelo pequeño con tus propios casos antes de elegirlo?\";' ' const sample = \"Un modelo pequeño puede ir bien en una tarea concreta, y solo tus casos muestran dónde falla.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> choose.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 el selector de tamaño
docker exec -w /home/node/project agent node choose.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
| Línea | Qué muestra |
|---|---|
| pequeño: 66.7% de aciertos, precio 2, precio por acierto 3.00 | Barato, y no tan caro por acierto como parece |
| grande: 100.0% de aciertos, precio 40, ... 40.00 | Siempre acierta y es el más caro |
| si hace falta 80%: mediano | 95%: grande | La necesidad decide el tamaño |
| el modelo dijo: ... | Una frase. Las palabras cambian en cada ejecución |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.