El modelo más grande no siempre es mejor
Elegir un modelo de lenguaje es hacer coincidir un modelo con una tarea. Los factores son el coste, la velocidad, el tamaño, cuánto texto puede leer y dónde se ejecuta.
Importa porque la elección se repite en cada llamada. Un modelo diez veces más caro de lo necesario, llamado un millón de veces, es una factura enorme sin ningún beneficio.
Al final de esta lección
Nota
Puedo elegir un modelo para una tarea y explicar por qué.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Ventana de contexto | lo más que un modelo puede leer en una llamada |
| Latencia | cuánto esperas la respuesta |
| Precio por token | lo que cuesta cada token, a menudo por millón |
| Alojado | ejecutado por un proveedor, al que se llega por internet |
| Local | ejecutado en tu propia máquina |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cinco cosas que sopesar
Parte de la tarea. Una tarea tiene un tamaño, por ejemplo cuánto texto entra y cuánto sale. Tiene una espera que una persona acepta y un presupuesto.
Después hazle cinco preguntas a cada modelo, como muestra la tabla. Un modelo que falla en una se descarta, aunque sea excelente en las demás.
Las cinco preguntas
| Factor | La pregunta que hacer |
|---|---|
| Coste | ¿Cuánto cuestan los tokens de esta tarea? |
| Velocidad | ¿La respuesta es lo bastante rápida para una persona? |
| Tamaño | ¿Lee todo el texto de la tarea? |
| Calidad | ¿Es lo bastante bueno con mis propios ejemplos? |
| Lugar | ¿Puede el texto salir de mi máquina? |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mide el modelo del laboratorio en dos tareas
docker exec -w /home/node/project agent node -e 'const lab = require("./lab.js"); const asks = [ { name: "corta", max: 10, text: "Di una fruta.", sample: "Una manzana." }, { name: "larga", max: 100, text: "Describe un día de lluvia en tres frases.", sample: "La lluvia golpea el cristal. La calle está gris." }, ]; (async () => { for (const one of asks) { const started = Date.now(); const got = await lab.ask({ max_tokens: one.max, messages: [{ role: "user", content: one.text }] }, one.sample); const ms = Date.now() - started; if (got.label === "Muestra grabada") { console.log(one.name + ": Muestra grabada, sin tiempo medido."); continue; } const used = got.data.usage ? got.data.usage.completion_tokens + " tokens escritos" : "sin cifra de tokens en la respuesta"; console.log(one.name + ": Respuesta del modelo, " + ms + " ms, " + got.text.length + " caracteres, " + used + "."); } })();'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Calcula el coste antes de llamar
Un precio se da por cada millón de tokens: un precio para los tokens de entrada y otro, más alto, para los de salida. El coste de una llamada son dos productos. Los tokens de entrada por el precio de entrada, más los tokens de salida por el precio de salida.
Cuenta los tokens de una tarea típica, calcula una llamada y multiplica por las llamadas que esperas. La lista de precios de aquí es inventada: solo el método es real.
Calcula una tarea con tres modelos inventados
docker exec -w /home/node/project agent node -e '/* Precios inventados, en unidades por cada millón de tokens. */ const models = [ { name: "Pequeño", inPrice: 20, outPrice: 80, delay: 600, context: 8000 }, { name: "Mediano", inPrice: 100, outPrice: 400, delay: 1500, context: 32000 }, { name: "Grande", inPrice: 500, outPrice: 2000, delay: 4000, context: 128000 }, ]; const job = { inTokens: 3000, outTokens: 300, maxDelay: 2000, budget: 0.5 }; console.log("La tarea: " + job.inTokens + " tokens de entrada, " + job.outTokens + " de salida, respuesta en menos de " + job.maxDelay + " ms, presupuesto de 0,5 unidades."); for (const m of models) { const cost = (job.inTokens * m.inPrice + job.outTokens * m.outPrice) / 1000000; const ok = job.inTokens + job.outTokens <= m.context && m.delay <= job.maxDelay && cost <= job.budget; console.log(m.name.padEnd(8) + "coste " + cost.toFixed(3).replace(".", ",") + " unidades, espera " + m.delay + " ms, " + (ok ? "sirve" : "no sirve")); }'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: una tarea, tres modelos
| Modelo | Coste por llamada | Espera | ¿Sirve? |
|---|---|---|---|
| Pequeño | 0,084 unidades | 600 ms | Sí |
| Mediano | 0,420 unidades | 1500 ms | Sí |
| Grande | 2,100 unidades | 4000 ms | No: demasiado lento y demasiado caro (presupuesto de 0,5) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que el modelo más grande es siempre el mejor. Suele ser el más lento y el más caro, y uno pequeño puede valer para una tarea sencilla. Prueba cada modelo con tus propios ejemplos y toma el más barato que supere la prueba.
Dónde se ejecuta cambia las reglas
Un modelo alojado lo ejecuta un proveedor. Envías texto por internet y pagas por token. Un modelo local corre en tu máquina: el texto se queda contigo, pero necesitas el equipo y puede ser más lento.
Una tarea con texto privado puede tener que quedarse en local. Entonces la regla es: el más barato, entre los permitidos.
Para ir más lejos: calcula tu propia tarea
Cambia la tarea del script de costes por una que construirías tú. Indica cuántos tokens entran y salen, y cuánto espera una persona. Ejecútalo.
Escribe qué modelo elegirías y qué factor decidió. Di qué probarías después antes de fiarte de esa elección.