Author: Dominicode

  • Cómo explicar IA a tu jefe: 6 frases que acaban en tu sprint

    Cómo explicar IA a tu jefe: 6 frases que acaban en tu sprint

    La reunión duró cuarenta minutos. Al final, el director de producto lo cerró con una frase: "entonces montamos un agente que conteste con nuestra documentación y que no se invente nada, para el sprint que viene".

    Todo el mundo asintió. Yo también asentí, y ese fue mi error.

    En esa frase había tres proyectos distintos, un criterio de aceptación imposible de cumplir y una fecha. Lo que aprendí ese trimestre es que explicar IA a negocio no es un favor que le haces a tu jefe: es una tarea técnica que, si no haces, la pagas tú.

    Resumen rápido

    Explicar IA a negocio no consiste en corregir términos: consiste en convertir cada frase de la reunión en una decisión escrita antes de que llegue al sprint como alcance. Seis frases hacen casi todo el daño: "es solo un prompt", "necesitamos un agente", "entrénalo con nuestros datos", "que no alucine", "con IA iremos mucho más rápido" y "¿esto ya está en producción?". El método son cuatro pasos: traduce a decisión y no a definición, pon el tradeoff con números aunque sean aproximados, deja la decisión escrita y pelea el alcance en lugar de la palabra.

    El malentendido no se queda en la reunión: acaba en el alcance de tu sprint

    Cuando alguien de negocio usa mal un término técnico, tú y yo hacemos lo mismo: dejarlo pasar. No es el momento, se entiende por el contexto.

    El problema es que en proyectos de IA los términos no son adorno. Son alcance.

    "Agente" no describe una feature: describe un sistema con permisos y modos de fallo propios. "Que no alucine" no es un requisito: es una promesa que nadie puede firmar. Y las dos acaban redactadas como criterios de aceptación por alguien que no tenía por qué saber lo que esas dos palabras arrastran.

    Heredas el malentendido convertido en alcance. Y el alcance, a diferencia de la palabra, tiene fecha.

    Las definiciones limpias están en el diccionario de términos de IA y puedes mandar ahí a quien pregunte. Aquí van las seis frases y la factura que te llega cuando nadie las traduce.

    Traducir IA a negocio: las seis frases y lo que cuestan

    Estas son las seis frases que más veces he oído en reuniones de proyecto de IA, lo que cree quien las dice y la factura concreta que llega al sprint:

    Lo que dice Lo que cree que significa Lo que te llega al sprint
    "Es solo un prompt" Una frase bien escrita, medio día La estimación dividida entre tres
    "Necesitamos un agente" Un chat con botones Un sistema con permisos sobre datos reales
    "Entrénalo con nuestros datos" Que el modelo aprenda de sus PDF Semanas en el proyecto equivocado
    "Que no alucine" Un bug que se arregla Un criterio de aceptación que no cierra nunca
    "Con IA iremos mucho más rápido" El mismo trabajo en menos tiempo Fechas puestas sobre una cifra que nadie midió
    "¿Esto ya está en producción?" Si responde, está terminado Tú eres el sistema de evaluación, en tu tiempo

    "Es solo un prompt" — por qué la estimación se te va al triple

    Cree que el trabajo es redactar bien una instrucción. Medio día, uno si hay que probar variantes.

    El prompt es la pieza pequeña. Alrededor va el contexto que le pasas, las herramientas que puede llamar, qué ocurre cuando devuelve basura y cómo compruebas que la semana que viene sigue funcionando igual. Todo eso junto es lo que conté en por qué un LLM por sí solo no es un producto.

    El coste llega en la estimación: dijiste dos días pensando en la instrucción, y el ticket incluía en silencio todo lo demás. Cuando pides más tiempo, la conversación ya no es "el problema era más grande", es "¿por qué tardas el triple en escribir una frase?".

    "Necesitamos un agente" — qué te están pidiendo en realidad

    Cree que es un chat con botones que contesta en lenguaje natural.

    De verdad es un bucle que decide por su cuenta, llama herramientas y tiene permisos sobre sistemas reales. La distancia entre las dos cosas la desarrollé en IA generativa vs IA agéntica, y es la distancia entre dos presupuestos.

    El coste es que diste una estimación para un envoltorio de chat y te han pedido un sistema que actúa solo. Y "actúa" arrastra preguntas que no estaban en el ticket: sobre qué puede escribir, quién lo autoriza, cómo se detiene a mitad de ejecución, qué queda auditado.

    Ninguna cabe en el sprint que ya tenía fecha antes de que existieran.

    "Entrénalo con nuestros datos" — semanas en el proyecto equivocado

    Cree que toca fine-tuning: echarle los PDF de la empresa al modelo y que aprenda.

    Casi siempre lo que quiere es que el sistema busque en sus documentos antes de responder. Cuál toca en cada caso lo conté en RAG vs fine-tuning vs contexto.

    El coste son semanas en el proyecto equivocado. Y lo peor no es el tiempo: después nadie lo lee como un malentendido de alcance, se lee como que "la IA no funcionó" y que el que la montó fuiste tú.

    La versión hermana es "ponle memoria", que para quien lo dice significa acordarse de todo para siempre. Debajo hay ventana de contexto y coste por token. Si no sale antes, eliges arquitectura para sostener una expectativa que nadie revisó.

    "Que no alucine" — el criterio de aceptación que no cierra nunca

    Cree que es un bug: se abre ticket, se arregla, se cierra.

    Es consecuencia de cómo funciona el modelo. Se acota con límites de dominio, verificación y citas, y se reduce mucho. No se elimina. El porqué está en por qué la IA se inventa cosas.

    Este es el más caro de la lista por una razón concreta: se escribe. "El sistema no debe dar información incorrecta" aterriza tal cual como criterio de aceptación, y es una casilla que no vas a marcar nunca. No porque sea difícil: porque no se puede demostrar sobre entradas que no controlas. En la demo funciona y en la retro siguiente alguien trae un caso.

    Te quedas como responsable indefinido de algo que, por diseño, no tiene línea de meta.

    "Con IA iremos mucho más rápido" — la cifra que nadie midió

    Cree que es el mismo trabajo en menos tiempo.

    La IA mueve el cuello de botella: escribir código deja de ser lo caro, y especificar y revisar código que no escribiste pasan a serlo. Es lo que más ha cambiado en 15 años programando, y revisar es trabajo aunque no aparezca en ningún tablero.

    El coste son fechas puestas sobre una cifra que nadie midió. Nadie dice en voz alta "asumamos que iremos un 40% más rápido": se asume en silencio y aparece en el roadmap.

    Y cuando alguien lo mide en serio, el resultado incomoda. En el ensayo controlado de METR, 16 developers open-source experimentados resolvieron 246 tareas con y sin IA: creyeron que habían ido un 20 % más rápidos y en realidad tardaron un 19 % más. Cuidado con usar ese dato como arma, porque el propio METR lo da hoy por histórico —las herramientas eran de principios de 2025— y sirve justo para lo contrario de lo que parece: si los únicos que lo midieron con rigor ya no dan su número por vigente, nadie debería estar poniendo fechas sobre uno inventado.

    Sin medición no hay defensa: si el trimestre se cumple, la IA funcionó; si no, el equipo no la supo aprovechar. Lo único que rompe el bucle es llegar con números propios, y de eso va cómo medir la productividad en equipos que usan IA.

    "¿Esto ya está en producción?" — sin evals, el sistema de evaluación eres tú

    Cree que si responde bien en la demo, está terminado.

    Sin evals automáticos, que son los unit tests de un sistema con LLM, ni observabilidad, no sabes si funciona. Sabes que no ha explotado delante de ti todavía.

    El coste es el más silencioso de todos: tú eres el sistema de evaluación. Cada ajuste de prompt, cada versión nueva del modelo, cada caso raro que reporta un cliente pasa por tu criterio, a mano. Ese trabajo no está en ninguna planificación y crece con el uso: cuanto mejor le va al producto, más de tu tiempo se come mantenerlo respirando.

    Cómo explicar IA a tu jefe sin quedar de listo

    Tener razón no sirve de nada si la forma de decirlo te deja fuera de la conversación. Quien pide esto tiene su propia fecha encima. Cuatro cosas que funcionan.

    1. Traduce a decisión, no a definición. No expliques qué es un agente. Pregunta: "cuando dices agente, ¿quieres que actúe solo o que responda cuando le preguntan?". La definición no cambia nada; esa respuesta cambia el proyecto. Y la contesta él, así que la decisión sigue siendo suya.

    2. Pon el tradeoff con números, aunque sean aproximados. "Dos semanas si solo responde, seis si actúa solo" convierte un debate de palabras en una elección con precio. Da siempre rango y nunca una fecha suelta: la fecha se te queda pegada. Y si puedes, remata con la versión pequeña: "el día 12 tienes la que responde y cita fuentes; la que actúa sola es otra conversación". No estás negociando el alcance desde arriba, estás poniendo algo antes sobre la mesa. Con eso discute muchísima menos gente.

    3. Deja la decisión escrita. No hace falta un documento formal: dos líneas en el ticket o un correo con copia a los que estaban en la reunión. No es para tener razón después, sino para que el malentendido salga antes de escribir código. Si ahí pone "el sistema responde consultas, no ejecuta acciones sobre datos de cliente", quien lo lee contesta "espera, yo quería que ejecutara". Y te lo dice el martes, no en la demo del mes que viene. Ese es el argumento real para trabajar con especificaciones y la base del libro de Spec-Driven Development.

    4. No pelees la palabra, pelea el alcance. Da igual cómo lo llame. Lo que tiene que quedar fijado por escrito es qué hace, con qué permisos y qué pasa cuando falla. Esas tres cosas son el contrato; el término es decoración.

    Y si te toca opinar antes de que se apruebe el proyecto, ahí van cinco preguntas antes de aprobar un proyecto de IA.

    Explicar IA a negocio es parte de tu trabajo técnico

    Lo que cambió con la IA es el margen entre lo que negocio cree que pide y lo que hay que construir. Ese margen lo pagas tú en horas.

    Mañana, en la próxima reunión donde suelten una de estas seis frases, no la corrijas. Haz una pregunta que fuerce una decisión y escribe la respuesta en el ticket con las palabras de quien la dijo.

    Con eso dejas de heredar el malentendido. Y en un proyecto de IA, eso es la mitad del trabajo.

    Estas conversaciones, sobre proyectos reales, pasan cada semana en Dominicode Labs.

    Preguntas frecuentes

    ¿Cómo explico un proyecto de IA a mi jefe?

    No lo expliques: conviértelo en una decisión suya. Pregunta si el sistema tiene que actuar por su cuenta o solo responder cuando le preguntan, pon precio a cada opción en la misma frase ("dos semanas si solo responde, seis si actúa solo") y escribe la respuesta en el ticket con sus palabras. La definición no cambia nada; esa decisión cambia el proyecto entero.

    ¿No es el trabajo de mi jefe entender lo que pide?

    Entenderlo es su trabajo, sí, pero el coste de que no lo entienda cae en tu calendario, no en el suyo. Traducir hacia arriba no es un favor: es proteger tu propia estimación, y es una habilidad senior tan real como diseñar el sistema.

    ¿Cómo explico que "que no alucine" no es un requisito válido sin sonar a excusa?

    No discutas el requisito: propón otro que sí se pueda verificar. Cambia "no debe dar información incorrecta" por "toda respuesta cita el fragmento del que sale, y si la búsqueda no devuelve nada, el sistema responde que no lo sabe".

    Que eso último lo decida la búsqueda y no el modelo es lo que lo hace comprobable. Y añade la segunda mitad antes de que te la traigan ellos: sobre una lista fija de preguntas, alguien revisa que el fragmento citado sostenga la respuesta. Citar el documento correcto y tergiversarlo también es fallar.

    ¿Qué pregunto exactamente cuando alguien dice "necesitamos un agente"?

    Pregunta una sola cosa: "¿quieres que actúe por su cuenta o que responda cuando le preguntan?". Si contesta que actúe, encadena tres más: sobre qué sistemas puede escribir, quién lo autoriza y qué pasa cuando se equivoca. Esas cuatro respuestas son el alcance real.

    ¿Cómo sé si me están pidiendo fine-tuning o búsqueda sobre documentos?

    Pregunta qué pasa cuando el documento cambia. Si la respuesta es "tiene que responder con la versión nueva ya", están describiendo búsqueda sobre documentos, no entrenamiento. El fine-tuning ajusta cómo responde el modelo; si metes ahí información que cambia cada semana, te toca reentrenar cada semana.

    ¿Cómo estimo si negocio aún no ha decidido si el sistema actúa o solo responde?

    No estimes el proyecto: estima las dos versiones. Un rango para la que solo responde y otro para la que actúa sobre datos reales, con la diferencia en una línea. Así la fecha queda atada a esa decisión y no a tu velocidad.

    ¿Y si mi jefe se molesta cuando le matizo un término?

    No corrijas la palabra y ese roce casi nunca aparece. Lleva la conversación a qué hace el sistema, con qué permisos y qué ocurre cuando falla, y deja que él lo llame como quiera.

    Y si ya se ha molestado, no lo resuelvas en la reunión. Escríbele después el comportamiento que entendiste, con sus palabras, y pregúntale si es eso. Cuesta mucho ofenderse con alguien que te está confirmando lo que pediste.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Tokens en español: por qué cuestan un 26 % más que en inglés

    Tokens en español: por qué cuestan un 26 % más que en inglés

    Hace unas semanas revisé el consumo de API de un agente de soporte. Sonnet, 25.000 conversaciones al mes, prompts cortos, nada exótico. El equipo había estimado el coste a mano antes de lanzar y la factura llegó cerca de un 26 % por encima.

    Estuvimos media hora buscando la llamada duplicada. No había llamada duplicada.

    El problema eran los tokens en español. No porque un token en español cueste más —el precio por token es idéntico—, sino porque necesitas más tokens para decir exactamente lo mismo.

    Y la parte incómoda es por qué necesitas más. La respuesta cómoda es "el español es más largo". Esa respuesta no llega a explicar ni la mitad de lo que pasa.

    Lo medí.

    La respuesta corta: el español consume un 26,0 % más de tokens que el inglés para transmitir el mismo mensaje, medido sobre cinco pares de textos paralelos con o200k_base (GPT-4o / GPT-5). Unos 10 puntos vienen de que el español usa más palabras; el resto, de que el tokenizador parte cada palabra española en más trozos. El precio por token es idéntico en los dos idiomas: lo que cambia es cuántos necesitas.

    Medí los tokens en español de cinco textos reales

    Cogí cinco textos del tipo que de verdad mandas a un modelo en producción y escribí la versión española y la inglesa de cada uno, con el mismo significado y el mismo registro. Nada de traducciones infladas: pares paralelos.

    Luego los pasé en local por o200k_base, el tokenizador de la familia GPT-4o / GPT-5.

    Tabla 1 — Sobrecoste de tokens del español frente al inglés en cinco pares de textos paralelos, medidos con o200k_base. Medición propia de Dominicode, julio de 2026.

    Tipo de texto Tokens EN Tokens ES Sobrecoste ES vs EN
    System prompt de agente 74 86 +16,2 %
    Documentación técnica 62 85 +37,1 %
    Mensaje de un usuario (soporte) 65 73 +12,3 %
    Fragmento de base de conocimiento (RAG) 67 93 +38,8 %
    Prompt de tarea de desarrollo 55 70 +27,3 %
    Total 323 407 +26,0 %

    El español consume un 26,0 % más de tokens que el inglés para decir exactamente lo mismo. No es una anécdota: es un multiplicador que se aplica a cada llamada de tu aplicación, todos los días.

    Y fíjate en la dispersión, porque ahí está la parte accionable: el mensaje de un usuario se hincha un 12,3 %; un fragmento de base de conocimiento, un 38,8 %. Tres veces más de castigo según el tipo de texto.

    No es que hables más. Es que te parten peor.

    Descompongo ese +26 % en sus dos factores:

    • Palabras: 290 en inglés → 319 en español = +10,0 %
    • Tokens por palabra: 1,114 en inglés → 1,276 en español = +14,5 %. O sin decimales, por si se lee mejor: 111 tokens por cada 100 palabras inglesas frente a 128 por cada 100 españolas.

    Y los dos factores se multiplican, no se suman: 1,10 × 1,145 = 1,26. Ahí está el +26 % completo.

    Traducido: de los 26 puntos de sobrecoste, solo unos 10 vienen de que el español use más palabras. El resto viene de que cada palabra española se rompe en más trozos.

    Esto no es una queja sobre el idioma, es ingeniería. El vocabulario de un tokenizador BPE se construye por estadística sobre un corpus mayoritariamente inglés, así que las secuencias frecuentes en inglés se quedan con las plazas buenas: una palabra inglesa común entra entera en un token y su equivalente española entra a trozos. Súmale que el español conjuga y deriva mucho más, y cada variante es una cadena distinta que el tokenizador no tiene memorizada.

    Eso explica también la dispersión de la tabla. Los dos que menos se inflan son el mensaje de usuario (+12,3 %) y el system prompt (+16,2 %): frases cortas, vocabulario común y terminología técnica que el tokenizador reconoce igual en los dos idiomas. Los que más se inflan son la documentación (+37,1 %) y los fragmentos de RAG (+38,8 %), que llevan prosa española de verdad, con subordinadas y nominalizaciones largas de las de "-ción" y "-miento". La regla práctica: cuanta más prosa explicativa, más sobrecoste.

    El sobrecoste del español baja de +44 % a +26 %

    Pasé los mismos cinco pares por cl100k_base, el tokenizador antiguo de GPT-3.5 y GPT-4: 323 tokens en inglés y 465 en español. Un +44,0 %.

    De +44 % a +26 % en una generación de tokenizador. El vocabulario de o200k_base es más grande y menos anglocéntrico. Pero son dos medidas, no una ley: bajó una vez, no des por hecho que baje siempre. Lo que sí puedes dar por hecho es que si en 2023 tomaste una decisión de arquitectura basada en lo que costaba el español, ese número está caduco.

    Metodología y límites de la medición

    Medición hecha por Bezael Pérez (Dominicode) en julio de 2026: cinco pares de textos paralelos español/inglés —system prompt de agente, documentación técnica, mensaje de soporte, fragmento de RAG y prompt de tarea de desarrollo—, tokenizados en local con o200k_base y cl100k_base. Totales: 323 tokens en inglés frente a 407 en español con o200k_base, y 465 con cl100k_base.

    Cada proveedor usa su propio tokenizador. Anthropic no publica el suyo: la única fuente fiable para contar tokens de Claude es su endpoint count_tokens — y Anthropic la llama estimación, no medida exacta.

    Así que los porcentajes de arriba son de la familia OpenAI (o200k_base), no de Claude. La dirección del efecto es la misma en todos los modelos comerciales, pero el número exacto varía según proveedor y tipo de texto. Anthropic lo admite en su propia página de precios: un token son "aproximadamente 4 caracteres o 0,75 palabras en inglés", y el recuento exacto "varía según el idioma".

    Con Claude hay además un detalle que cambia los números absolutos, avisado en esa misma página: los modelos de la generación 4.7 en adelante —Opus 5 y Sonnet 5 incluidos— usan un tokenizador nuevo que produce alrededor de un 30 % más de tokens que los anteriores para el mismo texto. Se nota en sus estimaciones: el millón de tokens de Opus 5 son ~555.000 palabras en inglés, y en Opus 4.6 eran ~750.000.

    Así que no copies la cifra de este post. Mídela. Es gratis y te cuento cómo abajo.

    Dónde se paga el sobrecoste de tokens en español: factura, contexto y latencia

    1. La factura: cuánto cuesta el sobrecoste al mes

    Tabla 2 — Precios oficiales de la API de Anthropic por millón de tokens, en USD (consultados el 30 de julio de 2026).

    Modelo Entrada ($/M tokens) Salida ($/M tokens)
    Claude Opus 5 $5 $25
    Claude Sonnet 5 $3 $15
    Claude Haiku 4.5 $1 $5

    Ojo a la fecha con Sonnet 5: los $3 / $15 son la tarifa estándar que entra el 1 de septiembre de 2026; hasta el 31 de agosto rige el lanzamiento de $2 / $10, un tercio más barato. Calculo con la estándar porque es la que pagarás cuando esto lleve unos meses en producción.

    Vuelvo al agente del principio: Sonnet 5 a tarifa estándar, 25.000 conversaciones al mes, 1.500 tokens de entrada y 300 de salida por conversación. El modelo responde en el idioma en el que le escriben, así que cuando el usuario escribe en español la salida también se hincha un 26 %.

    • En inglés: entrada 37,5 M × $3 = $112,50 · salida 7,5 M × $15 = $112,50 → $225/mes
    • En español (+26 % en entrada y en salida): entrada 47,25 M × $3 = $141,75 · salida 9,45 M × $15 = $141,75 → $283,50/mes

    Diferencia: $58,50 al mes. $702 al año. Por escribir en el idioma de tus usuarios. El +26 % va aquí como aproximación, por lo que ya expliqué: el tokenizador de Claude no es público.

    A esta escala es asumible. Multiplícalo por diez y ya es una decisión de producto.

    2. La ventana de contexto

    Opus 5 y Sonnet 5 tienen 1 millón de tokens de ventana de contexto. Y ojo con la cuenta, porque aquí el 26 % se da la vuelta: si cada texto te cuesta un 26 % más de tokens, en ese millón te cabe un 21 % menos de contenido (1 ÷ 1,26 = 0,79). Con fragmentos de base de conocimiento, que se hinchan un 38,8 %, la pérdida sube al 28 %.

    En un RAG eso no es una curiosidad académica: es recall —y si todavía estás decidiendo entre RAG y fine-tuning, el idioma entra en la ecuación de coste. Con el mismo presupuesto de contexto inyectas menos fragmentos por consulta.

    Menos evidencia recuperada para la misma pregunta es exactamente la situación en la que un modelo empieza a rellenar huecos, que es el mecanismo que expliqué en por qué la IA se inventa cosas.

    Y antes de que la solución sea "pues meto más": llenar la ventana tampoco es gratis en calidad. Va de eso la regla del 60 % en gestión de contexto.

    3. La latencia

    Un modelo emite los tokens de salida de uno en uno, a un ritmo más o menos fijo. Si tu respuesta en español necesita un 26 % más de tokens, tarda un 26 % más en terminar.

    Ojo con dónde lo notas, porque es fácil confundirse: si haces streaming, el primer token llega igual de rápido —eso lo manda el prefill de la entrada, no la longitud de la salida—, y lo que se alarga es la respuesta completa. Sin streaming, el usuario se come el 26 % entero mirando el cursor parpadear. Y si detrás hay un agente que encadena cinco llamadas, ese 26 % se acumula en cada paso.

    Qué hacer con esto (sin escribir peor español)

    Mide, no estimes. El endpoint count_tokens de Anthropic es gratis. Solo lo limitan las peticiones por minuto de tu tier: 2.000 en Start, 4.000 en Build, 8.000 en Scale.

    import Anthropic from "@anthropic-ai/sdk"
    
    const client = new Anthropic()
    
    const systemEs = "Eres un agente de soporte…"   // tu system prompt real
    const systemEn = "You are a support agent…"     // el mismo, en inglés
    
    async function contar(system: string) {
      const res = await client.messages.countTokens({
        model: "claude-opus-5",
        system,
        messages: [{ role: "user", content: "ping" }],
      })
      return res.input_tokens
    }
    
    console.log(await contar(systemEs), await contar(systemEn))
    

    El "ping" está ahí porque messages es obligatorio; al ser idéntico en las dos llamadas, la diferencia sale limpia. Quince minutos y dejas de discutir con estimaciones.

    El system prompt en inglés, el contenido del usuario en español. El system prompt se repite en cada llamada y tu usuario nunca lo lee. Traducirlo al inglés te quita tokens de encima en todas.

    Pero pon el número antes de comprar la idea. Mi system prompt de prueba baja de 86 a 74 tokens: por 25.000 conversaciones al mes son $0,90 con Sonnet 5. Con un system prompt realista de 2.000 tokens, unos $21 al mes. Con caché, una décima parte de eso. Es una optimización real, pero es de un dígito o dos de dólares — no la vendas como el arreglo.

    Y no es gratis. Si lo traduces, fija el idioma de salida de forma explícita —"Always respond in Spanish, regardless of the language of these instructions"— en vez de dejar que el modelo lo infiera del mensaje. Si dentro tienes few-shots, cuidado: los ejemplos arrastran el idioma de salida tanto como la instrucción. Y deja en español cualquier texto que el modelo tenga que devolver literal —mensajes fijos, disclaimers, nombres de producto—, o te lo traducirá a su manera. Después de tocar el system prompt, vuelve a pasar tus evals.

    Prompt caching. Esta es la palanca de verdad. Si el system prompt y el contexto fijo se repiten entre llamadas, cachéalos: una lectura de caché cuesta 0,1× el precio de entrada, un 90 % menos. Ataca justo la parte repetida, la que paga el 26 % una y otra vez sin cambiar una coma, y por eso rinde un orden de magnitud más que traducir nada. Lo desarrollé entero en prompt caching con la API de Claude. Orden de prioridades: primero cachea, después piensa en el idioma.

    Vigila lo que inyectas en cada consulta. Los fragmentos de base de conocimiento son lo que más se hincha (+38,8 %) y van en cada petición; la documentación técnica le sigue (+37,1 %). Si trabajas con specs, esto te toca de lleno: una spec es documentación técnica que entra en el contexto en cada iteración. Una razón más para escribirlas cortas y estructuradas, como insisto en el libro de Spec-Driven Development.

    Lo que NO debes hacer: escribir peor español para ahorrar tokens. Nada de abreviar, quitar tildes o telegrafiar los prompts como un SMS de 2004. El ahorro es de céntimos, y transliterar o mutilar el texto es justo lo contrario de lo que recomiendan los propios proveedores, que piden enviarlo en su escritura nativa. Si necesitas gastar menos: cachea, elige un modelo más pequeño para la tarea, reduce el número de llamadas o mueve la carga a un modelo local, donde el sobrecoste del español deja de facturarse por token y pasa a ser tiempo de GPU.

    Cómo medir tus tokens en español hoy mismo

    Abre tu system prompt de producción. El real, el que ya está desplegado.

    1. Copia tu system prompt tal cual está desplegado.
    2. Pásalo por count_tokens y anota input_tokens.
    3. Traduce ese mismo prompt al inglés sin recortar contenido.
    4. Pásalo otra vez y anota el segundo número.
    5. Resta, divide por el valor en inglés y multiplica por tus llamadas mensuales y por el precio de entrada de tu modelo.

    En quince minutos tienes tu número, no el mío.

    La mayoría descubre que su problema no era el idioma: era que no estaban cacheando nada. Ese diagnóstico solo aparece cuando mides.

    Si quieres el flujo completo para llevar una idea a producto con Claude Code —y salir con instrumentación, no con intuiciones—, es lo que trabajo en Construye con IA: de la idea al producto con Claude Code. Y si prefieres verlo sobre proyectos reales, con gente peleándose con las mismas facturas, eso pasa cada semana en Dominicode Labs.

    Preguntas frecuentes sobre los tokens en español

    ¿Cuánto más cuesta escribir prompts en español que en inglés?

    En mi medición con o200k_base sobre cinco pares de textos paralelos, un 26,0 % más de tokens para decir lo mismo: 323 en inglés frente a 407 en español.

    El rango va de +12,3 % (mensaje de un usuario) a +38,8 % (fragmento de RAG): el tipo de texto importa tanto como el idioma.

    ¿Es porque el español es más largo?

    Solo en parte, y los dos factores se multiplican, no se suman: un +10,0 % de palabras (290 → 319) por un +14,5 % de tokens por palabra (1,114 → 1,276) sale 1,10 × 1,145 = 1,26. El factor grande es el segundo.

    La causa es el tokenizador, no la verborrea: su vocabulario se entrenó sobre un corpus mayoritariamente inglés, y lo que no está bien representado ahí se fragmenta.

    ¿Cuántos tokens es una palabra en español?

    1,276 tokens por palabra de media en mi medición con o200k_base, frente a 1,114 en inglés. O sin decimales: unos 128 tokens por cada 100 palabras españolas y 111 por cada 100 inglesas.

    Es una media sobre texto real de producción: sube en prosa explicativa y baja en textos cargados de terminología inglesa, que el tokenizador ya conoce.

    ¿Qué tipo de texto se encarece más al escribirlo en español?

    Los fragmentos de base de conocimiento para RAG (+38,8 %) y la documentación técnica (+37,1 %). El que menos, los mensajes que escriben los propios usuarios (+12,3 %).

    La diferencia está en la densidad de jerga inglesa: cuanto más técnico es el texto, más tokens comparte el español con el inglés y menos se infla.

    ¿Cómo cuento los tokens en español que consume Claude?

    Con el endpoint count_tokens de la API de Anthropic, disponible en el SDK oficial como client.messages.countTokens(). Es gratis y solo lo limitan las peticiones por minuto de tu tier: 2.000 en Start, 4.000 en Build, 8.000 en Scale.

    Es además la única fuente oficial, porque Anthropic no publica su tokenizador. Ni siquiera ella es exacta: Anthropic advierte de que el conteo es una estimación y puede desviarse ligeramente del consumo real. Cualquier cifra calculada con o200k_base o cl100k_base es una aproximación de otro proveedor.

    ¿Debo escribir mis prompts en inglés para ahorrar dinero?

    El system prompt puedes traducirlo: se repite en cada llamada, nadie lo lee y los modelos responden en español perfectamente aunque las instrucciones estén en inglés. Pero mide el ahorro antes de moverlo, porque suele ser de un dígito o dos de dólares al mes, y desaparece casi entero si ya estás cacheando.

    El contenido del usuario, no lo toques. Y no traduzcas tu base de conocimiento al inglés solo por coste sin medir antes qué le pasa a la calidad de las respuestas. Antes de eso activa prompt caching: ahorra un 90 % en la parte repetida y no cambia nada de tu producto.

    ¿Este sobrecoste va a desaparecer?

    Se está reduciendo: los mismos cinco pares dan +44,0 % con cl100k_base (GPT-3.5 / GPT-4) y +26,0 % con o200k_base (GPT-4o / GPT-5), porque los vocabularios nuevos son más grandes y menos anglocéntricos.

    Pero no lo tomes como una tendencia garantizada. Son dos medidas, no una ley, y hay contraejemplos: los modelos Claude de la generación 4.7 en adelante usan un tokenizador nuevo que produce alrededor de un 30 % más de tokens que los anteriores para el mismo texto. Vuelve a medir cada vez que cambies de modelo.

    ¿Afecta el idioma a la ventana de contexto?

    Sí, y es el coste que menos se vigila. Cuidado con la cuenta, porque el porcentaje se invierte: en 1 millón de tokens —el que traen Opus 5 y Sonnet 5— cabe un 21 % menos de contenido si está en español, porque un +26 % de tokens por texto equivale a 1 ÷ 1,26 de contenido por ventana. Con fragmentos de RAG (+38,8 %) la pérdida es del 28 %.

    En un RAG eso significa menos fragmentos recuperados por consulta con el mismo presupuesto de contexto.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Cómo formar a tu equipo de desarrollo en IA en 6 semanas

    Cómo formar a tu equipo de desarrollo en IA en 6 semanas

    Cada vez que entro a dar una formación de IA a un equipo de desarrollo, hago la misma pregunta antes de encender el proyector: ¿qué no le dejáis hacer a la IA?

    Y casi siempre pasa lo mismo. Silencio. No un silencio incómodo: un silencio de gente que nunca se lo había planteado porque nadie se lo había preguntado.

    Formar a tu equipo de desarrollo en IA no consiste en repartir licencias ni en enseñar a escribir prompts: consiste en acordar por escrito qué se delega a la IA, cómo se revisa lo que genera y quién responde cuando falla. Eso es justo lo que ese silencio deja al descubierto.

    Al rato alguien contesta: "lo crítico lo revisamos bien". Pregunto qué es crítico. Salen tres definiciones distintas en la misma sala, y las tres personas llevan dos años trabajando en el mismo repositorio.

    Ahí está el problema entero. No es que el equipo no sepa usar la herramienta. Es que cada uno decide por su cuenta dónde termina la máquina y dónde empieza él.

    Comprar licencias no es formar a tu equipo de desarrollo en IA

    El patrón se repite en casi todas las empresas que me llaman. Dirección aprueba las licencias, se manda un email de anuncio, se hace una demo de una hora, y a partir de ahí "el equipo ya usa IA".

    Seis meses después sube la actividad. Más commits, más PRs, más líneas. Y nadie en esa organización sabe decir si el equipo va mejor o solo va más rápido cuesta abajo.

    Los datos del sector cuentan esa misma historia. El informe DORA 2025 sobre desarrollo asistido por IA, con casi 5.000 profesionales encuestados, encontró que el 90% ya usa IA en su trabajo y más del 80% cree que le hace más productivo.

    Pero un 30% reconoce tener poca o ninguna confianza en el código que esa IA genera. Trabajamos a diario con algo en lo que no confiamos.

    La encuesta a desarrolladores de Stack Overflow 2025 afina el diagnóstico: la frustración número uno, citada por el 66%, son las soluciones "casi correctas, pero no del todo". Y hay más gente que desconfía de la precisión de estas herramientas (45,7%) que gente que confía (32,7%).

    Lee eso otra vez con gorra de manager. El trabajo de tu equipo se ha desplazado a detectar lo casi-correcto. Eso no es una habilidad de herramienta. Es criterio.

    La conclusión más incómoda del informe DORA cabe en una frase suya: "AI doesn't fix a team; it amplifies what's already there". La IA no arregla un equipo, magnifica lo que ya había. Un equipo con estándares claros se vuelve más rápido y más consistente. Un equipo sin criterio compartido genera incoherencia a mayor velocidad y con mejor presentación.

    Por eso la adopción no es la competencia. El porcentaje de gente con la extensión instalada es una métrica de compras, no de ingeniería.

    Qué es exactamente "la parte de criterio" (en operativa, no en filosofía)

    Cuando digo criterio no hablo de sabiduría abstracta. Hablo de cuatro decisiones que alguien de tu equipo toma cada día, casi siempre sin acuerdo.

    Uno: qué se delega y qué no. Las tareas con dependencias de estado y decisiones encadenadas necesitan supervisión constante; las independientes y verificables se pueden lanzar en paralelo sin drama. Desarrollé esa separación en cómo clasificar tareas con IA en desarrollo de software, y es el primer acuerdo que debería tener un equipo por escrito.

    Dos: cómo se revisa código que no escribió un humano. Revisar el código de un compañero es revisar una intención que puedes preguntar. Revisar un diff generado es revisar una salida sin intención detrás. Menos estilo y naming, más "¿esto resuelve nuestro problema o uno parecido?".

    Tres: quién firma lo que sale a producción. Autoría y responsabilidad se han separado, y muchos equipos no lo han asumido. El modelo no está de guardia a las tres de la mañana. Si no hay un nombre humano pegado a ese despliegue, no hay dueño.

    Cuatro: qué haces cuando la propuesta funciona pero está mal. Este es el caso difícil. Pasa los tests, hace lo que pedía el ticket, y mete un patrón que dentro de cuatro meses te obliga a reescribir un módulo. Un dev con criterio lo rechaza aunque esté verde. Uno sin criterio lo mergea porque está verde.

    Decisión de criterio Síntoma cuando falta
    Qué se delega Cada dev tiene su umbral y la base de código parece escrita por cinco equipos
    Cómo se revisa Aprobaciones rápidas en diffs de 400 líneas que nadie ha leído entero
    Quién firma Cuando algo rompe, la primera frase es "eso lo generó la IA"
    Funciona pero está mal Deuda técnica nueva cada sprint, sin ninguna decisión que la haya causado

    Lo que la IA se ha llevado es la parte mecánica; escribí sobre ese desplazamiento en lo que cambió de verdad en el desarrollo con IA. Lo que queda es esta lista. Y esta lista es justo la que nadie está formando.

    El problema de los juniors: le has quitado su gimnasio

    Delegar a la IA el trabajo de bajo valor elimina justo las tareas con las que un junior se hacía senior. Es la parte de la que menos se habla y la que más me preocupa.

    El CRUD repetitivo, el test aburrido, el refactor pequeño, el bug tonto de dos horas: trabajo de bajo valor para la empresa y de altísimo valor para el que empezaba. Ahí aprendía un junior a leer un stack trace, a oler dónde rompe algo y a intuir por qué una decisión de ayer duele hoy.

    Si delegas ese bloque entero, el junior no se convierte en senior. Se convierte en revisor de algo que no sabe evaluar. Y un revisor sin criterio aprueba con una seguridad que asusta.

    No te digo que prohíbas la IA a los juniors: eso los deja fuera del mercado. Te digo que rediseñes por dónde entra el aprendizaje, con tres reglas que puedes implantar esta semana:

    • Primero a mano, después con IA. Elige dos o tres categorías de tarea (tests de lógica de negocio, consultas a base de datos) donde el junior hace la primera implementación sin asistente. A partir de la segunda, con lo que quiera. El objetivo no es sufrir: es tener un modelo mental propio contra el que comparar. Esto va por confianza, y la que lo hace cumplir de verdad es la regla siguiente.
    • Prohibido "no sé por qué funciona". Si no puede explicar el diff línea a línea en la revisión, no se mergea. Acótalo para que sobreviva al tercer mes: en los PRs que tocan lógica de negocio, y durante los primeros meses de cada junior. Un senior sentado en todos los PRs de todos los juniors no escala más allá de dos.
    • PR saboteado semanal. Un senior coge un PR generado con IA, le planta un fallo real (una condición invertida, un await que falta, un índice que se cae en la query nueva) y se lo pasa al junior. Tres condiciones para que esto no acabe siendo una novatada: el junior sabe que es un ejercicio y que hay un fallo, la rama vive fuera del flujo de merge para que nadie la apruebe por error, y al terminar se enseña el fallo aunque no lo haya encontrado. No se puntúa. Treinta minutos. Y una vez al mes se invierte: el junior sabotea y busca el senior. Es el ejercicio más barato y más eficaz que conozco para entrenar la mirada.

    Las tres cuestan tiempo de las personas más caras del equipo — cuenta unas 2 horas de senior por junior y semana. Es el precio real de que dentro de dos años tengas seniors.

    Y un cuarto movimiento que cambia el rol: que el junior escriba la especificación y la IA implemente. Deja de aprender tecleando y empieza a aprender decidiendo, que es donde está el valor ahora. Es la base de por qué el spec define hoy tu ventaja competitiva, y el método completo está en el libro de Spec-Driven Development.

    Si buscas algo que darle a un junior para que recorra ese camino por su cuenta, el curso Construye con IA va justo de eso: de la idea al producto decidiendo, no tecleando.

    Criterio compartido: el acuerdo que tu equipo debería tener escrito

    Un equipo donde cada dev tiene su propio umbral de delegación no tiene un problema de talento. Tiene un problema de varianza.

    Cinco personas razonables tomando cinco decisiones razonables distintas producen una base de código incoherente. Y eso no se detecta en el PR: se detecta seis meses después, cuando hay tres formas de hacer lo mismo y nadie sabe cuál es la buena.

    La solución no es un curso. Es un documento de una página que el equipo redacta y firma. Un acuerdo de uso de IA es ese documento: fija, por categoría de tarea, qué se delega al modelo, con qué nivel de revisión y quién tiene que dar el visto bueno. Cabe en esto:

    Categoría Regla Quién aprueba
    Qué se le pega al modelo Nunca secretos, credenciales ni datos reales de cliente: sintéticos o anonimizados. Solo herramientas aprobadas por la empresa Autor del PR
    Scaffolding, boilerplate, migraciones sin cambio de esquema Se delega completo Autor del PR
    Tests de lógica existente Se delega, revisión normal. El test tiene que fallar al menos una vez antes de aprobarse Autor del PR
    Refactor que cruza módulos o toca una API pública Se delega la implementación, el plan lo escribe un humano Autor + un revisor
    Auth, permisos, pagos, datos personales Se puede generar, revisión obligatoria de dos personas Owner del módulo
    Cambios de esquema en producción No se delega la decisión Tech lead
    Infra, pipelines de CI/CD y secretos No se delega la decisión Tech lead
    Dependencias nuevas La IA propone, un humano aprueba antes de que entre en el package.json Tech lead

    La fila de los tests es la que más gente se salta y la que más caro sale: un test generado certifica el comportamiento actual, bug incluido. Si rompes a mano lo que prueba y sigue en verde, ese test no vale nada.

    Tres reglas al pie del documento que valen más que la tabla:

    1. Toda excepción se justifica en una línea dentro del PR. Una línea, no un ensayo.
    2. Quien abre el PR responde del código, lo haya escrito él o no. La tabla dice quién aprueba; la responsabilidad no se reparte.
    3. El acuerdo se revisa cada trimestre. Si crece a ocho páginas, nadie lo lee y deja de existir.

    Métetelo en el repositorio, no en Confluence. En el CONTRIBUTING.md, en el CLAUDE.md o en el AGENTS.md, donde lo lean el equipo y los agentes. Y protege con CODEOWNERS las rutas críticas, pero acuérdate de activar en la rama principal la regla "Require review from Code Owners": sin esa casilla, CODEOWNERS sugiere revisores y no bloquea nada. Con la casilla puesta, el acuerdo deja de depender de la memoria de nadie un viernes a las siete.

    Y si quieres el punto de partida, este es el bloque que pego yo en el repo:

    # Acuerdo de uso de IA — v1
    Revisión: cada trimestre. Si crece a 8 páginas, deja de existir.
    
    | Categoría | Regla | Quién aprueba |
    |---|---|---|
    | Qué se le pega al modelo | Nunca secretos ni datos reales de cliente | Autor del PR |
    | Scaffolding, boilerplate, migraciones sin cambio de esquema | Se delega completo | Autor del PR |
    | Tests de lógica existente | Se delega. Debe fallar una vez antes de aprobarse | Autor del PR |
    | Refactor que cruza módulos o toca API pública | El plan lo escribe un humano | Autor + revisor |
    | Auth, permisos, pagos, datos personales | Revisión de dos personas | Owner del módulo |
    | Cambios de esquema en producción | No se delega la decisión | Tech lead |
    | Infra, CI/CD y secretos | No se delega la decisión | Tech lead |
    | Dependencias nuevas | La IA propone, un humano aprueba | Tech lead |
    
    1. Toda excepción se justifica en una línea dentro del PR.
    2. Quien abre el PR responde del código, lo haya escrito él o no.
    3. Nada se mergea si el autor no lo puede explicar línea a línea.
    

    Facilitar esa redacción con el equipo delante —y que salga en una sesión, no en tres meses de hilo de Slack— es la mitad del trabajo de una formación en IA para equipos de desarrollo. El documento no vale por lo que dice: vale porque lo escribieron ellos.

    Cómo medir si la formación en IA de tu equipo sirvió de algo

    La formación funcionó si el equipo converge: si ante el mismo ticket da menos respuestas distintas que antes de empezar. Lo que no sirve es medir líneas de código o PRs mergeados — con IA esas dos suben aunque el equipo esté empeorando. Ya conté qué medir en un equipo que usa IA en lugar de eso.

    Para evaluar la formación en concreto uso una medida que no vas a encontrar en ningún dashboard, porque me la inventé yo: la dispersión de criterio, es decir, cuántas respuestas distintas da tu equipo cuando le preguntas qué delegaría de un mismo ticket. Se mide así.

    Coges cinco tickets reales del backlog y preguntas a cada dev, por escrito y en anónimo, si los delegaría enteros, en parte o nada. Anotas el reparto antes de empezar. Seis semanas después repites el ejercicio con cinco tickets distintos pero del mismo perfil: si repites los mismos, lo que mides es si se acuerdan del acuerdo que firmaron, no si tienen criterio.

    Mira cuánta gente coincide en la opción mayoritaria de cada ticket. Si en la primera ronda el equipo se reparte entre las tres opciones y en la segunda ocho de cada diez coinciden, la formación funcionó. Si sigue repartido, has pagado una charla.

    Un detalle que evita el autoengaño: mete entre los cinco un ticket que ya salió mal en producción por haberlo delegado. Ese te dice si el equipo converge hacia el criterio bueno o simplemente converge hacia el que habla más alto en las reuniones.

    Añade tres indicadores de salud que ya deberías estar mirando: ciclos de revisión por PR, defectos que llegan a producción y tiempo de recuperación cuando algo rompe. El último es el más revelador, porque un equipo que no entiende el código que desplegó tarda muchísimo en arreglarlo.

    Y una métrica que no debes usar jamás: porcentaje de código generado por IA. Es vanidad pura y encima incentiva justo lo contrario de lo que quieres.

    Plan de 6 semanas para formar a tu equipo de desarrollo en IA

    Nada de trimestres ni de planes estratégicos: esto empieza el lunes. Seis semanas, una o dos sesiones por semana, y cada semana cierra con un entregable — diagnóstico, borrador del acuerdo, acuerdo firmado en el repo y segunda medición de dispersión.

    Semana Qué haces Entregable
    1 Diagnóstico, sin formación. Cada dev trae el PR más grande del último mes que se aprobó en menos de diez minutos, y se lee en voz alta en una sesión de 60 min. Se anotan de paso los términos donde el equipo no coincide Foto real del punto de partida, glosario común y medición inicial de dispersión
    2-4 Criterio en vivo. Dos sesiones semanales revisando PRs reales del repo, no ejemplos de juguete. Cada sesión añade una línea al acuerdo Borrador del acuerdo de uso de IA
    3 Arranca en paralelo la pista de juniors (primero a mano, PR saboteado) y sigue corriendo hasta el final Rutina semanal instalada
    5 Se cierra y se firma el acuerdo v1. Se mete en el repo y se cablea lo automatizable: bloquear PRs que tocan package.json sin aprobación del tech lead, límite de tamaño de diff, y el check de que la línea de justificación está en la descripción del PR Acuerdo v1 en producción
    6 Segunda medición de dispersión y retro Comparativa antes/después

    Coste total: entre 8 y 10 sesiones en seis semanas, alrededor de hora y media por persona y semana. Ese es el número que necesitas para venderlo hacia arriba.

    Las semanas 2, 3 y 4 deciden el resultado. Es donde el equipo discute casos concretos con el código delante y donde salen los desacuerdos que llevaban meses enterrados. Si te saltas esa parte y das teoría, acabas con gente que recita buenas prácticas y sigue mergeando lo que no entiende.

    Fíjate en que no hay ninguna semana de vocabulario. Si el 90% del equipo ya usa IA a diario, dedicar cinco días a explicar qué es una ventana de contexto es formación para un equipo que no tienes: los términos salen solos en la sesión de diagnóstico, y ahí se anotan.

    Si prefieres no llevar esto tú solo, es exactamente el trabajo que hago con equipos internos: seis semanas, adaptadas al stack real y con el acuerdo saliendo de los PRs del propio repo. Así funciona una formación para tu equipo.

    Por dónde empiezas el lunes

    Reúne al equipo cuarenta y cinco minutos, pon tres tickets reales encima de la mesa y que cada uno diga qué delegaría de cada uno. No pidas opiniones generales: vas a ver la dispersión en directo, y ese reparto es tu punto de partida.

    La herramienta se compra en una tarde. El criterio se acuerda, se escribe y se revisa. Esa diferencia es todo lo que separa a un equipo que usa IA de un equipo que la aprovecha.

    Preguntas frecuentes

    ¿Cuánto tiempo necesita un equipo para formarse en IA de verdad?

    Seis semanas para tener criterio compartido y un acuerdo escrito funcionando. La parte técnica pura son entre 8 y 24 horas según el nivel, pero sin las sesiones de revisión sobre código real el conocimiento no se convierte en práctica de equipo.

    ¿Sirve este plan para un equipo de 3 personas? ¿Y para 40?

    Para 3 sí, comprimido: las semanas 2, 3 y 4 se hacen en dos. Por debajo de 3 el acuerdo no aporta gran cosa, porque no hay varianza que reducir.

    Por encima de 15 no funciona en una sola sala: se hace por squad, cada uno redacta su acuerdo y luego se consolidan las reglas comunes en el repositorio raíz.

    ¿Debo prohibir la IA a los juniors hasta que tengan más nivel?

    No, eso los deja fuera del mercado y además la usarán igual sin que te enteres. Lo que sí funciona es acotar dónde la usan: que hagan la primera implementación de ciertas categorías de tarea sin asistente, y que no mergeen nada que no sepan explicar línea a línea.

    ¿Quién es responsable si el código generado por IA rompe producción?

    Quien abrió el pull request. La autoría del código y la responsabilidad sobre él se separaron, y la única forma de que un sistema siga funcionando es que la responsabilidad se quede pegada a un nombre humano. Escríbelo en el acuerdo del equipo antes de que ocurra el primer incidente.

    ¿Cómo justifico ante dirección invertir en formación si ya pagamos las licencias?

    Con la diferencia entre adopción y resultado. La licencia demuestra que la gente usa la herramienta; no dice nada sobre defectos en producción, ciclos de revisión ni tiempo de recuperación. Lleva esos tres números a la reunión junto con la medición de dispersión de criterio y la conversación cambia de tono.

    ¿Qué hago si un dev senior se niega a usar IA?

    Escúchale primero, porque su objeción suele ser de calidad y suele tener parte de razón. Después conviértelo en el dueño de la parte de revisión del acuerdo: la gente que desconfía escribe las mejores reglas de control, y así deja de ser un bloqueo para ser una garantía.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • ¿La IA va a sustituir a los programadores? Estás preguntando mal

    ¿La IA va a sustituir a los programadores? Estás preguntando mal

    Hace unas semanas terminé una formación de Claude Code con un equipo de backend. Nueve personas. Al acabar, el más senior de la sala esperó a que se fueran los demás para hacerme la pregunta de verdad.

    "Bezael, sin rodeos: ¿la IA va a sustituir a los programadores? Aquí ya no hay nadie de RRHH."

    Le dije que la respuesta no le iba a gustar, porque no es sí ni es no. Es que la pregunta está mal hecha, y por eso lleva tres años sin producir nada útil aparte de hilos de Twitter.

    La IA no va a sustituir a los programadores: está sustituyendo tareas de programación. Nadie automatiza puestos. Se automatizan tareas — y casi ningún puesto es una sola tarea.

    Tu trabajo no es una cosa: la IA sustituye tareas, no puestos

    Piensa en un abogado. Redacta escritos, busca jurisprudencia, interpreta la ley, negocia y responde de lo que firma. Las dos primeras se automatizan razonablemente bien hoy. Las tres últimas, nada.

    Ahora hazlo con tu semana.

    Un developer teclea implementación, busca en documentación, lee stack traces, escribe boilerplate, migra sintaxis vieja a sintaxis nueva. Y además decide la arquitectura, decide qué no se va a construir, negocia el alcance con producto, entiende el contexto que no está escrito en ningún ticket, y responde de lo que se despliega un viernes a las seis.

    El primer grupo se está automatizando de verdad, hoy, no en 2030. El segundo no se ha movido ni un milímetro.

    Lo que ocurre entonces no es que desaparezca el puesto. Es que cambia la proporción. Menos horas de lo mecánico, más horas de lo otro.

    Y ahí está el problema real, el que casi nadie nombra: no todo el mundo quiere —o sabe— pasar más tiempo en la parte que queda.

    El patrón tiene cincuenta años: el cajero automático no acabó con los cajeros

    Esto ya pasó. Varias veces.

    El caso mejor documentado es el del cajero automático. En 1990 había unos 100.000 instalados en Estados Unidos; dos décadas después rondaban los 400.000. Entre finales de los ochenta y mediados de los dos mil, la sucursal urbana media pasó de necesitar unos 21 empleados de ventanilla a unos 13.

    El titular obvio era "los cajeros automáticos acaban con los cajeros humanos". Y durante dos décadas no ocurrió: el economista James Bessen documentó que el empleo total de cajeros de banca no solo aguantó el despliegue, sino que creció ligeramente.

    ¿Por qué? Porque operar una sucursal salía más barato y los bancos abrieron más. Y porque las tareas que no se automatizaron —vender, resolver el caso raro, sostener la relación con el cliente— pasaron a ser la mayor parte del puesto.

    El empleado de ventanilla de 2005 hacía un trabajo distinto al de 1980 con el mismo nombre en la nómina.

    Y aquí va la parte que casi nunca se cita, porque estropea la moraleja: a partir de 2010 el empleo de cajeros sí se hundió. Ha caído cerca de un 30% desde entonces, hasta quedar en poco más de 340.000 puestos. La banca online remató lo que el cajero automático solo había recolocado.

    Esa es la lección completa, y es bastante más útil que la versión bonita: primero cambia la composición del trabajo; después, si la tecnología sigue avanzando, cambia el número de puestos. Los veinte años de margen no fueron una garantía. Fueron un plazo.

    Lo mismo con la hoja de cálculo: desapareció sumar columnas a mano, y con ello buena parte del puesto de auxiliar contable — pero no la contabilidad. Lo mismo con el CAD: desapareció el tablero de dibujo, y el oficio de delineante se encogió, pero convertir una idea en un plano que se pueda construir sigue siendo trabajo de alguien.

    En los tres casos, la composición del trabajo cambió antes que su existencia.

    Lo nuevo hoy es la velocidad. El cajero automático tardó veinte años en reconfigurar una sucursal. Aquí el ciclo es de producto: lo que tu equipo hacía a mano en enero puede estar delegado en septiembre. No tienes una generación para adaptarte. Tienes un par de trimestres.

    Sobre cómo se ha sentido ese cambio desde dentro escribí hace poco en Llevo 15 años programando: esto es lo que cambió con la IA. Este post es la otra mitad: qué haces con ello.

    El riesgo real para un programador no es quedarse sin trabajo

    Es quedarte solo con la parte difícil.

    Si la IA te quita el 40% mecánico de la semana, lo que queda no es una semana más corta. Es la misma semana llena de decisiones y responsabilidad, sin los ratos de teclear a piloto automático que antes te servían de descanso mental.

    La carga mental sube aunque las horas bajen. Y eso casi nunca se prevé.

    Hay una consecuencia de gestión que va con esto: hay que decidir de antemano qué se hace con el tiempo que se libera, y decirlo en voz alta. Si no se decide, se llena solo de más volumen. Más tickets, más features, más PRs por revisar.

    Ese volumen extra rara vez llega como una decisión explícita: llega como una frase en una reunión que nadie tradujo. De eso va cómo explicar IA a tu jefe: 6 frases que acaban en tu sprint.

    Ese es el momento exacto en el que has cambiado un trabajo llevadero por uno más intenso, con el mismo sueldo y peor cara. Si tu equipo está midiendo esto con líneas de código o PRs mergeados, te va a pasar sin que lo veas venir; sobre eso va cómo medir la productividad en equipos que usan IA.

    Copiloto o agente: la pregunta que hacerle a cualquier herramienta de IA

    La forma de usar IA que mejor funciona hoy es la menos vistosa: la persona conserva el criterio y la responsabilidad, y la herramienta se lleva el trabajo mecánico.

    El mercado etiquetó eso como copiloto —un nombre comercial convertido en genérico— y ahora todo se llama igual. Así que cuando alguien te venda uno, la pregunta es siempre la misma:

    ¿Qué decide la herramienta y qué decides tú?

    Si el que decide es el modelo, eso no era un copiloto. Era un agente con un nombre más tranquilizador. La diferencia técnica entre ambos la desgloso en IA generativa vs IA agéntica.

    Esa frontera no la define el fabricante. La defines tú, en cada proyecto, cuando escribes el objetivo y los permisos. Por eso insisto tanto con las especificaciones: escribir la spec antes es el acto de decidir tú, por adelantado, lo que si no decidirá el modelo sobre la marcha. Lo desarrollo entero en el libro de Spec-Driven Development.

    Y no, esto no es un consuelo: a quién sí le cambia el puesto

    Decir que "cambia la mezcla" no significa que no haya consecuencias.

    Si el 80% de tu puesto era la parte automatizable, tu puesto cambia de forma muy seria. No hace falta que desaparezca la profesión para que desaparezca tu encaje concreto en ella.

    Por eso el ejercicio que viene no es opcional.

    El ejercicio: audita qué parte de tu semana puede automatizar la IA

    No es teoría. Se hace en veinte minutos y da un número incómodo.

    Coge la semana pasada. Mira tu historial de git, tu calendario y tu gestor de tareas. Lista los bloques de trabajo reales —no las tareas del sprint, lo que hiciste de verdad— y clasifica cada uno.

    La regla para clasificar, y hay que aplicarla con honestidad:

    • Mecánica: pudiste describir lo que había que hacer en tres frases, y otro developer competente lo habría resuelto prácticamente igual.
    • Criterio: tuviste que decidir algo que se podía haber decidido de otra forma, y no había respuesta correcta escrita en ningún sitio.
    Día Bloque de trabajo Horas Tipo
    Lun CRUD del endpoint de facturación 3h Mecánica
    Lun Decidir si el estado vive en cliente o API 40min Criterio
    Mar Migrar 12 componentes a la nueva sintaxis 4h Mecánica
    Mar Negociar con producto qué sale del scope 1h Criterio
    Mié Depurar el timeout intermitente de staging 2h Criterio

    Suma las horas de cada columna y saca la proporción.

    Si quieres el paso siguiente —qué delegas exactamente de la columna mecánica y cómo—, va entero en clasificar tareas con IA en desarrollo de software.

    Ahora lee el resultado sin dramatismo:

    Si sales 80% mecánica, eso es una señal, no un insulto. La mayor parte de tu semana está en la franja que se mueve primero. No significa que te vayan a echar el mes que viene: significa que tienes un par de trimestres para mover parte de esas horas al otro lado.

    Si sales 80% criterio, enhorabuena a medias. Tu puesto es de los que la IA hace más productivos, y también más agotadores. Tu problema no es la sustitución: es la carga.

    Y si sales 50/50, ese es más o menos el sitio donde está hoy un senior sano. El objetivo no es llegar a 0% mecánica. Nadie funciona así.

    Repite el ejercicio dentro de tres meses. La proporción es la métrica; el número absoluto de un día suelto no dice nada.

    Lo que haces mañana como programador

    Haz la auditoría esta semana, con tu propio historial, y guarda el resultado.

    Después, coge el bloque mecánico más grande —el que más horas se come— y delégalo de verdad: con contexto, con spec, con revisión tuya. No para ir más rápido. Para ver cuánto de tu semana era realmente insustituible cuando lo miras de cerca.

    Esa es la única pregunta que importa, y no la contesta ningún informe de McKinsey. La contesta tu tabla.

    Si quieres aprender a delegar esa parte sin soltar el criterio, es exactamente el flujo que enseño en Construye con IA: de la idea al producto con Claude Code. Y si lo prefieres sobre proyectos reales y con gente haciéndose las mismas preguntas, en Dominicode Labs es la conversación de cada semana.

    Preguntas frecuentes

    ¿La IA va a sustituir a los programadores?

    La pregunta no tiene respuesta útil porque mezcla dos cosas. La IA está sustituyendo tareas concretas de programación —boilerplate, migraciones mecánicas, búsqueda en documentación, primer diagnóstico de un stack trace— y no está sustituyendo otras: decidir arquitectura, negociar alcance, entender el contexto no escrito y responder de lo que se despliega.

    Lo que cambia no es la existencia del puesto, sino la proporción entre sus tareas. Y cambia más rápido que nunca.

    ¿Qué tareas de developer se automatizan bien hoy?

    Las que cumplen tres condiciones a la vez: se repiten, tienen un criterio de éxito verificable y el error se detecta rápido. Escribir la implementación cuando ya sabes qué quieres, generar tests de andamiaje, migrar sintaxis entre versiones, resumir un stack trace largo.

    Lo que no se automatiza bien es lo que exige asumir consecuencias. Un modelo puede proponer una decisión de arquitectura; no puede responder de ella dentro de dos años.

    Si mi semana sale 80% mecánica, ¿estoy en peligro?

    Estás en la parte del puesto que se mueve primero, que no es lo mismo que estar en peligro inmediato. Es información, y mejor tenerla ahora que dentro de dos años.

    Lo accionable: elige una de esas tareas mecánicas al mes y conviértela en algo que delegas y revisas, en lugar de algo que tecleas. El tiempo que recuperas lo inviertes en la columna de criterio: decisiones de diseño, escribir specs, revisar PRs de otros.

    ¿Qué diferencia real hay entre un copiloto y un agente?

    Quién toma la decisión. En un copiloto, la persona conserva el criterio y la responsabilidad, y la herramienta ejecuta lo mecánico. En un agente, la herramienta decide la ruta y actúa.

    Ninguno es mejor en abstracto: son herramientas para riesgos distintos. Lo peligroso es comprar un agente pensando que es un copiloto porque el fabricante lo llamó así. Si puede actuar sin que tú apruebes cada acción con consecuencias, es un agente y hay que tratarlo como tal.

    ¿Especializarme más me protege?

    Especializarte en una tecnología concreta te protege poco; especializarte en un dominio de negocio, mucho. El conocimiento de una API estable es exactamente el tipo de cosa que un modelo tiene mejor memorizada que tú — con las APIs nuevas va al revés, pero eso se arregla pegándole la documentación.

    Lo que sí acumula valor es lo que no se puede leer en la documentación: conocer el dominio del negocio, saber qué pregunta hay que hacer antes de escribir código, y tener el historial de decisiones que te dice por qué la opción elegante va a fallar aquí. Eso es criterio, y solo se construye con reps.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Qué es un modelo multimodal: tu imagen también son tokens

    Qué es un modelo multimodal: tu imagen también son tokens

    Hace unas semanas metí un pantallazo de un dashboard de facturación en una llamada a la API y le pedí al modelo el total del mes.

    Me devolvió una cifra. Redonda, con su símbolo de euro, con toda la seguridad del mundo.

    Estaba mal. No un poco mal: mal de otro trimestre.

    Mi primer reflejo fue culpar al OCR. Craso error, porque ahí no había ningún OCR. Y ese fue el momento en el que entendí que llevaba meses usando un modelo multimodal sin tener ni idea de lo que pasaba entre mi fetch y la respuesta.

    El modelo no leyó mi dashboard. Lo convirtió en tokens y predijo qué números encajaban ahí.


    Qué es un modelo multimodal

    Un modelo multimodal es un modelo de IA que acepta más de un tipo de entrada —texto, imagen, audio o vídeo— porque convierte todas esas entradas a vectores del mismo espacio y las procesa con un único transformer. No hay un "módulo de visión" que mira y luego le cuenta al modelo lo que hay: todo acaba siendo la misma sopa de números, y el modelo sigue haciendo lo único que sabe hacer, predecir el siguiente token.

    Lo esencial, antes de entrar en detalle:

    • Entrada no es salida. Que un modelo acepte imágenes no significa que las genere. Claude entiende imágenes; no las produce ni las edita.
    • Se factura por parches. Claude trocea la imagen en bloques de 28×28 px y cobra cada bloque como un visual token.
    • El coste es de prompt. Una captura de 1000×1000 px son 1.296 tokens de entrada antes de que el modelo escriba una palabra.
    • El conteo es aproximado. La documentación de Anthropic lo admite: los conteos de objetos y las coordenadas no son exactos.

    Cómo funciona: tu imagen no entra como imagen, entra como tokens

    Un modelo multimodal procesa una imagen en tres pasos: un encoder la trocea en parches y convierte cada parche en un vector, una capa de proyección lleva esos vectores a la misma dimensionalidad que los embeddings de texto, y el transformer los mezcla con los tokens de tu prompt como si fueran palabras. Si ya tienes claro que la IA no piensa, predice, es una extensión bastante elegante de la misma idea.

    Un LLM de texto tiene un tokenizador: parte tu string en trozos y a cada trozo le asigna un vector de N dimensiones. Ese vector es lo que come el transformer.

    Un modelo multimodal añade una pieza delante: un encoder por cada modalidad. Para imagen suele ser un Vision Transformer que trocea el bitmap en parches cuadrados y convierte cada parche en un vector. Para audio, algo equivalente sobre el espectrograma.

    Después viene el truco de todo esto: una capa de proyección que traduce esos vectores a la misma dimensionalidad que los embeddings de texto. Pasada esa capa, el transformer los procesa con la misma maquinaria: no hay una ruta especial para lo visual. El vector del parche 47 de tu JPEG y el de la palabra "factura" son vecinos en el mismo espacio, aunque el modelo sepa perfectamente cuál vino de dónde.

    Anthropic lo documenta de forma literal: Claude ve las imágenes en parches de 28×28 píxeles y a cada parche lo llama visual token. No es una metáfora divulgativa, es la unidad de facturación.

    El detalle que rompe la intuición: la secuencia final es una lista plana donde los tokens de la imagen y los de tu prompt están mezclados, atendiéndose unos a otros con el mismo mecanismo de atención de siempre.

    No hay un ojo. Hay una secuencia más larga.

    Y ojo con la confusión que cuesta dinero en reuniones de producto: que un modelo acepte imágenes no significa que las genere. Claude entiende imágenes, no las produce ni las edita. Gemini y la familia GPT sí generan, con endpoints y precios propios. Cuando alguien proponga "usar IA multimodal", pregunta si habla de entrada o de salida.


    El código: mandar una imagen de verdad

    Así se envía una imagen a Claude con el SDK oficial de TypeScript. Fíjate en el orden: la imagen antes del texto, porque la propia documentación de Anthropic recomienda esa estructura.

    import Anthropic from "@anthropic-ai/sdk";
    import { readFile } from "node:fs/promises";
    
    const anthropic = new Anthropic(); // lee ANTHROPIC_API_KEY del entorno
    
    const imageData = (await readFile("factura.jpg")).toString("base64");
    
    const message = await anthropic.messages.create({
      model: "claude-opus-5",
      max_tokens: 16000, // el thinking va dentro de este tope: no lo dejes corto
      messages: [
        {
          role: "user",
          content: [
            {
              type: "image",
              source: {
                type: "base64",
                media_type: "image/jpeg",
                data: imageData,
              },
            },
            {
              type: "text",
              text: "Extrae total, fecha y NIF. Devuelve JSON. Si un campo no es legible, null.",
            },
          ],
        },
      ],
    });
    
    console.log(message.usage.input_tokens); // aquí está la factura de verdad
    

    Si la imagen ya vive en una URL pública, te ahorras el base64:

    // sustituye el bloque de imagen del array content por este
    const imageBlock: Anthropic.ImageBlockParam = {
      type: "image",
      source: { type: "url", url: "https://ejemplo.com/factura.jpg" },
    };
    

    Loguea usage.input_tokens desde el primer día. Es la diferencia entre una demo bonita y saber lo que te va a costar en producción.

    Y ese null del prompt no es adorno: cuando el modelo te devuelve JSON extraído de un píxel borroso, necesitas un esquema que valide antes de que ese dato toque tu base de datos. Es el patrón que trabajo en el curso de Zod: el modelo propone, el schema dispone.


    Cuánto cuesta una imagen en un modelo multimodal

    Una imagen cuesta ⌈ancho / 28⌉ × ⌈alto / 28⌉ visual tokens en la API de Claude. Es aritmética pública y simple, y aun así aquí es donde se tuercen la mayoría de los proyectos multimodales: nadie hace la cuenta antes.

    Los modelos de Claude 4.7 en adelante están en el tier de alta resolución (borde largo máximo 2576 px, tope de 4.784 visual tokens); los anteriores, en el estándar (1568 px, 1.568 tokens). Si te pasas, la imagen se reescala antes de procesarse.

    Estas son las cifras que publica la documentación oficial de visión de Anthropic:

    Imagen Tier estándar Tier alta resolución
    200×200 px 64 tokens 64 tokens
    1000×1000 px 1.296 tokens 1.296 tokens
    1920×1080 px 1.560 tokens (reescalada a 1456×819) 2.691 tokens
    3840×2160 px (4K) 1.560 tokens (reescalada) 4.784 tokens (reescalada a 2576×1449)

    Traduce eso a dinero. Con Opus 5 a 5 $ por millón de tokens de entrada (precios de julio de 2026), mil capturas de 1000×1000 salen por unos 6,48 $ y mil capturas en 4K por unos 23,92 $. La cuenta la puedes rehacer tú: 1.296 × 5 / 1.000.000 × 1.000.

    Parece barato hasta que lo multiplicas por un agente que itera catorce veces sobre la misma pantalla.

    Con audio pasa lo mismo en otra escala. Gemini documenta 32 tokens por segundo, o sea 1.920 tokens por minuto. Una reunión de una hora son unos 115.000 tokens de entrada antes de que el modelo escriba una sola palabra.

    Tres consecuencias prácticas:

    1. Redimensiona antes de subir. Mandar un 4K cuando el texto se lee perfectamente a 1200 px es tirar tokens y latencia a la basura.
    2. En conversaciones de varios turnos, usa la Files API. Con base64 el payload entero viaja otra vez en cada turno, porque el historial se reenvía completo. Con file_id subes una vez y referencias. Ojo: hoy va por anthropic.beta.files.upload y hay que pasar betas: ["files-api-2025-04-14"].
    3. La imagen infla el prompt, no la respuesta. Ese coste es todo de entrada y el modelo lo digiere antes del primer token. La latencia sube aunque respondas tres líneas.

    Dónde falla un modelo multimodal (y falla más de lo que crees)

    Un modelo multimodal alucina con imágenes por el mismo motivo por el que la IA se inventa cosas con texto: no hay un módulo de verdad, hay una distribución de probabilidad. La diferencia es que con una imagen mala el modelo tiene menos señal y más margen para rellenar con lo plausible.

    Mi dashboard fue justo eso. Cifras pequeñas, reescaladas, con poco contraste. El modelo generó el número que estadísticamente encajaba en ese hueco.

    La documentación de Anthropic reconoce los límites sin maquillaje. Con imágenes de baja calidad, rotadas o de menos de 200 píxeles, alucina. Los conteos de objetos son aproximados. Las coordenadas, también. Y no puede determinar si una imagen fue generada por IA: si se lo preguntas, se inventa la respuesta.

    Léelo otra vez: el conteo es aproximado. Si tu caso de uso es "cuántos palés hay en esta foto" y tu negocio depende de esa cifra, tienes un problema de arquitectura, no de prompt.

    Sobre el OCR: un modelo multimodal entiende un documento con layout raro, tablas torcidas o manuscritos mucho mejor que Tesseract. Pero un OCR clásico es determinista y trazable. El modelo puede darte dos respuestas distintas para la misma imagen, y si le pides coordenadas te las da aproximadas, nunca como una región verificable contra el original. En un pipeline de compliance eso es inaceptable.

    Modelo multimodal OCR clásico (Tesseract, Textract)
    Layout variable, manuscritos, fotos malas Muy bueno Malo
    Misma imagen → misma salida No garantizado
    Trazabilidad de dónde salió el dato No la da Sí, con bounding boxes
    Coste Por visual token, escala con la resolución Plano o por página
    Entiende el contenido ("¿este ticket es de comida?") No
    Apto para compliance sin revisión humana No

    Cuándo usar un modelo multimodal y cuándo es un martillo caro

    Mi regla, después de comerme varias facturas de API sin necesidad:

    Si el dato ya existe en forma estructurada, no le mandes la foto. Si tienes el PDF con capa de texto, extrae el texto. Si tienes la API del dashboard, llama a la API. Mandar una captura de algo que podías consultar en JSON es la forma más cara de leer un número.

    Usa multimodal cuando la información vive en la disposición visual y no en el contenido. Un ticket arrugado fotografiado de noche. Un diagrama en una pizarra. El screenshot de una UI rota que un usuario manda por soporte. Ahí la alternativa no es un parser peor: es que no hay alternativa.

    Y vigílalo dentro del bucle agéntico. Si montas un agente que navega e interpreta pantallas, cada iteración multiplica el coste visual. Esa distinción entre IA generativa e IA agéntica importa mucho más cuando cada paso arrastra 2.700 tokens de imagen.

    Y si lo que necesitas es buscar entre miles de imágenes en vez de razonar sobre una, ya no quieres un modelo generativo: quieres embeddings multimodales e índice vectorial. Lo tienes montado paso a paso en el pipeline multimodal con Gemini Embedding 2.

    La decisión que va antes —si tu problema es de búsqueda, de RAG o de fine-tuning— la desmenucé aquí.


    Lo que puedes hacer hoy

    Coge la funcionalidad multimodal que tengas en marcha o en el backlog y haz una sola cosa: calcula sus visual tokens con la fórmula, multiplícalos por tu volumen mensual real y compáralo con lo que cuesta resolverlo sin imagen.

    En más casos de los que esperas descubrirás que ibas a pagar por interpretar un pantallazo de un dato que ya tenías en una tabla. En el resto tendrás el número exacto para defender el proyecto delante de quien firma.

    Los modelos multimodales no son magia ni son un timo. Son un canal de entrada más, con su precio por parche y su margen de error. Trátalos como lo que son: una dependencia cara. Mídela antes de casarte con ella.

    Cómo encaja esto en un producto completo —qué resuelve el modelo y qué resuelve código normal— lo trabajo de principio a fin en Construye con IA. Y si prefieres discutirlo con gente que está construyendo lo mismo esta semana, estamos en Dominicode Labs.


    Preguntas frecuentes

    ¿Qué es un modelo multimodal en una frase?

    Un modelo que acepta varios tipos de entrada —texto, imagen, audio, vídeo— porque los convierte todos a vectores del mismo espacio antes de procesarlos. En la práctica, para el desarrollador significa una sola cosa: tu imagen entra en el prompt como tokens, cuesta como tokens y se factura como tokens.

    ¿Un modelo multimodal "ve" la imagen como una persona?

    No. Trocea el bitmap en parches, convierte cada parche en un vector y los intercala con los tokens de tu prompt. No hay percepción: hay una secuencia de números sobre la que se aplica atención. Por eso describe con precisión una escena compleja y a la vez falla contando cuatro objetos.

    ¿Cuántos tokens cuesta enviar una imagen?

    Depende de la resolución y del proveedor. En la API de Claude son ⌈ancho / 28⌉ × ⌈alto / 28⌉ visual tokens, con reescalado automático si superas el límite del modelo: 1000×1000 px son 1.296 tokens y un 4K llega al tope de 4.784 en el tier de alta resolución. Son cifras aproximadas de la documentación oficial, así que loguea usage.input_tokens en vez de fiarte de una estimación.

    ¿Es mejor un modelo multimodal que un OCR clásico?

    Para documentos con layout variable, manuscritos o fotos malas, casi siempre sí. Para pipelines que necesitan determinismo, trazabilidad y coste plano, no. Muchos sistemas serios usan los dos, con el modelo actuando solo sobre lo que el OCR no resuelve.

    ¿Los modelos multimodales también generan imágenes?

    No todos. Aceptar imágenes como entrada y producirlas como salida son capacidades distintas. Claude entiende imágenes pero no las genera ni las edita, según su propia documentación. Gemini y la familia GPT sí tienen generación, con endpoints y precios propios. Confirma cuál de las dos necesitas antes de planificar la feature.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Cómo evaluar un proyecto de IA: cinco preguntas antes de aprobar

    Cómo evaluar un proyecto de IA: cinco preguntas antes de aprobar

    Un responsable de operaciones entra en la reunión con la frase ya montada: "queremos un agente para las devoluciones".

    Primera pregunta del árbol. ¿Los pasos son siempre los mismos, y en el mismo orden?

    Sí. Salvo cuando el importe supera cierto umbral.

    Fin del árbol. En la pregunta uno.

    Lo que necesitaba era un workflow con una excepción. Y estaba presupuestando diez veces eso.

    Esto es lo que no sale en la diapositiva de nadie que venga a venderte algo, y es el fondo de cómo evaluar un proyecto de IA: el resultado más frecuente de hacerlo bien es descubrir que no hacía falta un agente. No es falta de ambición. Es lo que hace que el proyecto siga vivo dentro de dos años.

    Y hay un motivo egoísta para que te importe aunque tú no firmes ningún presupuesto: la decisión mala la acabas implementando tú.

    Si lo que buscas es el vocabulario —qué es un agente y qué no—, está entero en esta guía. Aquí no definimos nada. Aquí decidimos, y le ponemos precio a cada decisión.


    Resumen rápido

    • Cinco preguntas, en orden, y se para en la primera que aplique. No es un cuestionario: es un árbol.
    • Cada peldaño que subes multiplica el coste. La gracia está en pararse en el más bajo que resuelve el problema.
    • En IA el éxito es lo que dispara el coste: se paga por uso, así que si la herramienta gusta, la factura sube con ella.

    Cómo evaluar un proyecto de IA: el árbol de cinco preguntas

    Evaluar un proyecto de IA es recorrer estas cinco preguntas en orden y parar en la primera que aplique:

    1. ¿Los pasos son siempre los mismos, y en el mismo orden? Si sí, es un workflow, no un agente.
    2. ¿Basta con leer y escribir texto, sin tocar ningún otro sistema? Si sí, basta un chat con buen contexto.
    3. ¿Hay que decidir sobre la marcha según lo que se encuentre? Si no, workflow otra vez.
    4. Si se equivoca, ¿se puede deshacer? Si no, agente con una persona aprobando cada acción con consecuencias.
    5. ¿Puedes medir si lo ha hecho bien? Si no, todavía no va a producción.

    Cada peldaño que superas multiplica el coste, así que evaluar bien un proyecto de IA consiste en pararse en el escalón más bajo que resuelve el problema.

    La decisión se toma casi siempre al revés. Alguien quiere hacer algo con IA y después busca dónde encajarlo. Así es como acabas pagando la flexibilidad de un agente para ejecutar cinco pasos que nunca cambian.

    El árbol invierte el orden. Primero el problema, después la herramienta. Y así es como se ve cuando lo pones en una hoja, que es la forma en que de verdad se usa en una reunión:

      1. ¿Los pasos son siempre los mismos,
         y en el mismo orden?
           └─ SÍ → workflow. No agente.
           ↓ NO
    
      2. ¿Basta con leer y escribir texto,
         sin tocar ningún otro sistema?
           └─ SÍ → un chat con buen contexto.
           ↓ NO
    
      3. ¿Hay que decidir sobre la marcha
         según lo que se encuentre?
           └─ NO → workflow otra vez.
           ↓ SÍ
    
      4. Si se equivoca, ¿se puede deshacer?
           └─ NO → agente, pero con una
                    persona aprobando todo
                    lo que tenga consecuencias.
           ↓ SÍ
    
      5. ¿Puedes medir si lo ha hecho bien?
           └─ NO → todavía no va a producción.
           ↓ SÍ
    
         → Adelante. Empieza con los permisos
           mínimos y ábrelos según se los gane.
    

    Ninguna de las cinco es técnica: se contestan describiendo el proceso. Vamos una a una, con el precio de quedarse en cada peldaño al lado. Porque el árbol no va de arquitectura. Va de dinero.


    Uno. ¿Los pasos son siempre los mismos y en el mismo orden?

    Si la respuesta es sí, ya has terminado. No necesitas un agente: necesitas un workflow.

    Más barato, más rápido, auditable, y no improvisa. Cuando falla, el informe de incidencia cabe en una línea: falló el paso tres. Eso también es dinero, porque nadie factura horas reconstruyendo qué pasó.

    Esta pregunta se salta por una razón muy humana: describir un proceso como "variable" suena mejor que describirlo como "cinco pasos y una excepción". Pero el caso de las devoluciones es el típico, no la anomalía. Los pasos son fijos salvo un caso, y ese salvo se convierte en el argumento para presupuestar un sistema entero.

    Un if no es variedad. Es un if.

    Y aquí está el multiplicador que hace que esta pregunta valga tanto dinero: un agente que da quince vueltas en lugar de tres no cuesta cinco veces más. Cuesta bastante más, porque el coste no crece con el número de vueltas, sino con la suma de todas las anteriores: cada una reenvía el contexto completo. Un workflow ejecuta los pasos que escribiste y para.

    Muchos candidatos a agente son procesos que pueden escribirse tal cual, y los desmenucé en cómo automatizar tu proceso de desarrollo con IA.

    Lo que pagas aquí: ingeniería una vez, ejecución predecible. Es el único escalón donde la factura no depende de que la herramienta guste.


    Dos. ¿Basta con leer y escribir texto, sin tocar ningún otro sistema?

    Si es que sí, te sobra con un chat con buen contexto. Súmale tus documentos y ya está.

    Redactar, resumir, reformular, clasificar. Nada de eso toca un sistema ni necesita permisos, y montarlo es cuestión de días.

    Lo que se subestima aquí no es la capacidad. Es la latencia.

    Un asistente que tarda ocho segundos sirve perfectamente para redactar un informe. El mismo asistente delante de un cliente al teléfono es inaceptable. La calidad es idéntica; el uso, imposible. Y un agente multiplica esa espera por el número de vueltas: lo que en un chat son ocho segundos, en un agente pueden ser dos minutos.

    Regla que uso siempre: si hay una persona esperando, la latencia es un requisito, no un detalle. Si el proceso corre de madrugada, da igual lo que tarde.

    Lo que pagas aquí: sube con el número de personas, no con la complejidad. Es el escalón que menos sorpresas da.


    Tres. ¿Hay que decidir sobre la marcha según lo que se encuentre?

    Si es que no, workflow otra vez.

    Esta pregunta existe porque hay procesos que tocan varios sistemas —por eso pasaron la dos— pero donde el orden sigue estando escrito de antemano. Leer un correo, extraer datos, meterlos en el CRM, avisar por Slack. Toca cuatro cosas. No decide ninguna.

    El error de asignación es carísimo y se repite: mover datos de un sitio a otro no necesita un modelo eligiendo el siguiente paso. Necesita una automatización de las de siempre, con IA solo en el hueco donde hace falta criterio.

    El árbol decide un proyecto entero. Cuando lo que tienes delante es un backlog y no un presupuesto, la unidad cambia: se decide tarea por tarea, y eso está en cómo clasificar tareas de desarrollo para delegarlas a la IA.

    Lo que pagas aquí: lo mismo que en la uno, más las ramas que hay que mantener. Sigue siendo el barato.


    Cuatro. Si se equivoca, ¿se puede deshacer?

    Si la respuesta es no, la respuesta tampoco es "no lo hagas". Es: agente sí, pero con una persona aprobando cada acción con consecuencias.

    Sin excepciones. Y sin renegociarlo a la baja tres semanas después porque aprobar es un incordio.

    Pagar, contratar, publicar, borrar, escribir a clientes reales, migrar datos de producción. Ninguna de esas se deshace con un ctrl+Z, y todas tienen un coste que ya no es de infraestructura: es de reputación, de contrato o de nómina.

    La parte que no aparece en ninguna hoja de cálculo: esa persona es un coste recurrente y no escala. Revisar el diez por ciento de las salidas es viable con cien casos al día e imposible con diez mil. El proveedor absorbe el volumen sin despeinarse. Quien lo vigila, no.

    Y si el proyecto solo sale a cuenta cuando quitas al humano de en medio, entonces no sale a cuenta. Eso es información valiosa, y llega gratis si haces la pregunta antes de firmar.

    Lo que pagas aquí: el modelo por las vueltas, más el tiempo de quien aprueba. Este es el peldaño donde el presupuesto cambia de orden de magnitud, no de porcentaje.


    Cinco. ¿Puedes medir si lo ha hecho bien?

    Si es que no, no lo pongas en producción todavía.

    No porque vaya a salir mal desde el primer día. Al revés: va a salir bien, porque los pilotos salen bien.

    El problema llega después. Sin forma de medir no vas a saber si empeora, y va a empeorar: cambias de modelo, cambia el tipo de casos que llegan, alguien toca un prompt. Todo eso ocurre sin que salte ninguna alarma, porque no hay alarma.

    Medir son dos cosas y hacen falta las dos. Una señal automática que diga si la ejecución fue correcta. Y la traza de qué decidió el sistema y con qué información, que es lo que te deja reconstruir un incidente en vez de opinar sobre él — la lista de qué guardar de cada ejecución la tienes en este repaso de observabilidad para agentes.

    Decidir qué salida es aceptable antes de construir, en lugar de parchearlo cuando ya ha explotado, es el trabajo que describo en el libro de Spec-Driven Development. No es burocracia: es lo que hace que la pregunta cinco tenga respuesta el día que la haces.

    Lo que pagas aquí: todo lo anterior más la infraestructura de medir. Y esa no se va nunca, porque es la que sostiene el resto.

    Si llegas al final del árbol, adelante. Un agente es la respuesta correcta y merece la pena. Empieza con los permisos mínimos y ábrelos según se los gane.


    Dónde te paras y qué pagas

    Cada parada del árbol tiene un perfil de coste distinto, y esa es la información que falta en casi todos los presupuestos:

    Dónde se para el árbol Lo que pagas de verdad
    Pregunta 1 → workflow Ingeniería una vez. Ejecución predecible
    Pregunta 2 → chat con contexto Por conversación. Sube con las personas
    Pregunta 3 → workflow otra vez Igual que 1, más ramas que mantener
    Pregunta 4 → agente con aprobación Modelo × vueltas + tiempo de quien aprueba
    Pregunta 5 → agente instrumentado Todo lo anterior + medir, para siempre

    Esta tabla es la razón de que el orden de las preguntas no sea decorativo.

    Anthropic lo dice sin rodeos en Building effective agents (diciembre de 2024): la recomendación es buscar siempre la solución más simple posible, y eso "puede significar no construir sistemas agénticos en absoluto". Es la empresa que te cobra por vuelta diciéndote que des menos vueltas.


    Cuánto cuesta un proyecto de IA: la cuenta que casi nadie hace

    Un proyecto de IA no se paga por licencia: se paga por uso. Un taxímetro, no un abono.

    En el software al que estás acostumbrado, el usuario número mil sale casi gratis. Aquí no: cada respuesta rehace un cálculo entero, y ese cálculo cuesta dinero.

    De ahí sale la frase que te va a servir en cualquier reunión de presupuesto: en IA, el éxito es lo que dispara el coste. Si la herramienta gusta y la usa todo el mundo, la factura sube en la misma proporción. Al revés de lo que espera un director financiero.

    Así que la cuenta es esta, y se hace antes: coste por consulta × número de consultas al mes, con el escenario de que la herramienta guste.

    Un piloto de diez personas y una implantación de dos mil no se diferencian en dos veces. Se diferencian en dos órdenes de magnitud. Y dos detalles estropean cualquier estimación hecha a ojo: lo que sale se cobra varias veces más caro que lo que entra —está en las tarifas públicas de Anthropic y en las de cualquier otro proveedor—, y una conversación larga cuesta más que la suma de sus mensajes, porque cada turno reenvía todo lo anterior.

    Esa asimetría entre lo que entra y lo que sale, con los números de coste al lado, la desglosé en IA generativa vs IA agéntica.

    El piloto es el diez por ciento del trabajo aunque parezca el noventa

    Un piloto se monta en semanas y sale bien: casos elegidos, gente motivada y alguien vigilando de cerca.

    Producción es otra cosa. Aparecen los casos raros, los usos que nadie previó, el mantenimiento de la base de conocimiento y la factura de verdad. Y aparece el punto que más proyectos entierra: quién se ocupa de esto dentro de un año. El piloto lo llevó alguien con ilusión en un rato libre. Producción necesita un dueño en el organigrama.

    Piloto Producción
    Casos Elegidos a mano Los que lleguen, incluidos los raros
    Usuarios Motivados y avisados Todos, y sin leer las instrucciones
    Supervisión Alguien mirando de cerca Una revisión semanal que hay que asignar
    Coste Casi ruido Coste por consulta × volumen real
    Dueño Quien tuvo la idea Una persona en el organigrama

    La regla, dura a propósito: si al terminar el piloto no sabes decir quién lo mantiene, cuánto costará al volumen real y quién lo revisa cada semana, el piloto no ha terminado. Ha terminado la parte divertida.

    Cómo evaluar un proyecto de IA cuando no hay un "antes" que medir

    Empieza por procesos donde puedas medir el antes. Es la regla que evita la mayoría de los disgustos, y se entiende sola: si no sabes cuánto tardabais en tramitar una devolución antes de la IA, tampoco vas a poder demostrar que ahora tardáis menos. Y sin eso, la renovación del presupuesto se decide por sensaciones.

    Cuidado con lo que eliges medir, porque lo que midas es lo que vas a conseguir. Si mides volumen tendrás volumen: más documentos generados, más tickets cerrados y ninguna certeza de que algo haya mejorado. Qué métricas dicen la verdad lo desarrollé en cómo medir la productividad de equipos que usan IA.


    Por qué te importa aunque tú no firmes nada

    Este árbol es cosa de quien firma. Por eso te importa a ti.

    Cuando alguien aprueba un agente para un proceso de cinco pasos fijos, tú eres quien pasa los seis meses siguientes intentando que un sistema no determinista se comporte de forma determinista. Vas a montar guardrails para forzar un orden que cabía en un switch. Vas a depurar ejecuciones que no se repiten. Vas a explicar por qué sube la factura.

    Todo eso era evitable en la pregunta uno, en una reunión de veinte minutos a la que probablemente no te invitaron.

    La jugada es sencilla: haz tú las cinco preguntas, en voz alta, antes de que se decida nada. No hace falta ser quien firma para ser quien pregunta.

    Y cuando la decisión ya está tomada y lo que te llega es una frase de reunión, el trabajo es traducirla antes de que se convierta en alcance: cómo explicar IA a tu jefe y las seis frases que acaban en tu sprint.

    Y si quieres contrastar el árbol antes de usarlo, esa conversación pasa cada semana en Dominicode Labs, con gente que ya tiene estos sistemas corriendo.

    Y si quieres el recorrido de idea a producto con este criterio aplicado desde el primer día, es el camino del curso Construye con IA.


    Lo único que tienes que hacer hoy

    Coge el proyecto de IA que ya está aprobado. Ese, no el que viene.

    Y contesta la pregunta uno: ¿los pasos son siempre los mismos y en el mismo orden?

    Si la respuesta empieza por "sí, salvo cuando…", ese salvo es la conversación que tienes que provocar esta semana. Porque casi siempre es un if, y estás pagando por un sistema que decide para no tener que escribirlo.

    El árbol sale de un libro que estoy terminando, El mapa de la inteligencia artificial: 120 conceptos para gente que decide sin escribir código. Mientras tanto, esos conceptos colocados por zonas —y estas cinco preguntas en formato imprimible— los tienes gratis en el mapa desplegable.

    Imprímelo y déjalo en la sala de reuniones. Mejor aún: pásaselo a quien te aprueba el presupuesto. Ahí es donde de verdad hace su trabajo.


    Preguntas frecuentes

    ¿Cómo se evalúa si un proyecto de IA merece la pena?

    Con un árbol de cinco preguntas que se recorre en orden y se detiene en la primera que aplique: si los pasos son siempre los mismos, si basta con leer y escribir texto, si hay que decidir sobre la marcha, si el error es reversible y si puedes medir el resultado. Cada peldaño que subes multiplica el coste y el riesgo, así que evaluar bien es pararse en el escalón más bajo que resuelve el problema.

    ¿Cuándo compensa pagar por un agente y cuándo basta con un workflow?

    Un agente solo justifica su precio cuando el camino cambia según lo que el sistema encuentra durante la ejecución, y pagar flexibilidad para un proceso fijo es el error más caro de esta lista. Si los pasos están fijados de antemano, un workflow es más barato, más rápido y auditable. Si el trabajo se agota en leer y escribir texto sin tocar otros sistemas, un chat con buen contexto y tus documentos resuelve el caso en días.

    ¿Por qué la primera pregunta ahorra tanto dinero?

    Porque corta los proyectos más caros antes de que existan. Un agente que da quince vueltas en lugar de tres multiplica la factura, y cada vuelta reenvía todo el contexto anterior, así que el coste no crece con el número de pasos sino con la suma de todos los anteriores. Cuando el proceso es fijo salvo una excepción, pagas por una decisión que se toma miles de veces y siempre sale igual.

    ¿Cuánto cuesta realmente un proyecto de IA?

    No se paga por licencia, se paga por uso: la cuenta correcta es coste por consulta multiplicado por consultas al mes, calculada con el escenario de que la herramienta guste. Un piloto de diez personas y una implantación de dos mil se separan en dos órdenes de magnitud, no en dos veces. Súmale lo que casi nunca se presupuesta: quien revisa, el mantenimiento de la base de conocimiento y el dueño del sistema.

    ¿Por qué un piloto que funciona no garantiza que el proyecto funcione?

    Porque el piloto se hace con casos elegidos, gente motivada y alguien vigilando de cerca. En producción aparecen los casos raros, los usos que nadie previó, los límites de las APIs y la supervisión semanal. Lo que no escala no es la infraestructura, que el proveedor absorbe sin inmutarse: es la parte humana de revisar, mantener y decidir.

    ¿Qué hago si no puedo medir si el sistema lo hace bien?

    No lo pones en producción todavía. Sin una señal que diga si una ejecución fue correcta no vas a enterarte de que el sistema empeora, y va a empeorar en cuanto cambie el modelo, cambien los casos o alguien toque un prompt. Antes de subirlo necesitas dos cosas: una comprobación automática del resultado y la traza de qué decidió el sistema con qué información.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Por qué la IA se inventa cosas — y por qué no es un fallo

    Por qué la IA se inventa cosas — y por qué no es un fallo

    Le pides las tres sentencias más relevantes sobre un asunto. Te devuelve tres: tribunal, número, año, en el formato exacto en que se citan estas cosas.

    Dos existen.

    La tercera no. Y es indistinguible de las otras dos.

    No está peor escrita. No lleva una nota al pie que diga "esta me la he inventado". No hay cambio de tono, ni duda, ni titubeo. Tiene la misma pinta de ser verdad que las otras dos.

    Y aquí está lo que casi nadie cuenta cuando explica por qué la IA se inventa cosas: no falló nada. El sistema hizo exactamente lo mismo que hace cuando acierta.

    Esto no es un ejercicio teórico. El 22 de junio de 2023, el juez P. Kevin Castel impuso una sanción de 5.000 dólares —solidariamente a dos abogados y a su despacho— en el caso Mata v. Avianca, nº 1:22-cv-01461 del Distrito Sur de Nueva York (678 F. Supp. 3d 443). Habían presentado un escrito con seis sentencias inventadas de principio a fin, con citas internas a resoluciones que tampoco existen.

    Lo mejor viene ahora: uno de ellos le preguntó a ChatGPT si esos casos eran reales. Respondió que sí, y añadió que podían encontrarse en Westlaw, LexisNexis y el Federal Reporter.

    Y aquí está el detalle que casi nadie cuenta: el juez no sancionó por el error. Escribió que usar una herramienta de IA no tiene "nada de intrínsecamente impropio". Sancionó porque, después de que la parte contraria y dos órdenes del tribunal cuestionaran la existencia de esas sentencias, siguieron defendiéndolas.

    Nadie hackeó nada. El modelo no se rompió. Solo hizo su trabajo.


    ¿Por qué la IA se inventa cosas?

    Porque un modelo de lenguaje no busca la respuesta correcta: genera la continuación más probable, pieza a pieza, sobre una distribución de probabilidad aprendida en el entrenamiento. Cuando lo plausible coincide con lo cierto, decimos que acierta. Cuando no coincide, decimos que alucina. Es el mismo mecanismo, el mismo nivel de seguridad en el tono y el mismo aspecto en la pantalla.

    Una alucinación de la IA es exactamente eso: una salida plausible y falsa —una cita, una fecha, un identificador, un método de librería— generada con el mismo procedimiento y con la misma confianza aparente que una salida correcta.

    Lo importante es lo que no hay: en ningún punto del proceso existe un paso que pregunte "¿esto es verdad?".

    No es que se salte la comprobación. Es que la comprobación no está en el diseño. Nadie la quitó porque nunca estuvo.

    Si lo tienes claro en términos de predicción — la misma idea que hay detrás de cualquier algoritmo de machine learning — deja de ser sorprendente. Un sistema entrenado para que la salida sea verosímil produce salidas verosímiles. Ni más ni menos.

            el modelo optimiza UNA cosa:
         que la continuación sea plausible
                        │
            ┌───────────┴─────────────┐
       coincide con              no coincide
        la verdad                con la verdad
            │                         │
        "acierta"                 "alucina"
            └────── el mismo ─────────┘
                   mecanismo
                        │
            y en ningún punto de este
            recorrido hay un paso que
            pregunte: ¿esto es verdad?
    

    Dos nombres distintos para el mismo comportamiento. La diferencia no la pone el modelo: la pone el mundo, al coincidir o no con lo que salió.


    Qué es una alucinación de la IA: el retrato robot que no se parece a nadie

    La analogía que mejor me funciona cuando lo explico en una reunión: un dibujante de retratos robot buenísimo que nunca ha visto al sospechoso.

    Tiene una técnica excelente. Conoce las proporciones, sabe qué rasgos aparecen juntos. Le das una descripción vaga y te devuelve un retrato limpio, coherente, con una nariz que encaja con esos pómulos.

    El retrato está bien hecho. Es convincente. Y puede no parecerse a nadie.

    Eso es una alucinación. No un borrón, no un garabato: un dibujo correcto de una persona que no existe.


    Lo contraintuitivo: alucina más cuando la pregunta tiene forma de respuesta

    Aquí es donde casi todo el mundo tiene el modelo mental invertido.

    La intuición dice: alucina cuando no sabe. Falso. O al menos, insuficiente.

    Alucina más cuando la pregunta parece tener una respuesta con una forma muy clara. Una referencia bibliográfica tiene una forma reconocible. Un artículo de una ley tiene una forma. Una fecha tiene una forma. Un número de sentencia tiene una forma.

    Y lo plausible es exactamente lo que el modelo optimiza. Dale un hueco con forma nítida y lo rellenará con algo que tenga esa forma.

    Corolario práctico y algo perverso: preguntar por una normativa que no existe es la manera más fiable de provocar una alucinación. No porque el modelo sea tonto, sino porque la pregunta le da la plantilla y él es muy bueno rellenando plantillas.

    Hay datos que lo respaldan. En Why Language Models Hallucinate (Kalai, Nachum, Vempala y Zhang, 4 de septiembre de 2025) —tres de los cuatro autores firman por OpenAI; Vempala, por Georgia Tech— los autores le preguntaron tres veces a DeepSeek-V3 por el cumpleaños de uno de ellos, indicándole explícitamente que respondiera solo si lo sabía. Obtuvieron tres fechas: "03-07", "15-06" y "01-01". Ninguna correcta.

    Con el título de su tesis doctoral, tres modelos distintos devolvieron tres títulos distintos. Ninguno acertó ni el título ni el año. Y el detalle que más dice: los tres inventados sonaban mejor que el de verdad.

    Y por si crees que esto solo pasa con datos oscuros: al preguntar cuántas D hay en "DEEPSEEK", los modelos del estudio respondieron 2, 3, y en algunos casos 6 y 7. La respuesta es 1. No es un problema de que le falte información. Está delante.


    No es mentir, y no es un disparate

    Dos precisiones que cambian la conversación con cualquier stakeholder.

    No es mentir. Mentir exige dos cosas: saber la verdad y decir otra cosa a propósito. Aquí no hay ninguna de las dos. No hay intención, y no hay una representación interna de "la verdad" separada de la salida que se pueda contradecir.

    Y las alucinaciones nunca son disparates. Esto es lo que las hace peligrosas. Si el modelo te dijera que el artículo aplicable es el 4.912 de una ley con 90 artículos, lo cazarías al instante.

    Lo que hace es devolverte el artículo 27.3. Verosímil. Bien formateado. En medio de tres párrafos que sí son correctos.

    Ese es el riesgo real: no la barbaridad evidente, sino el dato razonable que sobrevive a la revisión rápida y acaba en producción, en un informe o delante de un cliente. Y se agrava con el tiempo, porque cuando la herramienta lleva doscientos aciertos seguidos, revisar se convierte en echar un vistazo.


    Excelente cuando basta lo plausible. Peligroso cuando tiene que ser exacto

    Esta es la línea que de verdad importa, y la que deberías tener pegada al monitor antes de decidir dónde metes un LLM.

    Lo que le pides ¿Basta con que sea plausible? Veredicto
    Redactar, reformular, dar forma a un borrador Sí — lo plausible es lo bueno Úsalo sin miedo
    Resumir un documento con datos dentro La prosa sí; las cifras y los nombres, no Comprueba cada dato contra el original
    Traducir, ordenar ideas, dar nombre a cosas Sí, con repaso Úsalo
    Generar código que luego compila y se testea Sí — tienes verificador Úsalo, el compilador es tu red
    Una fecha, una cifra, un artículo de una ley No Verificador obligatorio
    Una referencia, un ID, una versión de librería No Verificador obligatorio

    Fíjate en la fila del código, porque es la que explica por qué los modelos funcionan tan bien escribiendo código y tan mal citando fuentes. En código tienes un verificador que se ejecuta: compilador, tipos, tests, linter. La alucinación se cae sola en dos segundos.

    En una cita bibliográfica no hay compilador. Nadie la ejecuta. Solo alguien leyéndola y asintiendo.

    Si tu caso de uso no tiene verificador, tú eres el verificador. Y tú te cansas.


    ¿Se arregla? El paper que medio internet cita al revés

    Existe la versión pesimista: "es intrínseco, no esperes que se arregle". Y existe el paper de Kalai y compañía, que se cita constantemente para apoyar esa frase, diciendo lo contrario.

    Lo que sostienen es esto: las alucinaciones no son un misterio. Empiezan como errores de clasificación binaria bajo presión estadística — si en los datos de entrenamiento un hecho aparece una sola vez, el modelo no tiene con qué distinguirlo de una invención. Su ejemplo: si el 20% de las fechas de nacimiento aparecen exactamente una vez en el preentrenamiento, cabe esperar que el modelo base alucine en al menos el 20% de esas fechas.

    Y luego viene la parte incómoda. Persisten, dicen, por cómo se puntúa a los modelos. Los benchmarks que dominan los leaderboards corrigen en binario: acierto o fallo. Un "no lo sé" puntúa igual que un fallo — cero. Revisaron las diez evaluaciones que dominan esos leaderboards —GPQA, MMLU-Pro, IFEval, Omni-MATH, BBH, MATH, MuSR, SWE-bench, HLE y WildBench— y en nueve de las diez reconocer incertidumbre no da ningún crédito. La única que da algo es WildBench, y con un matiz cruel: su rúbrica puede puntuar más bajo un "no lo sé" que una respuesta mediocre con datos inventados.

    Con esa regla, adivinar siempre es la estrategia óptima. Estamos entrenando buenos examinandos, no sistemas fiables.

    Su propuesta es tan poco glamurosa que por eso nadie la tuitea: cambiar la puntuación de los benchmarks que ya existen, declarando en el enunciado el umbral de confianza — responde solo si tienes más de t de confianza, el fallo resta t/(1−t) puntos, el acierto suma 1 y el "no lo sé" suma 0. Con t = 0.9, cada fallo cuesta nueve.

    Así que sí: la parte del problema que viene de los incentivos es corregible, y eso es una buena noticia.

    Lo que no cambia es el diseño de fondo. Puedes premiar la abstención y conseguir que el modelo diga "no lo sé" muchísimo más a menudo. No conviertes eso en un paso de comprobación de hechos que antes no existía. Mientras la salida se genere por probabilidad, tu arquitectura tiene que contemplar que a veces será plausible y falsa.

    No es una razón para no usarlo. Es una razón para diseñar con eso dentro.


    Cómo evitar alucinaciones en tu código: 5 decisiones para mañana

    Aquí es donde este post se separa de los cincuenta artículos que explican qué son las alucinaciones y terminan con un "revisa siempre las respuestas". Gracias, muy útil.

    Cinco decisiones concretas. Y antes, lo que caza cada una — porque ninguna las caza todas:

    Defensa Qué caza Qué NO caza
    Schema de salida (Zod) Respuestas con la forma equivocada Un ID inventado con la forma correcta
    Consulta a la fuente SKUs, IDs y referencias que no existen Datos que existen pero no aplican
    Cita literal verificada Atribuir algo real a una fuente que no lo dice Una fuente que dice algo falso
    Rama "no lo sé" en el schema El relleno por campo obligatorio La invención cuando el modelo "cree" saber
    Test de abstención Que el sistema invente en preguntas sin respuesta Errores en preguntas que sí tienen respuesta

    1. Verificar en lugar de confiar

    Cada dato factual que salga del modelo y entre en tu sistema pasa por tres filtros, en este orden: schema, tipos, fuente.

    El schema te da forma. Los tipos te dan garantías en compilación. Y la fuente te da la única cosa que el modelo no puede darte: verdad.

    import { z } from 'zod';
    
    // El schema valida la forma. NO valida que el ID exista.
    const Producto = z.object({
      sku: z.string().regex(/^[A-Z]{3}-\d{6}$/),
      precio: z.number().positive(),
    });
    
    const extraido = Producto.parse(salidaDelModelo); // ✅ forma correcta
    const real = await db.productos.findBySku(extraido.sku); // ✅ existencia
    if (!real) throw new SkuInventadoError(extraido.sku); // error tuyo, no de Zod
    

    Un SKU inventado pasa el regex sin problema. Tiene exactamente la forma de un SKU — recuerda: forma clara, invención fiable. La única defensa es la consulta.

    2. Grounding: dale las fuentes delante y exígele la cita

    Si el modelo tiene el texto real en la ventana de contexto, no necesita inventar. Eso es RAG y por qué gana a fine-tuning para problemas de conocimiento — y si quieres verlo montado con código, tienes la implementación completa aquí.

    Pero pedir la cita no basta. Hay que comprobarla:

    // Sin normalizar, un espacio doble o una tilde tumban la comprobación.
    const normalizar = (s: string) =>
      s.normalize('NFD').replace(/[\u0300-\u036f]/g, '')
        .replace(/\s+/g, ' ')
        .trim()
        .toLowerCase();
    
    const cita = normalizar(respuesta.citaLiteral);
    
    // Ojo: includes('') es true. Una cita vacía "aparece" en cualquier documento.
    const citaVerificada =
      cita.length >= 30 &&
      fuentes.some(f =>
        f.id === respuesta.fuenteId && normalizar(f.texto).includes(cita)
      );
    

    Determinista, barato, sin llamadas extra. Si la cita literal no aparece en el documento que dice citar, la respuesta se descarta. Con esto cazas la clase de fallo más caro que existe: la respuesta correcta atribuida a una fuente que no dice eso.

    3. Déjale una salida: "no lo sé" tiene que ser una opción legal

    Este es el error más repetido en las integraciones que reviso: un schema con todos los campos obligatorios y ninguna rama para la ignorancia.

    Cada campo obligatorio sin salida es una invitación a rellenar. Si tu tipo dice que articulo: string es obligatorio, has convertido "no lo sé" en una respuesta imposible de expresar.

    const Respuesta = z.discriminatedUnion('estado', [
      z.object({
        estado: z.literal('encontrado'),
        articulo: z.string(),
        citaLiteral: z.string().min(30), // una cita de cinco caracteres "aparece" en casi cualquier documento
        fuenteId: z.string(),
      }),
      z.object({
        estado: z.literal('no_esta_en_las_fuentes'),
        queFaltaria: z.string(),
      }),
    ]);
    

    Y dilo también en el prompt, explícito: si la información no está en los documentos proporcionados, responde con estado no_esta_en_las_fuentes. No completes con conocimiento propio.

    Dos frases. Baja las invenciones de forma muy visible. Es la misma lógica de los umbrales de confianza del paper, aplicada a tu endpoint.

    4. Dónde no lo metes sin verificador

    Ninguna de estas cosas entra a un sistema por generación directa: identificadores, precios, cantidades, fechas límite, versiones de dependencias, nombres de métodos de una librería, artículos de normativa, referencias.

    Lo de los nombres de métodos merece un párrafo. Cuando le pides código con una librería poco común, el modelo te devuelve el método que debería existir según todas las APIs parecidas que ha visto. Bien nombrado, con la firma coherente, perfectamente plausible. Y no existe.

    Y hay una variante peor con los nombres de paquete: el compilador no te salva de un npm install de una dependencia que el modelo se ha inventado y que alguien ya ha registrado con ese nombre exacto, esperando precisamente eso.

    Da igual que bajes la temperatura a 0. Eso te quita variabilidad, no te da verdad: te devuelve la misma respuesta plausible casi siempre. Si era falsa, ahora es falsa de forma reproducible. Y ni el "casi siempre" está garantizado: en una API la salida a temperatura 0 todavía puede cambiar según cómo se agrupen las peticiones concurrentes en el servidor.

    5. Que los tests no comparen la salida literal

    Un test que hace expect(salida).toBe("...") sobre una respuesta generada está roto de nacimiento. Cambias de modelo o de versión y se cae sin que nada haya empeorado.

    Testea propiedades, no cadenas:

    • La salida valida contra el schema, siempre.
    • Toda cita literal aparece en la fuente que dice citar.
    • Ningún fuenteId sale del conjunto de fuentes inyectadas.
    • Y el que más información da: un conjunto de preguntas cuya respuesta no está en el corpus, donde lo que se comprueba es que el sistema se abstiene. Si tu tasa de abstención en ese conjunto es baja, tu sistema está inventando y todavía no lo sabes.

    Esa cuarta propiedad es el equivalente en tu repo de lo que propone el paper para los benchmarks: dejar de premiar el acierto por adivinar.

    Decidir esto antes de escribir código —qué salida es aceptable y cómo se comprueba— en lugar de parchearlo cuando ya ha explotado, es exactamente el trabajo que describo en Spec-Driven Development.

    Y en el curso Construye con IA montamos estos verificadores dentro del flujo. Es la diferencia entre un prototipo que impresiona en la demo y algo que puedes dejar corriendo.


    La única conclusión que importa

    Deja de preguntarte si el modelo alucina. Alucina, porque es la misma operación con la que acierta.

    Y no es que sea inevitable —el propio paper describe un sistema que puede abstenerse—. Es que tú no puedes construir asumiendo que ya está resuelto.

    La pregunta correcta es otra: ¿en qué punto de mi sistema se detecta un dato falso, y qué pasa si ese punto no existe?

    Si la respuesta es "lo detecta la persona que lo lea", no tienes un sistema. Tienes un borrador con muy buena presentación.

    Elige hoy el dato factual más crítico que salga de un modelo en tu código y ponle un verificador determinista. Uno. Media hora de trabajo. Vas a dormir mejor.

    Y si te has quedado con ganas de ordenar el resto del terreno — grounding, RAG, salida estructurada, evaluación y el resto de los 120 conceptos colocados por zonas, con sus conexiones dibujadas — tengo un mapa de la IA en una hoja para imprimir, gratis aquí. Funciona muy bien para pasársela a quien aprueba estos presupuestos.


    Preguntas frecuentes

    ¿Por qué la IA se inventa cosas?

    Porque un modelo de lenguaje genera la continuación más probable de un texto, token a token, sobre una distribución de probabilidad aprendida en el entrenamiento. Su objetivo es que la salida resulte plausible, no que sea verdadera. Cuando lo plausible coincide con lo cierto, acierta; cuando no coincide, alucina. En ningún momento del proceso hay un paso que verifique si lo generado es verdad: esa comprobación no forma parte del diseño, así que hay que añadirla fuera del modelo.

    ¿Qué son las alucinaciones de la IA exactamente?

    Son salidas plausibles y falsas: una referencia con el formato exacto de una referencia real, una cifra verosímil, una cita bien construida, un método de librería que podría existir. Nunca son disparates evidentes, y por eso son peligrosas. El riesgo no es que el modelo diga algo absurdo, que cualquiera detectaría, sino que introduzca un dato razonable en medio de varios párrafos correctos y ese dato sobreviva a la revisión rápida hasta llegar a producción.

    ¿La IA miente cuando alucina?

    No. Mentir exige saber la verdad y decir otra cosa de forma deliberada, y en un modelo de lenguaje no se da ninguna de las dos condiciones: no hay intención, y no existe una representación interna de la verdad separada de la salida que se pueda contradecir. Por eso tampoco sirve enfadarse con el modelo ni pedirle que "no invente". Lo que sirve es cambiar el diseño alrededor: darle las fuentes, exigirle cita y verificarla con código.

    ¿Cuándo alucina más un modelo de lenguaje?

    Contra lo que parece, no solo cuando no sabe algo. Alucina más cuando la pregunta parece tener una respuesta con una forma muy clara y reconocible: una fecha, un artículo de una ley, un número de sentencia, una referencia bibliográfica. Como el modelo optimiza plausibilidad, un hueco con forma nítida se rellena con algo que tenga esa forma. Preguntar por una normativa que no existe es una de las maneras más fiables de provocar una invención.

    ¿Se pueden eliminar las alucinaciones del todo?

    Se reducen mucho y no se eliminan. Funcionan tres palancas: grounding (darle las fuentes en el contexto), exigir cita literal y verificarla contra el documento, y permitir explícitamente "no lo sé" en el prompt y en el schema de salida. El paper Why Language Models Hallucinate (2025) añade una cuarta a nivel de industria: cambiar la puntuación de los benchmarks, que hoy casi todos dan cero tanto al fallo como al "no lo sé" y por tanto premian adivinar.

    ¿Bajar la temperatura a 0 evita las alucinaciones?

    No. La temperatura controla cuánta variabilidad hay al muestrear el siguiente token, no si el contenido es cierto. Con temperatura 0 el modelo elige en cada paso el token más probable, así que tiendes a obtener siempre la misma respuesta —aunque ni eso está garantizado en una API, donde el resultado depende de cómo se agrupen las peticiones concurrentes—. Si esa respuesta es falsa, ahora es falsa de forma consistente, que engaña más porque parece estabilidad.

    ¿Alucinan menos los modelos de razonamiento?

    Menos en lo que se puede calcular: si la respuesta se deduce paso a paso, más cómputo ayuda. Pero razonar no añade un paso de comprobación contra el mundo, así que en datos que solo se pueden saber —una fecha, una referencia, un identificador— el problema es idéntico. Why Language Models Hallucinate lo atribuye a los incentivos de evaluación, no a la capacidad: mientras un "no lo sé" puntúe igual que un fallo, adivinar sigue siendo la estrategia óptima para cualquier modelo, razone o no.

    ¿Cómo pruebo que mi integración con un LLM no inventa datos?

    No compares la salida literal con una cadena esperada: se rompe en cada cambio de modelo sin que nada haya empeorado. Testea propiedades. Que la salida valide contra el schema, que toda cita literal aparezca en la fuente que dice citar, que ningún identificador de fuente esté fuera del conjunto inyectado, y sobre todo mantén un conjunto de preguntas cuya respuesta no exista en tu corpus, midiendo que el sistema se abstiene en lugar de rellenar.


    Si quieres ver estos verificadores funcionando dentro de proyectos reales, con la arquitectura y el código completos, es parte de lo que trabajamos en Dominicode Labs. Problemas de producción, decisiones que puedes aplicar esta semana.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Qué es la inteligencia artificial, de verdad: no piensa, predice

    Qué es la inteligencia artificial, de verdad: no piensa, predice

    Hay una pregunta que casi nadie hace en voz alta delante de sus compañeros.

    "Oye, pero qué es la inteligencia artificial en realidad. ¿La cosa piensa o no piensa?"

    No la definición del folleto. El mecanismo. Qué hay al otro lado del cable.

    Es incómoda porque lleva otra dentro: si llevas año y medio escribiendo prompts a diario, ¿cómo es que todavía no lo sabes?

    Y no es una duda académica. Es la razón exacta por la que te sorprendes cuando el modelo inventa un método que no existe, cuando falla sumando cuatro cifras o cuando "olvida" lo que le dijiste cuarenta mensajes atrás.

    La tesis cabe en cuatro palabras: la IA no piensa, predice.

    En una frase: la inteligencia artificial es el campo de la informática que construye sistemas capaces de resolver tareas que asociamos a la inteligencia humana. En su forma dominante hoy —los modelos de lenguaje— el mecanismo es una función con miles de millones de parámetros que recibe una secuencia de tokens y estima la probabilidad del siguiente, repitiendo ese paso hasta terminar la respuesta. No comprende ni razona en el sentido humano: estima continuaciones probables. Lo que sigue es por qué esa diferencia cambia cómo diseñas tu software.


    La definición de inteligencia artificial que no sirve para nada

    La encontrarás en cualquier buscador con alguna variante de esto: la capacidad de las máquinas para realizar tareas que requieren inteligencia humana.

    No es falsa. Es inútil. Define una cosa comparándola con otra que tampoco sabemos definir, y no te permite tomar ni una decisión de ingeniería.

    El pecado original está en el acta de nacimiento del campo. El término lo acuñó John McCarthy en la propuesta del 31 de agosto de 1955 para el Dartmouth Summer Research Project, firmada también por Marvin Minsky, Nathaniel Rochester y Claude Shannon. La conjetura de partida era que cualquier rasgo de la inteligencia puede describirse, en principio, con tanta precisión que se pueda construir una máquina que lo simule.

    Fíjate en el verbo. Simular. Ni ser, ni comprender.

    Lo que en 1955 era una hipótesis de trabajo, en 2026 es un departamento de marketing. En algún punto alguien borró "simular" y se quedó con "inteligencia".


    Qué es la inteligencia artificial de verdad: predicción estadística

    Quítale el nombre bonito. Debajo de ChatGPT, Claude o Copilot hay una función: enorme, con miles de millones de parámetros ajustados durante el entrenamiento, pero una función.

    Recibe una secuencia de tokens y devuelve una distribución de probabilidad sobre el siguiente token. Eso es todo lo que hace en una pasada.

    // Una pasada del modelo, simplificada al hueso
    type Token = number; // id dentro del vocabulario
    type LLM = (contexto: Token[]) => Map<Token, number>; // probabilidad de ser el siguiente
    

    No devuelve "la respuesta". Devuelve, para cada token de su vocabulario, la probabilidad de que sea el siguiente. Un algoritmo de muestreo elige uno, lo añade a la secuencia y la función se ejecuta otra vez. Y otra. Hasta que sale un token de parada.

    Lo que lees en tu editor es ese bucle repetido cientos de veces. En ningún momento el sistema decide qué quiere decir y luego lo redacta. Redactar es lo único que hace.

    Y un token no es una palabra: es un fragmento frecuente de caracteres. La regla gruesa de los conceptos básicos de la API de OpenAI son unos 4 caracteres o 0,75 palabras por token en inglés, y varía según modelo e idioma.

    El detalle parece trivial y no lo es: el número 4.096 no entra en el modelo como el número 4.096, entra partido en trozos. Y aunque entrara limpio, tampoco hay un algoritmo de suma debajo: solo continuación probable.

    La arquitectura que lo hizo posible es el Transformer, de Attention Is All You Need (2017); las piezas de debajo las desglosé en algoritmos de machine learning que todo developer debería entender.

    Piénsalo así: es el autocompletado de tu móvil con un doctorado. La diferencia con el T9 es de escala y arquitectura, no de propósito: los dos estiman qué viene después.


    Diferencia entre inteligencia artificial, machine learning y LLM

    La diferencia es de anidamiento: la inteligencia artificial es el campo entero, el machine learning es un método dentro de ese campo y un LLM es un tipo concreto de modelo de machine learning. Cuando alguien dice "la IA" sin decir de cuál de estos cuatro niveles habla, casi siempre está vendiéndote algo.

    Nivel Qué es Ejemplos
    Inteligencia artificial El campo entero. Incluye técnicas sin aprendizaje: reglas, búsqueda, planificación Un motor de ajedrez clásico, un sistema experto
    Machine learning Un método dentro de la IA: en vez de programar reglas, se ajustan parámetros con datos. Cuando esos modelos son redes neuronales profundas se llama deep learning Spam, churn, recomendadores
    LLM Un tipo de modelo de deep learning: red neuronal transformer entrenada, en su fase base, para predecir el siguiente token GPT, Claude, Gemini, Llama
    Sistema agéntico No es un modelo: es el software que envuelve al LLM con herramientas, permisos y un bucle Claude Code, Cursor

    Los tres primeros niveles están anidados: cada uno contiene al siguiente. El cuarto no es un nivel del mismo tipo — es producto construido encima.

    Así que no toda la IA es machine learning, no todo el machine learning es un LLM, y el chat que abres cada mañana no es un modelo: es un producto con un modelo dentro. Buena parte de lo que te sorprende ocurre en el producto.

    Esa última fila es la que más confusión genera hoy, y le dediqué un post entero: IA generativa vs IA agéntica.

    Si esta tabla te ha ordenado algo, hay una versión mucho más grande: el mapa de la IA, con 120 conceptos colocados por zonas y las conexiones dibujadas, en una hoja para imprimir. Es gratis, y funciona especialmente bien para pasársela a la gente de producto o de negocio que te pregunta estas cosas en las reuniones.


    Por qué esta distinción te cambia decisiones reales

    Aquí es donde la teoría empieza a pagar facturas.

    Entender que el sistema estima en lugar de saber explica de golpe los cinco fallos que más tiempo te hacen perder, y cambia la decisión que tomas en cada uno.

    Lo que ves Causa real Qué hacer
    Inventa un método o una cita "No lo sé" es una continuación menos probable que una respuesta bien redactada Verificador delante: schema, tipos, consulta a la fuente
    "Olvida" lo que dijiste 40 mensajes atrás Cada petición es stateless; alguien recortó el historial que se reenvía Curar el contexto antes de cambiar de modelo
    Falla sumando cuatro cifras Los números entran partidos en tokens: predice, no calcula Darle una herramienta: intérprete, calculadora, query
    No conoce algo de esta semana Sin herramienta de búsqueda solo tiene sus parámetros y tu contexto Declarar la tool de búsqueda o inyectar el dato con RAG
    Dos ejecuciones idénticas dan salidas distintas Hay muestreo; con seed las salidas son mostly deterministic, no deterministas Testear propiedades, no igualdad literal

    Las cinco filas son el mismo hecho visto desde cinco ángulos.

    No hay ningún paso de comprobación

    Si el sistema devuelve continuaciones probables, "no lo sé" es solo otra continuación posible, y suele ser menos probable que una respuesta con pinta de correcta. En ningún momento se pregunta si lo que escribe es verdad: no es que se salte la comprobación, es que la comprobación no existe.

    En septiembre de 2025, investigadores de OpenAI y Georgia Tech publicaron Why Language Models Hallucinate, que sostiene que el problema es corregible: el entrenamiento y las evaluaciones premian adivinar por encima de reconocer incertidumbre. Mientras ese incentivo siga ahí, ningún dato factual del modelo debería entrar en tu sistema sin un verificador delante.

    Desarrollé el mecanismo completo —por qué ocurre, cómo se detecta y qué se puede hacer— en por qué la IA se inventa cosas.

    Qué es la ventana de contexto de un LLM (y por qué no es memoria)

    La ventana de contexto es el número máximo de tokens que caben en una sola petición, sumando lo que envías y lo que el modelo genera. No es memoria: es el tamaño del formulario que rellenas en cada llamada. Con la regla de 0,75 palabras por token, una ventana de 200.000 tokens equivale a unas 150.000 palabras por petición, y se vacía entera en la siguiente.

    El modelo no recuerda nada. La documentación de OpenAI lo dice con esas palabras: cada petición de generación es independiente y stateless, y para varios turnos tienes que reenviar los mensajes anteriores en cada llamada.

    Lo que percibes como "la conversación" es un array que alguien vuelve a mandar entero cada vez —tu código, o el servidor del proveedor si delegas el estado— y tiene que caber en la ventana de contexto junto con la respuesta que se genera.

    Cuando el chat "olvida" lo de hace cuarenta mensajes es porque alguien decidió recortar o resumir ese historial. Ese alguien es el producto, no el modelo.

    De ahí que curar lo que entra en la ventana rinda más que cambiar de modelo, y que escribir una especificación antes de delegar funcione tan bien: le das el contexto exacto en lugar de esperar que lo adivine. Es la metodología que documenté en el libro de Spec-Driven Development.

    Las herramientas pesan más que el modelo

    Si el modelo predice texto, todo lo que requiera verdad, cálculo o estado tiene que venir de fuera.

    Eso es RAG: recuperar documentos relevantes y meterlos en el contexto antes de generar, idea formalizada por Lewis et al. en 2020 en Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, que combina memoria paramétrica y no paramétrica. Y es también una calculadora o una query a tu base de datos.

    Ojo con la búsqueda web, el malentendido más común: es una herramienta, no una capacidad del modelo. En la API de OpenAI se declara en el array de tools y el modelo decide si la usa. Un LLM a pelo no consulta internet.

    Con eso claro, "¿qué modelo es mejor?" pierde interés frente a "¿qué contexto y qué herramientas le estoy dando?". Ese desplazamiento es, en el fondo, cómo ha cambiado el trabajo del developer con IA.

    No es una función pura, y tu CI necesita saberlo

    Como hay muestreo, la misma entrada no produce la misma salida. La temperatura no es un ajuste de creatividad: es cuánto aplanas o afilas la distribución antes de muestrear. Por encima de 1 la aplanas y entran tokens improbables; por debajo de 1 la afilas; en 0 te quedas siempre con el más probable.

    Y aunque la fijes a cero y pases un seed, no tienes determinismo garantizado. El cookbook de OpenAI sobre el parámetro seed habla de salidas mostly deterministic y avisa de que el determinismo no está garantizado. De hecho expone un system_fingerprint precisamente porque la configuración del backend cambia por debajo sin que tú lo pidas.

    Traducción para tu pipeline: no compares la salida literal de un LLM en un test. Testea propiedades —que el JSON valide contra el schema, que el código compile, que estén los campos obligatorios—. Un expect(salida).toBe("...") contra un modelo es un test rojo esperando su turno.


    Lo que la inteligencia artificial no es

    No razona como un humano. Los modelos de razonamiento se entrenan con refuerzo para generar más tokens intermedios antes de responder, y eso mejora mucho los problemas de varios pasos. Pero es el mismo mecanismo con más pasadas: más recorrido, no otra naturaleza.

    No consulta internet por defecto. Sin una herramienta de búsqueda conectada solo tiene lo que quedó en sus parámetros y lo que tú le pegas en el contexto.

    No aprende de tus conversaciones. Durante la inferencia los pesos están congelados: nada de lo que escribes modifica el modelo. Que tus datos se usen para entrenar versiones futuras es política de producto, no mecánica; en la API de OpenAI, por ejemplo, no se usan salvo opt-in explícito, y conviene revisar la política de tu plan porque cambia entre proveedores.

    No es determinista. Trátalo como un servicio externo con variabilidad, no como una función de tu código.

    No es inteligencia artificial general. Todo lo que hay hoy en producción es IA estrecha: sistemas entrenados para una distribución concreta de tareas. La AGI, un sistema con competencia general equivalente a la humana, sigue siendo un objetivo declarado de los laboratorios y no un producto que puedas llamar por API. Cuando un titular afirma que "la IA ya piensa", casi siempre está midiendo un benchmark estrecho.


    Qué hacer con esto mañana

    1. Cambia la pregunta cuando falle. De "¿el modelo sabe esto?" a "¿está esto en el contexto que le he enviado?". Imprime el payload real antes de culpar al modelo: casi siempre el problema estaba ahí.

    2. Pon un verificador entre el modelo y tu sistema. Schema, tipos, un test, una consulta a la fuente. Si la salida entra directa a producción sin filtro, no tienes una feature de IA: tienes una lotería bien presentada.

    3. Elimina los tests de igualdad literal sobre salidas de LLM. Sustitúyelos por comprobaciones de propiedades, y hazlo esta semana.

    4. Escribe lo que quieres antes de pedirlo. Un párrafo de especificación con el resultado esperado y sus límites vale más que veinte iteraciones de prompt: lo que no esté escrito lo rellenará con lo más probable.


    La frase que te llevas

    La próxima vez que alguien te pregunte si la IA piensa, tienes una respuesta mejor que sí o no.

    No piensa. Estima qué sigue. Y lo hace tan bien que a veces lo confundimos con pensar.

    Cambiar la metáfora del cerebro por la de una función de predicción no te vuelve más escéptico ni te quita potencia. Te vuelve mejor ingeniero: dejas de sorprenderte por lo que hace el sistema y empiezas a diseñar alrededor de sus límites reales.

    Si el siguiente paso es pasar de escribir prompts a construir sistemas que trabajen solos, empieza por la guía para dar el salto a los agentes de IA. Y si quieres el camino completo, de la idea al producto con especificaciones, herramientas y verificación, es lo que montamos paso a paso en el curso Construye con IA. Si prefieres hacerlo acompañado, te espero en Dominicode Labs.


    Preguntas frecuentes

    ¿Qué es la inteligencia artificial, en una sola frase?

    Es el campo que construye sistemas capaces de resolver tareas que asociamos a la inteligencia humana. En su forma dominante hoy —los modelos de lenguaje— el mecanismo es una función con miles de millones de parámetros que, dada una secuencia de tokens, estima la probabilidad del siguiente y repite ese paso hasta completar la respuesta. No hay comprensión ni intención: hay estimación estadística sobre secuencias.

    ¿La inteligencia artificial piensa o razona de verdad?

    No en el sentido en que lo hace una persona. Un modelo no forma una intención y luego la expresa: genera la continuación más probable token a token. Los llamados modelos de razonamiento producen más tokens intermedios antes de la respuesta final, lo que mejora bastante los problemas de varios pasos, pero siguen ejecutando el mismo mecanismo predictivo con más pasadas. Cambia la cantidad de proceso, no su naturaleza.

    ¿Cuál es la diferencia entre inteligencia artificial, machine learning y un LLM?

    Son capas anidadas. La inteligencia artificial es el campo completo e incluye técnicas sin aprendizaje, como los sistemas de reglas o la búsqueda. El machine learning es un método dentro de ese campo: en lugar de programar las reglas, se ajustan parámetros a partir de datos. Un LLM es un tipo concreto de modelo de machine learning, una red neuronal transformer entrenada para predecir el siguiente token. Y el chat que usas no es ninguna de las tres: es un producto que envuelve un LLM.

    ¿La IA aprende de mis conversaciones?

    El modelo no se modifica mientras hablas con él: durante la inferencia sus pesos están congelados y nada de lo que escribes cambia sus parámetros. Cuestión distinta es si el proveedor guarda tus datos y los usa para entrenar versiones futuras, y eso depende del plan y de la empresa. En la API de OpenAI, por ejemplo, los datos no se usan para entrenar salvo opt-in explícito.

    ¿Por qué un LLM falla en operaciones matemáticas sencillas?

    Porque no calcula: predice texto. Los números se dividen en tokens antes de entrar al modelo, así que una cifra larga no llega como cantidad sino como una serie de fragmentos. Lo que estima es cómo suele continuar un cálculo escrito, no cuál es su resultado. Por eso la solución correcta es darle una herramienta —un intérprete, una calculadora, una query— en lugar de confiar en su aritmética.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Tests unitarios lentos: el número de Vitest que casi nadie mira

    Tests unitarios lentos: el número de Vitest que casi nadie mira

    Nuestro job de tests en CI tardaba doce minutos clavados. Setecientos siete ficheros, cuatro mil cuatrocientos tests. Nadie lo cuestionaba: una suite grande tarda, y punto.

    Hoy lo hemos dejado en seis minutos y quince segundos. Sin borrar un solo test, sin runners más caros, sin paralelizar nada. Solo cambiando qué entorno arranca cada fichero.

    Y lo interesante no es el 48 % que nos ahorramos. Es que llevábamos meses con tests unitarios lentos mirando el número equivocado.

    El número equivocado es el total. El total te dice que tienes un problema, pero no te dice dónde se va el tiempo. Y sin el dónde, optimizar es tirar cosas a la pared: cambias el entorno, subes los threads, añades runners, y a veces sale bien y a veces sale peor y nunca sabes por qué.

    Vitest te da el dónde al final de cada ejecución. Lo tienes impreso en tu terminal ahora mismo.


    Resumen rápido

    • El total del Duration te dice que tienes tests unitarios lentos, no dónde se va el tiempo. El desglose sí.
    • environment es la suma del arranque de cada fichero entre todos los workers, no el wall-clock del run. Compáralo contra tests, nunca contra Duration.
    • En nuestra suite: 803,6 s de environment contra 156 s de tests. Cinco veces más en montar el escenario que en ejecutarlo.
    • La causa: environment: 'jsdom' global para 707 ficheros, de los que solo 208 tocan el DOM.
    • El fix: dos proyectos de Vitest, la extensión decide el entorno. .test.ts a node, .test.tsx a DOM. 12m → 6m 15s en CI.
    • Shardear no arregla esto: algo más de la mitad del tiempo es coste fijo de arranque, y cada shard lo vuelve a pagar entero.

    Tests unitarios lentos: el desglose que Vitest imprime y nadie lee

    Debajo del Duration hay un paréntesis con seis campos: transform, setup, collect, tests, environment y prepare.

    En nuestro caso, los dos que importan salían así:

    Duration  106.31s (transform …, setup …, collect …, tests 156.00s, environment 803.60s, prepare …)
    

    Recorto los campos que no vienen al caso. Fíjate en la contradicción aparente: el run entero duró 106 segundos, pero dice que gastó 803 en environment.

    No es un bug. environment es la suma del arranque de cada fichero entre todos los workers, no el wall-clock del run. La suite corre en dieciséis workers y cada uno monta su propio entorno por fichero. La cifra que ves es la suma de todos ellos, así que puede ser más de siete veces mayor que el reloj de pared.

    La regla de lectura del desglose de Vitest es comparar acumulado contra acumulado: environment contra tests, nunca contra Duration. Duration es wall-clock; los otros dos son tiempos sumados entre ficheros y workers.

    Y ahí el número deja de ser abstracto: 803,6 segundos montando el escenario contra 156 ejecutando los tests. Cinco veces más en preparar que en actuar.

    Cuando environment multiplica varias veces a tests, el problema no son los tests lentos: es el arranque del entorno.


    707 ficheros arrancando un navegador, 208 usándolo

    El origen estaba en una línea del config: environment: 'jsdom', global, para los 707 ficheros.

    Conté los que tocaban el DOM de verdad. Eran 208. Los 499 restantes —parsers, cálculo de precios, mapeo de rutas de API, validadores— montaban un navegador falso entero para no usarlo jamás.

    Ese es el gasto que estábamos pagando cinco veces sobre el trabajo real. No era un problema de rendimiento del emulador. Era que la mitad larga de la suite no necesitaba emulador ninguno.

    La solución fue partir la suite en dos proyectos de Vitest con una regla que cabe en una frase: la extensión decide el entorno.

    El config, con Vitest 4.1.10 (julio de 2026). La clave test.projects sustituyó a workspace en Vitest 3.2, así que en versiones anteriores esto no aplica:

    // vitest.config.ts
    import { defineConfig } from 'vitest/config'
    import react from '@vitejs/plugin-react'
    
    export default defineConfig({
      test: {
        projects: [
          {
            // Lógica pura: node pelado. Sin plugins, sin setup, sin DOM.
            test: {
              name: 'unit',
              environment: 'node',
              include: ['src/**/*.test.ts'],
            },
          },
          {
            // Componentes: DOM emulado + testing-library.
            plugins: [react()],
            test: {
              name: 'dom',
              environment: 'jsdom',
              include: ['src/**/*.test.tsx'],
              setupFiles: ['./src/test/setup-dom.ts'],
            },
          },
        ],
      },
    })
    

    Elegir la extensión como criterio no es cosmético. Con globs por carpeta o por sufijo (*.spec.ts y *.component.spec.ts) te toca mantener un exclude, porque el primer patrón se traga los ficheros del segundo y esos tests se ejecutan dos veces, una de ellas en el entorno equivocado y fallando por un motivo que parece un bug de tu código.

    .test.ts y .test.tsx no se solapan nunca. Cero exclude, cero ambigüedad, y una regla que un compañero nuevo entiende sin preguntar: si tu test importa JSX, es .tsx y tiene DOM.

    Si trabajas en Angular la idea es idéntica desde que Vitest es el runner por defecto. Cambian los globs, no el razonamiento.

    Después dimos el segundo paso: cambiar una palabra en el proyecto dom, de jsdom a happy-dom. En un A/B aislado sobre esos 208 ficheros, 48,9 s → 34,9 s. Unos catorce segundos. Útil, pero un orden de magnitud por debajo de lo que dio separar los entornos.

    La comparativa completa entre los dos emuladores, con benchmark y las APIs que le faltan a cada uno, la tengo aparte en el post sobre happy-dom o jsdom.

    El resultado de las dos cosas juntas:

    Ámbito Antes Después Δ
    Job Test en CI 12m 00s 6m 15s −48 %
    Suite local (16 cores) 106,3 s 46,0 s −57 %
    environment (acumulado entre ficheros) 803,6 s 137 s −83 %
    Ficheros / tests 707 / 4.400 707 / 4.400 sin cambios

    Mismos tests. Mismas aserciones. Misma cobertura.


    El efecto secundario: dos tests que llevaban meses mintiendo

    Al cambiar el entorno, dos tests empezaron a fallar.

    Y tenían razón.

    El patrón era este, y lo he visto en todos los proyectos en los que he entrado:

    vi.spyOn(global, 'fetch')
      .mockResolvedValueOnce(ok(productos))
      .mockResolvedValueOnce(ok(stock))
    

    Parece un mock. No lo es.

    vi.spyOn(global, 'fetch') sin implementación envuelve la función original y sigue llamándola. Lo único que intercepta son las respuestas que has encolado con mockResolvedValueOnce. Y esa cola se agota: la primera llamada recibe productos, la segunda stock, y la tercera sale a la red de verdad.

    Nuestro componente hacía tres llamadas.

    Llevaba meses pidiendo datos a localhost:3000 desde el runner de CI. jsdom se lo tragaba en silencio y el test seguía en verde. Con happy-dom la petición real quedó a la vista, y ahí aparecieron los 401.

    El arreglo son cuatro líneas, y es la clase de cosa que debería estar en el setup de cualquier suite:

    // setup-dom.ts
    import { beforeEach, vi } from 'vitest'
    
    beforeEach(() => {
      vi.spyOn(global, 'fetch').mockRejectedValue(new Error('fetch sin mockear'))
    })
    

    Un default que revienta. Si un test necesita una respuesta, la encola encima; si se le olvida una llamada, el test falla con un mensaje que dice exactamente qué pasó, en vez de irse a internet a buscar suerte.

    Añade también restoreMocks: true en el config: mockRejectedValue en un beforeEach no vacía la cola de ...Once que haya dejado el test anterior, y esa cola sobrante es una fuga entre tests igual de silenciosa que la que acabas de tapar.

    Yo esto ya no lo discuto: un test que llega a la red no es un test unitario, es una apuesta. Es lento, es flaky, y depende del firewall del runner. Diseñar los mocks para que el hueco falle ruidosamente en vez de degradar en silencio es la mitad del trabajo de testear bien, y es la parte que más tiempo dedico a explicar en el curso de Testing en Angular.

    Nadie planea encontrar estos bugs. Aparecen cuando tocas los cimientos.


    ¿Merece la pena shardear los tests unitarios? Los números dijeron que no

    Nos dio un 27 % a cambio de cuatro runners, cuando el cálculo ingenuo prometía un 60 %. El motivo es que en unitarios la mayor parte del tiempo es arranque compartido, y repartirlo no lo divide: lo multiplica. Así llegamos ahí.

    Semanas antes habíamos partido la suite de E2E en shards concurrentes y el wall-clock se había desplomado. Fue de esas victorias que te dejan con ganas de repetir.

    Así que la pregunta era obvia: si funcionó con E2E, ¿por qué no con los unitarios?

    Los números decían que sí. De los 375 segundos del job, solo 31 eran setup —checkout, pnpm install, build de las librerías internas—, un 8 %. Con un overhead fijo tan bajo, repartir en tres debería habernos dejado en torno a los dos minutos y medio. Una mejora del orden del 60 %.

    Abrimos el PR, lo lanzamos, y esto es lo que salió:

    Job Tiempo
    Test (1) 4m 19s
    Test (2) 4m 32s ← wall-clock
    Test (3) 3m 57s
    Test (otros paquetes) 1m 38s

    375 s → 272 s. Un 27 %, a cambio de cuatro runners en vez de uno.

    Volvimos al desglose, que es lo que había que haber hecho antes de escribir el PR:

    Ámbito Ficheros Tiempo de tests
    Job completo 707 333 s
    Un shard 236 226 s

    Léelo despacio. Un tercio de los ficheros tarda el 68 % de lo que tardan todos.

    Si ajustas una recta T(n) = F + n·v con esos dos puntos, sale un coste fijo F de unos 172 segundos y una pendiente de 0,23 segundos por fichero. Traducido: de los 333 segundos, algo más de la mitad es peaje que pagas antes de ejecutar un solo test. Solo unos 160 dependen de cuántos ficheros tengas.

    Y aquí toca ser honesto con el método: dos puntos y dos incógnitas significa que la recta pasa por ambos por construcción. Es aritmética, no un perfilado. Te da el orden de magnitud del reparto entre lo fijo y lo variable, que es justo lo que necesitas para decidir, pero no lo cites como si fuera una medida.

    Ese coste fijo es transform más importación del grafo de dependencias, en frío, sin caché de Vite en el runner. Y cada shard lo paga entero, otra vez, desde cero.

    Con 3 shards pagas ese peaje tres veces. Con 6, seis. No hace falta el modelo para verlo: el shard más rápido de los tres, con 236 ficheros en vez de 707, todavía tardó 3m 57s. Por muchos runners que enchufes, el suelo se queda en unos cuatro minutos.

    La lección de E2E no transfería, y visto desde aquí es evidente. En Playwright cada test es trabajo independiente de navegador: repartir divide de verdad. En unitarios, la mayor parte del tiempo es arranque compartido, y repartir trabajo compartido no lo divide, lo multiplica.

    El sharding no era la palanca. La palanca era eliminar los ~172 segundos de coste fijo que cada shard vuelve a pagar entero.


    El PR sigue abierto, y creo que así está bien

    El PR #36 no está mergeado ni cerrado. Un 27 % por 4x runners es un trade flojo, y las tres opciones siguen sobre la mesa:

    • Cerrarlo. Los cien segundos no compensan cuadruplicar el consumo de CI ni la complejidad de un job matricial.
    • Bajarlo a 2 shards. Menos ganancia, la mitad de coste, y sospecho que el punto donde la curva todavía compensa.
    • Aparcarlo y atacar el coste fijo. Cachear node_modules/.vite entre runs, si esa caché existe en tu setup, porque hoy se reconstruye en frío cada vez. Si funciona, mejora los tres escenarios a la vez, incluido el de un solo runner.

    La tercera es la que tiene mejor pinta, y precisamente por eso no quiero decidirla con la misma prisa con la que abrimos el PR. Primero medir el arranque en caliente, después decidir.


    Qué hacer hoy si tienes tests unitarios lentos

    1. Lanza tus tests y mira el paréntesis del final. Solo eso.
    2. Compara environment con tests. Los dos son sumas acumuladas entre ficheros, así que la división tiene sentido. Si environment es el doble de tests, ya sabes dónde está tu problema, y no es donde llevas semanas buscándolo.
    3. Cuenta cuántos ficheros importan JSX o tocan document de verdad. En nuestro caso eran 208 de 707. En el tuyo probablemente sea una proporción parecida, porque un catálogo, un carrito o un dashboard tienen mucha más lógica que pintura.
    4. Separa por extensión. .test.ts a node, .test.tsx a DOM. Veinte minutos de trabajo, cero riesgo, ningún test tocado.

    La tesis de todo esto no es "usa happy-dom" ni "shardea tus tests". Es que medir el coste correcto —no el tiempo total, sino en qué se va— convierte una optimización a ciegas en un cambio de config de veinte líneas. El mismo desglose que nos quitó seis minutos nos evitó después tirar cuatro runners a un problema que no era de paralelismo.

    Y que de vez en cuando, al levantar los cimientos, encuentras un test que llevaba meses saliendo a internet sin que nadie se enterara.

    Si quieres ver este tipo de decisiones tomadas sobre proyectos reales, con los runs y los números delante en vez de con opiniones, es lo que hacemos en Dominicode Labs.


    Preguntas frecuentes sobre tests unitarios lentos

    ¿Por qué mis tests unitarios son lentos si cada test tarda milisegundos?

    Casi siempre porque el tiempo no se va en ejecutar los tests, sino en preparar el entorno de cada fichero. En nuestra suite, el desglose de Vitest daba 803,6 segundos acumulados en environment frente a 156 en tests: cinco veces más en montar el escenario que en actuar. Mientras esa proporción esté desequilibrada, optimizar aserciones o subir el número de threads no te va a dar nada: estarías acelerando la parte pequeña.

    ¿Qué significa environment en el resumen de Vitest?

    Es el tiempo dedicado a instanciar el entorno de test (jsdom, happy-dom o node) para cada fichero, sumado entre todos los workers. Es tiempo acumulado entre ficheros y workers, no wall-clock, y por eso puede ser mucho mayor que el Duration total: nosotros teníamos 803,6 segundos de environment en un run de 106,3 segundos corriendo sobre dieciséis workers. La comparación que tiene sentido es environment contra tests, porque ambas cifras están acumuladas de la misma forma.

    ¿Cómo separo los tests que necesitan DOM de los que no en Vitest?

    Con test.projects en vitest.config.ts: un proyecto con environment: 'node' para la lógica pura y otro con DOM emulado, plugin del framework y setupFiles para los tests de componente. Lo que mejor nos ha funcionado es decidir por extensión, .test.ts contra .test.tsx, porque son globs que no se solapan y no necesitas exclude. Si separas por carpeta o por sufijo compuesto, un mismo fichero puede caer en los dos proyectos y ejecutarse dos veces, una de ellas en el entorno equivocado.

    ¿Merece la pena shardear los tests unitarios en CI?

    Depende de qué proporción de tu tiempo sea coste fijo de arranque, y hay que medirlo antes de abrir el PR. En nuestro caso, tres shards dieron un 27 % de mejora a cambio de cuatro runners, cuando el cálculo ingenuo prometía un 60 %. El motivo es que cada shard vuelve a pagar entero el transform y la importación del grafo de dependencias, así que ese coste no se reparte, se multiplica. Con E2E la historia es distinta porque cada test es trabajo independiente de navegador y repartir sí divide.

    ¿Por qué vi.spyOn(global, 'fetch') no mockea mis llamadas?

    Porque spyOn sin implementación envuelve la función original y sigue llamándola. Solo intercepta las respuestas que hayas encolado con mockResolvedValueOnce, y esa cola se agota: en cuanto tu código hace una llamada más de las que encolaste, esa petición sale a la red de verdad. El arreglo es poner siempre un default que falle, con vi.spyOn(global, 'fetch').mockRejectedValue(new Error('fetch sin mockear')) en el setup, y encolar las respuestas concretas encima en cada test.

    ¿Esto aplica igual en Angular?

    Sí, y desde Angular 21 y 22 aún más, porque Vitest pasó a ser el runner por defecto y el entorno DOM dejó de ser una decisión implícita del builder de Karma. Cambian los globs, que serán .spec.ts con algún criterio propio para distinguir tests de componente de tests de servicio, pero el diagnóstico es idéntico: mira el desglose de environment, cuenta cuántos specs necesitan document y manda el resto a node.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Opus 5 vs GPT-5.6 vs Kimi K3: qué modelo para qué trabajo

    Opus 5 vs GPT-5.6 vs Kimi K3: qué modelo para qué trabajo

    Un lunes cambié el modelo de un agente que llevaba semanas funcionando bien. El nuevo costaba la mitad por millón de tokens de salida: quince dólares contra veinticinco. Una línea de configuración, cinco segundos, dinero ahorrado.

    El viernes miré la factura. Había subido.

    No era un bug del proveedor. Era que la tarifa por millón de tokens no te dice cuántos tokens vas a gastar, y ese segundo número decide lo que pagas.

    De eso va esta comparativa de Opus 5 vs GPT-5.6 vs Kimi K3: de trabajo real, no de specs. De cada modelo por separado ya hay un análisis en este blog. Aquí hay una sola pregunta, repetida cuatro veces: para este trabajo concreto, ¿cuál de los tres y por qué?


    Opus 5 vs GPT-5.6 vs Kimi K3: los tres de un vistazo

    Claude Opus 5 GPT-5.6 Sol Kimi K3
    Entrada / salida por millón $5 / $25 $5 / $30 $3 / $15
    Contexto 1M tokens 1,05M tokens 1M tokens
    Intelligence Index sin medición pública 58,9 57
    Pesos cerrados cerrados abiertos
    Rasgo diferencial thinking adaptativo por defecto contexto de 1,05M y tres tiers de precio pesos abiertos: cualquiera puede servirlo

    Esa tabla no decide nada. La pongo porque es lo que vas a encontrar en los otros veinte posts que has leído esta semana, y porque quiero enseñarte por qué te lleva a la decisión equivocada.

    Un apunte que me niego a esconder: Opus 5 no tiene medición pública en el índice independiente de Artificial Analysis. Salió el 24 de julio de 2026, después de la última ronda de medición.

    Las referencias que sí existen: Claude Fable 5 puntúa 59,9 costando unos $50 por millón de salida, y Claude Opus 4.8 —la generación anterior de la misma familia— puntúa 56.

    Opus 5 está por encima de ese 56, probablemente bastante. Pero "probablemente" no es un número y no voy a inventármelo.


    El truco del precio: por qué el orden se invierte

    Kimi K3 parece el barato. Quince dólares por millón de salida contra los veinticinco de Opus 5 y los treinta de Sol. Mitad de precio que el más caro.

    El problema es que un modelo no te cobra por millón de tokens: te cobra por los tokens que emite. Y cuánto emite para resolver la misma tarea es una propiedad del modelo, igual que su precio.

    En el análisis de Kimi K3 salió el dato medido: durante la evaluación independiente, Kimi K3 consumió 130 millones de tokens de salida frente a una media de 63 millones. Eso es 2,06 veces la media. Su coste efectivo por millón de tokens útiles no es $15, es $15 × 2,06 ≈ $31.

    Míralo sobre una tarea concreta. Supón un trabajo que requiere 100.000 tokens de salida útiles:

    Modelo Tokens que emite Precio salida Coste
    Claude Opus 5 100.000 $25 / M $2,50
    GPT-5.6 Sol 100.000 $30 / M $3,00
    Kimi K3 (a precio de lista) 100.000 $15 / M $1,50
    Kimi K3 (verbosidad medida 2,06×) 206.000 $15 / M $3,09

    El barato acaba siendo el más caro de los tres. No por poco: $3,09 contra los $2,50 de Opus 5.

    Ahora la parte incómoda. Estoy comparando una cifra medida contra dos cifras de lista, y eso no es justo. Opus 5 también gasta más de lo que sugiere su tarifa: el thinking viene adaptativo y activado por defecto, max_tokens es un tope duro que cubre razonamiento y respuesta juntos, y esos tokens de razonamiento se facturan como salida. Encima escribe respuestas más largas que la generación anterior por diseño. No existe medición pública de ese sobrecoste: cuando exista, su columna también subirá.

    La conclusión que te llevas no es "Kimi es caro". Es esta: ninguno de los tres se paga a precio de lista, y el único que tiene el multiplicador publicado es Kimi. Cualquier comparativa que ordene los tres modelos por su tarifa está ordenando por el número equivocado.


    Trabajo 1: agente de coding que corre largo

    Para un agente de coding que corre durante horas, la elección es Claude Opus 5 en effort xhigh. No por la tarifa: porque en sesiones largas la verbosidad se compone en vez de sumarse, y lo que arruina la factura son los reintentos.

    Sesiones de horas. Decenas de tool calls. Cada turno reenvía el contexto acumulado de todos los turnos anteriores.

    Aquí la verbosidad deja de ser un coste lineal y se vuelve compuesto. El output del turno 3 es input del turno 4, del 5 y del 20. Un modelo que escribe el doble no te cuesta el doble en ese turno: te infla el contexto de todos los siguientes. Pagas esa respuesta larga una vez como salida y luego otras quince como entrada.

    Kimi compensa parte con un cache hit agresivo a $0,30 por millón —un 90% de descuento—, pero el caching abarata reenviar el contexto, no lo hace más pequeño. El techo de la ventana llega igual, y llega antes.

    Arrancar en xhigh es la recomendación de Anthropic para coding y trabajo agéntico, y coincide con lo que veo trabajando: en sesiones largas lo que arruina la factura no son los tokens, son los reintentos. Una tarea que el modelo barato tiene que repetir tres veces cuesta más que una que el caro resuelve a la primera.

    Un aviso, porque migrar a Opus 5 no es cambiar el string del modelo. Si vienes de Opus 4.8, hay dos cambios que rompen código: el thinking viene activado por defecto y desactivarlo con effort xhigh o max devuelve un 400. Los dos, con el código antes y después, están en los breaking changes de Claude Opus 5. Revísalos antes de mover tráfico.

    Y si al medir descubres que buena parte de tu agente nunca necesitó un modelo frontera —pasa más de lo que la gente admite—, Claude Sonnet 5 cubre ese terreno por mucho menos dinero. Enrutar por dificultad de tarea ahorra más que elegir bien el modelo caro.


    Trabajo 2: una pasada grande sobre un repo grande

    Para trabajo input-heavy de una sola pasada, Kimi K3 es genuinamente el más barato de los tres. Es el caso donde la tabla de precios acierta: el peso está en la entrada y la verbosidad solo penaliza la salida.

    Metes 800.000 tokens de código, pides un análisis de arquitectura o una migración planificada, y recoges veinte mil tokens de informe.

    Aquí se invierte todo lo anterior. El peso está en la entrada, no en la salida, y la verbosidad solo castiga la salida.

    Con esos 800K de entrada: Opus 5 y Sol cobran $5 por millón, o sea $4,00 cada uno. Kimi cobra $3: $2,40. La salida es tan pequeña en comparación que el multiplicador de verbosidad casi no mueve la aguja.

    Ahí no hay trampa que deshacer: el número de la tabla de precios es el número que pagas.

    La ventana de contexto se sobrevende. Lo que sí importa es que Anthropic cobra la ventana completa de 1M a tarifa estándar, sin recargo por contexto largo. Y si tu repo no cabe en 1M, tu problema no es el modelo: es que necesitas trocear e indexar antes de preguntar.

    Aquí los pesos abiertos de Kimi valen algo concreto, y no es lo que la gente cree: cualquier proveedor puede servirlo, así que no dependes de un único vendor para el precio, la disponibilidad ni la política de retención. Eso presiona a la baja lo que te cobran.


    Trabajo 3: volumen alto y simple

    Clasificar diez mil tickets. Extraer entidades de un lote de documentos. Normalizar un CSV enorme a JSON.

    La respuesta correcta a "¿cuál de los tres?" es ninguno de los tres.

    Los números, sobre 10.000 documentos de 2.000 tokens de entrada y 200 de salida cada uno (20M y 2M en total):

    Modelo Entrada 20M Salida 2M Total
    GPT-5.6 Luna $20 $12 $32
    Kimi K3 (lista) $60 $30 $90
    Kimi K3 (verbosidad 2,06×) $60 $61,80 $121,80
    Claude Opus 5 $100 $50 $150
    GPT-5.6 Sol $100 $60 $160

    Luna sale cinco veces más barato que Sol en un trabajo donde la diferencia de inteligencia entre ambos es irrelevante, porque la tarea no pide razonar: pide seguir un formato. Y bajas otro 50% mandándolo por Batch API si no necesitas la respuesta en caliente. El desglose de las tres variantes está en la guía de la API de GPT-5.6.

    Una honestidad sobre mi propia tabla: ese 2,06× se midió en evaluaciones difíciles, no clasificando tickets. Si fuerzas un esquema de salida estricto, la verbosidad se desploma en cualquiera de los tres. Que es justo lo que deberías hacer, porque el error caro aquí no es el modelo: es confiar en que la salida llegue bien formada. Valídala con un esquema y falla ruidosamente cuando no encaje —es lo que enseño en el curso de Zod, y un parseo estricto en la frontera evita más incidencias que cualquier upgrade de modelo.


    Trabajo 4: orquestación y tool calling

    Aquí esperaba encontrar el argumento que le da la vuelta al precio de GPT-5.6 Sol. Me equivocaba, y prefiero contarlo que maquillarlo.

    Programmatic Tool Calling deja que el modelo escriba código que se ejecuta en un sandbox aislado y coordine varias llamadas a herramientas dentro de un mismo turno, sin ida y vuelta a la API entre cada una. Los resultados intermedios de las herramientas no entran en el contexto: solo entra el resultado final. La mecánica está en la guía de la API de GPT-5.6.

    El problema para esta comparativa es que no es exclusivo de OpenAI. Anthropic tiene la misma función, con el mismo nombre, y claude-opus-5 aparece en su tabla de modelos compatibles. No desempata nada.

    Y ahora fíjate dónde cae el ahorro, porque es donde casi todo el mundo se equivoca. Anthropic mide un 37% menos de tokens en tareas complejas de research —de 43.588 a 27.297 de media— y un 24% menos de tokens de entrada en benchmarks de búsqueda agéntica.

    De entrada. No de salida. Tiene todo el sentido: lo que se recorta son los resultados intermedios que ya no viajan al contexto. Así que quien te presente esto como un descuento sobre la tarifa de salida está moviendo el número a la columna equivocada — justo el truco que denuncié dos secciones más arriba.

    Por cierto: OpenAI no publica ningún porcentaje para su implementación. Su guía dice que el efecto depende de la tarea y de las respuestas de las herramientas, y recomienda medir contra tu propia línea base. Si ves un rango concreto atribuido a OpenAI por ahí, pídele la fuente a quien lo publique.

    Mi elección aquí es la misma que en el trabajo 1: Claude Opus 5. No porque gane el tool calling —empata—, sino porque a igualdad de función te lo llevas con la tarifa de salida más baja de los dos: $25 contra $30.


    El criterio que sí sirve

    Una sola métrica: coste por tarea resuelta.

    coste por tarea resuelta = coste medio por intento / tasa de éxito
    

    Los reintentos dominan el resultado y no aparecen en ninguna comparativa. Con números que me invento a propósito, para que veas la forma y no para que te los creas: un modelo a $31 efectivos con un 80% de acierto sale a $38,75 por tarea resuelta; otro a $25 con un 95% de acierto sale a $26,32. El que parecía el caro por tarifa de lista sale un 32% más barato por tarea resuelta. Pon tus tasas reales, que solo tú las tienes.

    Para medirlo necesitas dos cosas. La primera, una definición escrita de qué significa "resuelto": los tests pasan, el diff no toca ficheros fuera de alcance, el JSON valida contra el esquema. Escribir eso antes de medir es literalmente una spec, y es la mitad del método que desarrollo en el libro de Spec-Driven Development.

    La segunda, correr esas evals con tus prompts y tu andamiaje. Y ojo, porque es lo que más gente ignora: el harness que envuelve al modelo cambia el resultado tanto como el modelo. Si cambias las dos variables a la vez, no has medido nada.

    Es el mismo criterio que aplico en el curso Construye con IA: montar la eval antes de elegir el modelo, no después de que llegue la factura.


    Veredicto: qué modelo para qué trabajo

    Trabajas con un agente de coding a diario. Claude Opus 5 en xhigh, y enruta a Sonnet 5 todo lo que tus evals demuestren que no necesita frontera. El ahorro real está en el enrutado, no en la tarifa.

    Tu carga está dominada por herramientas encadenadas. Cualquiera de los dos cerrados, pero enciende el tool calling programático: el ahorro está en la función, no en la marca del modelo. Mídelo un mes contra tu factura anterior mirando solo la línea de tokens de entrada, que es donde cae. Si no se mueve, tu flujo no era tan tool-heavy como creías.

    Procesas repos o corpus grandes de una pasada. Kimi K3. Aquí el precio bajo de entrada es real, la verbosidad apenas te toca, y los pesos abiertos te quitan la dependencia de un único proveedor.

    Clasificas, extraes o transformas en masa. Ninguno de los tres. GPT-5.6 Luna o un modelo de gama baja, con esquema estricto y Batch API. Frente a Sol, eso es un 80% menos de factura.

    Necesitas el techo absoluto de inteligencia y el coste es secundario. Claude Fable 5, a 59,9 y unos $50 por millón de salida. Es un caso raro. Si crees que es el tuyo, mídelo antes: casi nunca lo es.

    Haz una cosa hoy. Coge las diez últimas tareas que le mandaste a tu agente, córrelas contra dos modelos con el mismo harness y anota dos columnas: coste total y cuántas salieron bien a la primera. Divide. En media hora sabrás más que leyendo comparativas durante un mes.

    Es lo que hacemos, modelo a modelo, en Dominicode Labs.


    Preguntas frecuentes sobre Opus 5, GPT-5.6 y Kimi K3

    ¿Cuál es más barato entre Opus 5, GPT-5.6 y Kimi K3?

    Depende de si miras el precio de lista o el coste real por tarea. Por tarifa gana Kimi K3: $3 de entrada y $15 de salida por millón, frente a $5/$25 de Opus 5 y $5/$30 de GPT-5.6 Sol. Pero Kimi emite 2,06 veces los tokens de la media medida, lo que sitúa su coste efectivo de salida en unos $31 por millón, por encima de los otros dos. Con una salvedad que hay que decir: 2,06× es una cifra medida y las de Opus 5 y Sol son de lista. Los tres gastan más de lo que sugiere su tarifa —Opus 5 razona por defecto y factura ese razonamiento como salida—, pero Kimi es el único con el multiplicador publicado. En trabajo dominado por la entrada —repos grandes, documentos largos— Kimi sí es genuinamente el barato, porque la verbosidad solo penaliza la salida.

    ¿Por qué Opus 5 no tiene puntuación en el Intelligence Index?

    Porque se publicó el 24 de julio de 2026, después de la última ronda de medición del índice independiente de Artificial Analysis. Los puntos de referencia disponibles son Claude Opus 4.8 con 56 y Claude Fable 5 con 59,9. Que falte la medición del modelo más nuevo no es un detalle menor: durante las primeras semanas solo tienes los benchmarks del fabricante, y esos se publican siempre en el escenario que más favorece.

    ¿Qué modelo elijo para un agente de coding que corre durante horas?

    Claude Opus 5, arrancando en effort xhigh, que es lo que recomienda Anthropic para coding y trabajo agéntico. La razón no es la tarifa: en sesiones largas el output de cada turno se convierte en input de todos los siguientes, así que la verbosidad se compone en lugar de sumarse. Y lo que arruina la factura son los reintentos: una tarea que hay que repetir tres veces con el modelo barato cuesta más que una que sale a la primera con el caro.

    ¿Qué gano realmente con Programmatic Tool Calling?

    Que el modelo escriba código en un sandbox aislado para coordinar varias llamadas a herramientas en un solo turno, en vez de ir y volver a la API entre cada una. Los resultados intermedios de las herramientas no entran en el contexto, así que el ahorro cae sobre los tokens de entrada, no sobre los de salida. Anthropic mide un 37% menos de tokens en tareas complejas de research y un 24% menos de tokens de entrada en benchmarks de búsqueda agéntica; son cifras del propio fabricante, no de un tercero, y OpenAI no publica ningún porcentaje para su implementación. Sobre todo: no es un diferenciador entre modelos, porque tanto GPT-5.6 como Claude Opus 5 lo soportan.

    ¿Cómo calculo el coste por tarea resuelta en mi proyecto?

    Divide el coste medio por intento entre tu tasa de éxito. Para eso necesitas antes una definición escrita de qué significa "resuelto" en tu caso —tests en verde, diff dentro del alcance previsto, JSON que valida contra su esquema— y correr las mismas tareas con el mismo harness para todos los modelos que compares. Si cambias de modelo y de andamiaje a la vez, no estás midiendo el modelo: estás midiendo el ruido.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.