Volver al blog

Qwen Fixed Chat Templates: la plantilla que los oficiales deberían ser

Qwen Fixed Chat Templates: la plantilla que los oficiales deberían ser

📌 TL;DR — El repositorio froggeric/Qwen-Fixed-Chat-Templates ofrece una única plantilla Jinja de chat corregida para Qwen 3.5, 3.6 y 3.8 que funciona como reemplazo directo en LM Studio, llama.cpp, vLLM, MLX y otros motores. Corrige bugs reales de las plantillas oficiales: bucles agentic, invalidación de caché KV, tokens vacíos que envenenan el razonamiento y bloqueos en producción. Si tienes Qwen desplegado on-premise o en infraestructura propia, ignorar esto tiene coste económico y de fiabilidad.


El problema que nadie menciona en los benchmarks

Cuando un modelo sale con buenos resultados en benchmarks, la conversación gira en torno a parámetros, contexto y velocidad de inferencia. Lo que rara vez aparece en esa conversación es la plantilla de chat: ese fichero Jinja que define cómo se formatea cada turno de conversación antes de que el modelo lo vea.

Es infraestructura invisible. Y como toda infraestructura invisible, cuando falla, el diagnóstico es confuso.

Los síntomas típicos son: el agente entra en un bucle de herramientas del que no sale, el modelo devuelve respuestas vacías o incoherentes después de varios turnos, los costes de inferencia suben sin explicación aparente, o el razonamiento estructurado empieza a degradarse en conversaciones largas. La mayoría de equipos culpa al modelo base, al prompt del sistema o a la temperatura. Pocas veces se mira la plantilla.

froggeric/Qwen-Fixed-Chat-Templates parte exactamente de ahí: de la hipótesis de que las plantillas oficiales de Qwen tienen bugs concretos y documentables, y de que corregirlos tiene impacto directo en producción [1][2].


Qué contiene el repositorio y qué corrige

El repositorio es deliberadamente minimalista: una única chat_template.jinja en la raíz del proyecto, diseñada para cubrir Qwen 3.5, 3.6 y 3.8 como drop-in universal [1][3]. No hay modelo nuevo, no hay fine-tuning. Solo una plantilla mejor.

Las correcciones documentadas afectan a cuatro áreas:

1. Errores de renderizado y desperdicio de tokens

Las plantillas oficiales introducen en determinadas condiciones bloques <think></think> vacíos en el historial de conversación. Esto no es inofensivo: cada bloque vacío ocupa tokens, y en conversaciones largas o en producción con muchas llamadas, el coste acumulado es real. Más importante, esos bloques vacíos actúan como ruido en el contexto y degradan la coherencia del razonamiento en turnos posteriores. El proyecto denomina este fenómeno empty think poisoning [1][6][12].

2. Invalidación de caché KV

La caché KV (Key-Value cache) es uno de los mecanismos principales para acelerar la inferencia en modelos grandes: permite reutilizar cálculos de turnos anteriores en lugar de recomputarlos. Una plantilla que genera tokens diferentes para el mismo contenido semántico invalida esa caché en cada turno, forzando recomputación innecesaria. El resultado es latencia mayor y mayor consumo de recursos [1][6].

3. Bucles agentic y bloqueos fatales

Este es el bug más crítico para quienes usan Qwen en flujos de automatización con herramientas. Las plantillas oficiales tienen condiciones en las que el modelo, al recibir el resultado de una herramienta, no cierra correctamente el bloque de razonamiento y entra en un estado del que no puede salir sin intervención externa. Las notas de la versión v19 describen esto explícitamente como Agentic Loop Cure [7][12]: una corrección específica para el patrón de llamada-respuesta de herramientas que estabiliza el bucle.

4. Control del esfuerzo de razonamiento

Versiones más recientes (v22.x) añaden mecanismos de reasoning effort steering: la capacidad de indicar a la plantilla cuánto esfuerzo de razonamiento debe aplicar el modelo según el contexto [9][10][11]. Esto es relevante cuando quieres respuestas rápidas para tareas simples sin pagar el coste de razonamiento profundo, y respuestas elaboradas solo cuando la tarea lo justifica.


Compatibilidad y cómo se integra

La plantilla está diseñada para funcionar en cualquier motor que soporte plantillas Jinja de Hugging Face: LM Studio, llama.cpp, vLLM, MLX, oMLX, KoboldCPP, entre otros [1][3][6].

La integración es técnicamente sencilla. Hay dos vías principales:

Vía tokenizer_config.json — Sustituyes el campo chat_template en el fichero tokenizer_config.json del modelo por el contenido de chat_template.jinja. Esto aplica la corrección a nivel de modelo y afecta a cualquier motor que lea ese fichero [1][3].

Vía configuración del motor — En herramientas como LM Studio o llama.cpp, puedes especificar directamente la plantilla de prompt sin modificar los ficheros del modelo. Útil si no quieres tocar los pesos descargados o si gestionas varias versiones del mismo modelo.

El hecho de que el repositorio haya generado mirrors en GitHub y forks en Hugging Face [3][5][7][8][9][11] indica que hay adopción real, no solo interés teórico. Cuando una comunidad técnica empieza a replicar y adaptar un proyecto, es señal de que resuelve un problema que la gente encuentra en producción.


Por qué importa si eres empresario con Qwen on-premise

Qwen es una familia de modelos que ha ganado tracción significativa en despliegues on-premise y en infraestructura propia, principalmente por su rendimiento por parámetro y por ser open-weight. Si tu empresa tiene Qwen corriendo en servidores propios o en una instancia cloud gestionada por tu equipo, estos bugs te afectan directamente aunque no los hayas identificado como tales.

Tres impactos concretos:

Coste de inferencia — Tokens desperdiciados en bloques vacíos y recomputación por caché KV invalidada se traducen en mayor consumo de GPU o CPU. En producción con volumen, la diferencia es medible.

Fiabilidad de agentes — Si tienes flujos de automatización donde el modelo llama a herramientas externas (APIs, bases de datos, funciones), los bucles agentic no son un problema teórico. Son incidencias de producción que requieren intervención manual o reinicios del proceso.

Calidad de respuesta en conversaciones largas — El empty think poisoning degrada la coherencia del razonamiento de forma progresiva. En casos de uso donde el contexto acumulado importa (soporte técnico, análisis de documentos, asistentes con memoria), esto se manifiesta como respuestas que pierden el hilo o contradicen turnos anteriores.


Por qué importa si eres desarrollador

La lección más valiosa de este proyecto no es específica de Qwen. Es una lección sobre cómo tratar las plantillas de conversación en sistemas de IA.

Una plantilla Jinja no es un simple texto de configuración. Es código que se ejecuta en cada llamada al modelo, que determina qué ve el modelo y en qué formato, y que puede introducir bugs tan graves como cualquier bug en el código de aplicación. La diferencia es que los bugs de plantilla son más difíciles de detectar porque sus síntomas se parecen a comportamientos del modelo, no a errores de software.

Este repositorio trata la plantilla como lo que es: una pieza de infraestructura versionada, documentada y testeable. Las notas de versión (v19, v22.x) describen cambios concretos con motivación técnica explícita [7][9]. Eso es ingeniería de prompts aplicada con rigor, no ajuste empírico.


Lecciones accionables

  1. Audita las plantillas de chat de los modelos que usas en producción. No asumas que la plantilla oficial es correcta porque el modelo es bueno. Son artefactos independientes con su propio ciclo de bugs y correcciones. Revisa el tokenizer_config.json y entiende qué hace la plantilla antes de desplegar.

  2. Trata las plantillas Jinja como código versionado. Guárdalas en tu repositorio, documenta los cambios, escribe tests básicos que verifiquen el formato de salida para casos conocidos: conversación simple, llamada a herramienta, respuesta con razonamiento. Un cambio de plantilla no detectado puede romper un pipeline de producción sin dejar rastro obvio.

  3. Si usas Qwen 3.5, 3.6 o 3.8 en LM Studio, llama.cpp, vLLM u otro motor compatible con Jinja, evalúa sustituir la plantilla oficial por froggeric/Qwen-Fixed-Chat-Templates [1][6]. El proceso es reversible y el riesgo de la sustitución es bajo comparado con el coste de los bugs que corrige.

  4. Monitoriza comportamientos agentic en producción con granularidad suficiente. Si tienes agentes con herramientas, registra cada ciclo de llamada-respuesta. Los bucles infinitos y los bloqueos tienen patrones reconocibles: número de llamadas a herramientas por turno, tiempo entre respuesta y siguiente acción, respuestas vacías consecutivas. Vincular esos patrones a la plantilla, no solo al modelo, cambia el diagnóstico.

  5. Extrae los patrones de diseño, no solo la solución. El mecanismo de cierre automático de bloques de razonamiento, la gestión explícita del esfuerzo de pensamiento, las reglas para evitar inyección de ruido en el contexto: estos son patrones aplicables a cualquier modelo con capacidad de razonamiento estructurado, no solo a Qwen. Estudiar cómo froggeric/Qwen-Fixed-Chat-Templates resuelve estos problemas te da vocabulario y técnicas reutilizables [1][2][7].


Una reflexión sobre el ecosistema open-weight

Hay algo estructuralmente interesante en este proyecto: un miembro de la comunidad ha tenido que corregir bugs en las plantillas oficiales de un modelo que Alibaba publica y mantiene. Esto no es una crítica a Qwen como modelo, que tiene un rendimiento sólido para su tamaño. Es una observación sobre cómo funciona el ecosistema open-weight.

Cuando publicas pesos de un modelo, publicas también todos los artefactos que lo rodean: tokenizadores, plantillas, configuraciones. Esos artefactos tienen bugs. En el ecosistema cerrado, el proveedor los corrige en silencio y tú recibes la actualización sin saberlo. En el ecosistema open-weight, la comunidad los detecta, los documenta y publica correcciones. Eso es un feature, no un bug del modelo.

La adopción de froggeric/Qwen-Fixed-Chat-Templates en mirrors y forks [3][5][7][8][9][11] es exactamente ese mecanismo funcionando. El problema es que requiere que los equipos que despliegan estos modelos estén lo suficientemente cerca del ecosistema para enterarse de que existe la corrección.

Si no tienes alguien en tu equipo siguiendo activamente el ecosistema de los modelos que usas, estás corriendo versiones con bugs conocidos sin saberlo. Eso tiene solución.


Si tienes Qwen en producción o estás evaluándolo

Si ya tienes Qwen desplegado y reconoces alguno de los síntomas descritos —bucles de herramientas, degradación en conversaciones largas, costes de inferencia más altos de lo esperado—, el primer paso es revisar qué plantilla estás usando y compararla con la versión corregida.

Si estás evaluando Qwen para un proyecto nuevo, incluye la gestión de plantillas en tu checklist de despliegue desde el principio. Es más barato hacerlo bien al inicio que diagnosticar comportamientos erráticos en producción.

Si tienes un flujo de trabajo con agentes, herramientas o automatizaciones basadas en LLMs —con Qwen o con cualquier otro modelo— y quieres revisar cómo está estructurada tu infraestructura de prompts, explícame tu caso en /contacto. El diagnóstico concreto siempre es más útil que las recomendaciones genéricas.


Fuentes

[1] froggeric/Qwen-Fixed-Chat-Templates — página principal en Hugging Face: https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates

[2] README.md de froggeric/Qwen-Fixed-Chat-Templates — documentación principal: https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates/blob/main/README.md

[3] Árbol de archivos de froggeric/Qwen-Fixed-Chat-Templates: https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates/tree/main

[5] froggeric/Qwen-Fixed-Chat-Templates · Discussions — changelog y debates: https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates/discussions

[6] Pirate Face — documentación paralela con instrucciones de integración: https://pirateface.co/froggeric/Qwen-Fixed-Chat-Templates

[7] archive/README-v19.md — detalle de la versión v19 con Agentic Loop Cure: https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates/blob/main/archive/README-v19.md