Qué pasa si el proveedor cambia mañana
El riesgo de proveedor mide cuánto depende una función de un proveedor que no controlas. Importa porque un proveedor puede caerse, subir un precio o retirar un modelo, y tu función se para o cuesta mucho más.
No puedes quitar la dependencia, pero sí verla, puntuarla y preparar una salida.
Al final de esta lección
Nota
Puedo decir cuánto depende una función de un proveedor y qué no tiene respaldo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Dependencia | algo sin lo que la función no puede trabajar |
| Punto único de fallo | una dependencia sin respaldo |
| Retirada | un proveedor que retira un modelo que usas |
| Tiempo de cambio | los días que lleva sustituir una dependencia |
| Plan de salida | los pasos escritos para dejar un proveedor |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Enumera de qué depende la función
Escribe cada dependencia: el modelo, los datos que lee, las herramientas que llama. De cada una pregúntate tres cosas. ¿Hay respaldo? ¿Cuánto costaría sustituirla? ¿Qué les pasa a los usuarios mientras tanto?
Una dependencia sin respaldo es un punto único de fallo. Puntúala y trabaja desde lo más alto de la lista.
Ejemplo resuelto: dos dependencias
| Dependencia | Peso | Sin respaldo | 60 días para sustituir | Puntos |
|---|---|---|---|---|
| Modelo de chat | 3 | se duplica a 6 | suma 1 | 7 |
| Búsqueda de documentos | 2 | tiene respaldo | solo 10 días | 2 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Planea la salida antes de necesitarla
Un proveedor puede retirar un modelo, cambiar su precio o sufrir una caída larga. Decide ya qué harías: un segundo modelo, una caché, una respuesta más simple o una pausa.
Escribe el plan de salida y prueba la segunda vía de vez en cuando. Un respaldo que nunca ejecutas puede no funcionar el día que hace falta. El módulo sobre coste, trazas y fiabilidad enseña a elegir un respaldo para cada fallo.
Un error frecuente
Advertencia
Mucha gente cree que un proveedor grande no puede fallar, así que no hace falta plan. Los proveedores grandes también se caen, cambian precios y retiran modelos. Juzga cada dependencia por lo que les pasa a tus usuarios cuando desaparece, no por el tamaño del proveedor.
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 la puntuación de dependencias, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '' '// Un diseño inventado: de qué depende la función, si hay respaldo y los días para sustituirlo.' 'const design = [' ' { name: \"Modelo de chat\", kind: \"model\", fallback: false, days: 60 },' ' { name: \"Búsqueda de documentos\", kind: \"data\", fallback: true, days: 10 },' ' { name: \"API de pagos\", kind: \"tool\", fallback: false, days: 20 },' ' { name: \"Voz a texto\", kind: \"model\", fallback: true, days: 45 },' '];' 'const WEIGHT = { model: 3, data: 2, tool: 1 };' > vendor.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 puntuación de dependencias, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function score(d) {' ' let s = WEIGHT[d.kind];' ' if (d.fallback === false) s = s * 2;' ' if (d.days > 30) s = s + 1;' ' return s;' '}' >> vendor.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 puntuación de dependencias, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let total = 0;' ' design.forEach(function (d) {' ' total = total + score(d);' ' console.log(d.name + \": \" + score(d) + (d.fallback ? \"\" : \" SIN RESPALDO\"));' ' });' ' console.log(\"Total: \" + total);' ' const q = \"Enumera tres preguntas cortas para hacer a un proveedor antes de que una función dependa de él.\";' ' const r = await ask([{ role: \"user\", content: q }], \"1. ¿Con cuánto aviso comunicáis un cambio de precio? 2. ¿Cuánto tiempo mantenéis una versión antigua? 3. ¿Cómo exporto mis datos?\", 90);' ' console.log(\"Una lista posible: \" + r.text);' '}' 'main();' >> vendor.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 la puntuación de dependencias
docker exec -w /home/node/project agent node vendor.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una salida posible
| Línea | Qué muestra |
|---|---|
| Modelo de chat: 7 SIN RESPALDO | La puntuación más alta y un punto único de fallo |
| Búsqueda de documentos: 2 | Tiene respaldo y un tiempo de cambio corto |
| API de pagos: 2 SIN RESPALDO | Sin respaldo, pero con poco peso |
| Voz a texto: 4 | Tiene respaldo, pero tarda en reemplazarse |
| Total: 15 | El diseño en conjunto |
| Una lista posible: ... | Tu propia llamada. Cambia en cada ejecución, o dice Muestra grabada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.