El catálogo de modelos: texto, embeddings, visión, audio e imagen
Workers AI no ejecuta cualquier archivo de pesos: ejecuta un catálogo curado, y saber leerlo es la mitad del trabajo. Las familias por modalidad —LLMs de texto, modelos de embeddings, visión, transcripción de audio y generación de imágenes—, cómo descifrar el identificador de un modelo y qué te dice su tamaño, y sobre todo el criterio para elegir: la tarea manda sobre la moda, y el modelo más grande casi nunca es el más adecuado.
El catálogo es la frontera real de Workers AI: no puedes subir tus propios pesos, así que lo que el catálogo abarca es exactamente lo que la plataforma puede hacer por ti. Leerlo bien no consiste en memorizar identificadores, sino en entender que está organizado por modalidad —qué entra y qué sale— y que dentro de cada modalidad hay una escalera de tamaños que traza la curva entre calidad, latencia y coste. Elegir modelo es, casi siempre, elegir el punto más bajo de esa escalera que todavía resuelve tu problema.
- Reconocer las familias del catálogo por modalidad de entrada y de salida.
- Descifrar el identificador de un modelo y qué anticipa su tamaño y su cuantización.
- Distinguir la tarea de generación de la de representación, y por qué se confunden.
- Aplicar un criterio de elección que priorice la tarea sobre el tamaño.
Las familias, por lo que entra y lo que sale
La forma más útil de ordenar el catálogo no es por proveedor ni por popularidad, sino por la firma de la tarea: qué tipo de dato le das y qué tipo de dato te devuelve. Esa firma determina cómo lo invocas, qué forma tiene la respuesta y con qué otras piezas de la plataforma encaja.
Texto a texto: los LLMs
Generación e instrucciones, desde modelos pequeños de tres a ocho mil millones de parámetros hasta los grandes de setenta. Familias como Llama, Mistral, Qwen, Gemma o los destilados de razonamiento. Es la familia que usarás para redactar, resumir, clasificar con matiz, extraer datos estructurados o conversar.
Texto a vector: los embeddings
Convierten un texto en una lista de números que captura su significado. No generan nada legible: producen la representación con la que después se busca por similitud. Son la puerta de entrada a Vectorize y el primer paso de cualquier arquitectura RAG.
Imagen a texto: la visión
Reciben una imagen junto a una instrucción y responden en texto: describir una foto, leer un documento escaneado, contestar preguntas sobre un gráfico. Los modelos de visión modernos son LLMs con un codificador visual injertado, no una categoría aparte.
Audio a texto: la transcripción
La familia Whisper convierte voz en texto, con detección de idioma y, según la variante, marcas de tiempo por segmento. Es la modalidad que convierte una nota de voz o una llamada en algo que el resto de tu sistema ya sabe procesar.
Texto a imagen: la generación
Modelos de difusión que devuelven bytes de imagen a partir de una descripción. Es la familia con el perfil de coste y latencia más distinto del resto, y la que casi siempre conviene mover fuera del camino de la petición.
Las utilitarias
Traducción entre idiomas, clasificación de sentimiento, y reranking para reordenar resultados de una búsqueda por relevancia real. Modelos pequeños, rápidos y baratos que resuelven de un golpe lo que un LLM haría peor y más caro.
La distinción que más gente confunde al empezar es la de generar frente a representar. Un LLM produce texto nuevo; un modelo de embeddings no produce nada legible, produce coordenadas. Preguntarle a un embedding qué opina de algo no tiene sentido, igual que no lo tiene pedirle a un LLM el vector de un párrafo. Son dos herramientas que se usan juntas —recuperas con embeddings, respondes con un LLM— pero no son intercambiables.
Leer el identificador de un modelo
Los nombres del catálogo siguen una convención que, una vez descifrada, te ahorra buscar la documentación cada vez. Empiezan por @cf, siguen con la organización que publicó el modelo y terminan con el nombre, la versión y una cola de sufijos técnicos.
// @cf / meta / llama-3.1-8b-instruct
// | | | | |
// | | | | +-- afinado para seguir instrucciones
// | | | +-------- 8 mil millones de parametros
// | | +------------- version de la familia
// | +----------------------- organizacion que lo publico
// +------------------------------ ejecutado en la red de Cloudflare
const modelos = {
rapido: "@cf/meta/llama-3.1-8b-instruct",
potente: "@cf/meta/llama-3.3-70b-instruct-fp8-fast",
embeddings: "@cf/baai/bge-m3",
audio: "@cf/openai/whisper-large-v3-turbo",
imagen: "@cf/black-forest-labs/flux-1-schnell",
};
Los sufijos son los que más información densa aportan. El instruct indica que el modelo fue afinado para obedecer instrucciones y conversar, frente a un modelo base que solo continúa texto: para casi todo lo que harás en un Worker, quieres la variante instruct. El fp8 o int8 señala una cuantización, es decir, pesos almacenados con menos precisión numérica: ocupan menos, se ejecutan más rápido y cuestan menos neurons, a cambio de una pérdida de calidad que en la mayoría de tareas resulta imperceptible. Y el fast o turbo marca variantes optimizadas para latencia, la elección natural cuando la respuesta va en el camino de una petición del usuario.
El número de parámetros es la señal más ruidosa de todas, porque invita a leerlo como una puntuación. No lo es. Un modelo de setenta mil millones escribe con más matiz y razona mejor en cadenas largas, pero también tarda varias veces más y consume bastante más presupuesto por invocación. Un modelo de ocho mil millones bien instruido resuelve clasificación, extracción, reformulación y resumen con una calidad indistinguible para el usuario final, en una fracción del tiempo.
Los modelos entran, se actualizan y se retiran del catálogo con bastante frecuencia. Un identificador escrito a mano y repetido en catorce sitios es deuda garantizada. Céntralos en un módulo de constantes, o mejor, en una variable de entorno por rol —el modelo rápido, el potente, el de embeddings— para poder cambiar de modelo con un despliegue de configuración en lugar de un grep desesperado. En el caso de los embeddings hay además una regla dura: cambiar de modelo cambia la dimensión y el espacio del vector, así que obliga a reindexar todo lo que ya habías guardado.
Elegir: la tarea manda sobre el tamaño
El error más común al empezar es partir del modelo más grande disponible y usarlo para todo, porque parece la opción segura. Es exactamente al revés: es la opción cara y lenta que además oculta que muchas de tus tareas ni siquiera necesitaban un LLM. El criterio sano recorre el árbol en el otro sentido, empezando por la naturaleza de la tarea y bajando hasta el modelo más pequeño que la resuelva.
flowchart TD
T[Que necesito hacer] --> A{Que dato entra}
A -->|Audio| W[Modelo de transcripcion]
A -->|Imagen| V[Modelo de vision]
A -->|Texto| B{Que dato sale}
B -->|Una imagen| D[Modelo de difusion]
B -->|Un vector| E[Modelo de embeddings]
B -->|Texto| C{Es una tarea cerrada}
C -->|Si, clasificar o traducir| U[Modelo utilitario pequeno]
C -->|No, razonar o redactar| L[LLM instruct]
L --> S{Va en el camino de la peticion}
S -->|Si| P[Variante pequena o fast]
S -->|No, es diferido| G[Variante grande]
style L fill:#89b4fa,color:#11111b
style E fill:#a6e3a1,color:#11111bEse último nodo del árbol es el que más dinero y más milisegundos ahorra. Si la inferencia ocurre mientras un usuario espera, la latencia es un requisito de producto y debe pesar tanto como la calidad: un modelo pequeño que responde en medio segundo gana casi siempre a uno grande que tarda seis. Si la inferencia es diferida —dentro de una cola, un cron o un Workflow, donde nadie mira el reloj— el argumento se invierte y el modelo grande sale gratis en términos de experiencia.
La disciplina que cierra el criterio es medir en vez de opinar. Escribe una docena de casos representativos de tu tarea, con la salida que considerarías correcta, y pásalos por dos o tres candidatos comparando calidad, tiempo y coste. Es media hora de trabajo que decide bien una elección que, hecha por intuición, arrastrarás durante meses.
Probar antes de comprometerse
Comparar modelos no requiere un banco de pruebas sofisticado. Requiere un puñado de entradas reales de tu dominio —no ejemplos de juguete, sino los mensajes raros, largos y mal escritos que de verdad te llegan— y un bucle que los pase por cada candidato midiendo lo mismo en todos.
const candidatos = [
"@cf/meta/llama-3.1-8b-instruct",
"@cf/mistralai/mistral-small-3.1-24b-instruct",
"@cf/meta/llama-3.3-70b-instruct-fp8-fast",
];
for (const modelo of candidatos) {
for (const caso of casosReales) {
const inicio = Date.now();
const { response } = await env.AI.run(modelo, {
messages: [
{ role: "system", content: instruccion },
{ role: "user", content: caso.entrada },
],
max_tokens: 256,
temperature: 0,
});
resultados.push({
modelo,
caso: caso.id,
ms: Date.now() - inicio,
acierto: response.trim() === caso.esperada,
salida: response,
});
}
}
Tres detalles hacen que esta comparación sea honesta. La temperature a cero elimina la aleatoriedad, de modo que las diferencias que veas son del modelo y no del muestreo. El mismo max_tokens y la misma instrucción para todos evitan comparar peras con manzanas. Y guardar la salida completa, no solo el veredicto, te permite leer en qué se equivoca cada uno: muchas veces descubrirás que el modelo pequeño no falla la tarea sino el formato, y que eso se arregla con dos frases más en el mensaje de sistema en lugar de con un modelo cuatro veces más caro.
Ese archivo de casos con sus salidas esperadas no se tira después de elegir: se queda en el repositorio. Es lo que te dirá si la actualización del catálogo degradó tu tarea, si el cambio que hiciste en el mensaje de sistema mejoró de verdad o solo en el ejemplo que probaste, y si el modelo más barato al que quieres migrar aguanta. En un sistema donde el comportamiento no está garantizado por tipos, un puñado de ejemplos comparables es la única prueba de regresión que existe.
Cuando alguien mira por primera vez el catálogo de Workers AI ve un menú, y el reflejo natural es preguntar cuál es el mejor plato. Es la pregunta equivocada, y sostenerla lleva a arquitecturas caras que funcionan a medias. Lo que el catálogo describe en realidad no son productos compitiendo entre sí, sino una taxonomía de tipos de problema, y esa taxonomía es anterior a Cloudflare y le sobrevivirá: hay problemas cuya solución es generar lenguaje, problemas cuya solución es representar significado como geometría, problemas cuya solución es traducir una modalidad a otra, y problemas cuya solución es reordenar un conjunto según relevancia. Que el catálogo esté organizado por lo que entra y lo que sale no es una comodidad de la documentación, es la estructura profunda del asunto asomando a la superficie. Interiorizar esa taxonomía cambia la manera en que lees un requisito de producto: cuando te piden un buscador que entienda lo que la gente quiere decir, dejas de pensar en cuál es el LLM más listo y empiezas a ver dos piezas distintas, una que convierte textos en vectores para poder encontrarlos y otra que redacta la respuesta una vez encontrados, cada una con su modelo, su coste y su momento. Cuando te piden analizar llamadas de soporte, ves una cadena de modalidades —audio a texto, texto a vector, vector a búsqueda, texto a resumen— donde antes veías una sola caja mágica. Y cuando te piden clasificar comentarios, reconoces una tarea cerrada que un modelo diminuto resuelve en milisegundos y que un LLM de setenta mil millones haría peor, más despacio y por cien veces el precio. Ahí está la asimetría que decide la calidad de un ingeniero en este terreno: quien piensa en modelos persigue el ranking del mes y reescribe su sistema cada vez que sale uno nuevo; quien piensa en modalidades diseña una arquitectura donde el modelo concreto es una constante intercambiable, y las novedades del catálogo dejan de ser una amenaza para convertirse en lo que deberían ser, una mejora que aplicas cambiando una línea de configuración.
- Localiza en el catálogo un modelo de cada familia —texto, embeddings, visión, audio e imagen— y anota su identificador completo.
- Descifra tres identificadores distintos separando organización, versión, tamaño y sufijos, y explica qué anticipa cada sufijo.
- Toma un modelo pequeño y uno grande de la misma familia, pásales la misma instrucción y compara calidad y tiempo de respuesta.
- Escribe un módulo que exporte tus modelos por rol y no por nombre, de forma que cambiarlos sea editar una sola constante.
- Coge tres requisitos reales de un proyecto tuyo y recorre el árbol de decisión con cada uno hasta llegar a una familia concreta.