Por qué un modelo no debe cambiar solo
Fijar la versión de un modelo es nombrar la versión exacta que usa una función. Un nombre que siempre significa «la más nueva» no fija nada.
Importa porque una función que el lunes iba bien puede cambiar el martes sin que tú toques nada. Una versión fijada y una comprobación de cada configuración frenan el cambio que nadie eligió.
Al final de esta lección
Nota
Puedo evitar que un modelo cambie bajo una función.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Fijar | nombrar una versión exacta | |
| Alias | un nombre que apunta a una versión que puede moverse | chat-latest |
| Configuración | el archivo que dice qué modelo usa una función | |
| Aviso de retirada | un aviso de que una versión dejará de funcionar | |
| Día de retirada | el día en que una versión deja de responder |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un alias puede moverse, una versión no
Una configuración nombra el modelo al que llama una función. Si dice chat-latest, el proveedor decide qué significa. Un día apunta a una versión nueva.
Si dice chat-v3, significa solo esa versión. La función cambia cuando editas la configuración y no antes.
Ejemplo resuelto: cinco nombres
| Nombre en la configuración | ¿Fijado? | Motivo |
|---|---|---|
| chat-v3 | Sí | Acaba en v y un número entero |
| chat-v10 | Sí | Diez es un número entero |
| chat-latest | No | Latest es una palabra, no un número |
| chat | No | No tiene versión |
| chat-v2b | No | El 2b no es un número entero |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que fijar basta para siempre. Una versión fijada también termina: el proveedor la retira un día fijo. Fijar te da tiempo para pasar a otra a tu ritmo, pero solo si actúas antes del día de retirada.
Un aviso te da un día para cambiar
Un aviso de retirada nombra una versión y su día de retirada. Los días que quedan son ese día menos hoy.
Elige una ventana de aviso, por ejemplo 30 días. Dentro de ella, la función está por retirar: planifica el cambio ya. Desde el día de retirada, ya ha fallado.
Ejemplo resuelto: hoy es el día 100
| Versión | Día de retirada | Días que quedan | Estado con ventana de 30 días |
|---|---|---|---|
| chat-v1 | 90 | -10 | Retirada |
| chat-v2 | 125 | 25 | Por retirar |
| chat-v4 | 300 | 200 | ok |
| chat-v5 | sin aviso | ninguno | ok |
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 comprobador de versiones, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const today = 100;' 'const configs = [' ' { feature: \"resumen\", model: \"chat-v3\" },' ' { feature: \"busqueda\", model: \"chat-latest\" },' ' { feature: \"triaje\", model: \"chat-v2\" },' ' { feature: \"etiquetas\", model: \"chat-v1\" },' ' { feature: \"borrador\", model: \"chat\" },' '];' 'const notices = { \"chat-v2\": 125, \"chat-v1\": 90 };' > pin.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 comprobador de versiones, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pinned(model) {' ' const tail = model.split(\"-\").pop();' ' const rest = tail.slice(1);' ' return tail.length > 1 && tail[0] === \"v\" && String(Number(rest)) === rest;' '}' 'function status(c) {' ' if (pinned(c.model) === false) return \"SIN FIJAR\";' ' const end = notices[c.model];' ' if (end === undefined) return \"ok\";' ' if (end <= today) return \"RETIRADA\";' ' return end - today <= 30 ? \"SE RETIRA en \" + (end - today) + \" días\" : \"ok\";' '}' >> pin.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 comprobador de versiones, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let bad = 0;' ' configs.forEach(function (c) {' ' const s = status(c);' ' if (s > \"ok\" || s < \"ok\") bad = bad + 1;' ' console.log(c.feature + \" \" + c.model + \": \" + s);' ' });' ' console.log(\"necesitan trabajo: \" + bad + \" de \" + configs.length);' ' const q = \"En una frase corta, ¿por qué conviene fijar un modelo a una versión?\";' ' const sample = \"Una versión fijada no puede cambiar bajo la función, así que tú decides cuándo pasar a otra.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> pin.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 comprobador de versiones
docker exec -w /home/node/project agent node pin.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que imprime el comprobador
| Línea | Qué muestra |
|---|---|
| resumen chat-v3: ok | Fijado y sin aviso |
| busqueda chat-latest: SIN FIJAR | Un alias, así que puede moverse |
| triaje chat-v2: SE RETIRA en 25 días | Fijado, pero el final se acerca |
| etiquetas chat-v1: RETIRADA | Pasó su día de retirada |
| borrador chat: SIN FIJAR | No tiene versión |
| necesitan trabajo: 4 de 5 | Contado con reglas, no con un modelo |
| el modelo dijo: ... | Una frase del laboratorio. Una muestra grabada si ningún modelo responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.