Incident: bib_ask responde siempre en español independientemente del idioma de la pregunta
Incident: bib_ask responde siempre en español independientemente del idioma de la pregunta
Resumen ejecutivo
El tool MCP bib_ask y el Help Widget de CreaRack Pro respondían siempre en español, incluso cuando el usuario formulaba la pregunta en inglés. La causa raíz fue un system prompt 100% en español que sesgaba al modelo Gemma 4 hacia ES, con la regla de idioma enterrada al final y sin suficiente peso semántico. Resuelto el 2026-05-08 en commit 917d69e.
Línea de tiempo
| Timestamp | Evento |
|---|---|
| Anterior a 2026-05-08 | Comportamiento incorrecto en producción. Identificado internamente como bug s53 (querys muy abiertas / respuestas en ES forzadas). |
| 2026-05-08T15:37:33Z | Fix mergeado a main por @Esquembri (commit 917d69e). |
Causa raíz
System prompt en español → sesgo lingüístico del modelo
El system prompt de synthesizeAnswer estaba íntegramente redactado en español:
Eres el asistente de ayuda de CreaRack Pro...
ESTILO obligatorio:
- Tono natural y coloquial...
- Idioma: el de la pregunta. ← regla al final, poco peso
Gemma 4 interpreta el idioma de las instrucciones como señal fuerte del idioma esperado en la respuesta. La regla Idioma: el de la pregunta al final del prompt tenía poco peso semántico frente a la masa del resto del texto en ES.
Fallbacks sin detección de idioma
Los mensajes de fallback (no matches, JSON malformado) estaban hardcodeados en español, ignorando el idioma del usuario.
Impacto
- Usuarios afectados: cualquier usuario que usara el Help Widget o
bib_asken inglés. - Severidad: media — funcionalidad degradada (respuesta comprensible pero en idioma incorrecto), no pérdida de datos ni downtime.
- Módulos afectados:
functions/api/mcp/handlers/archivo-core.ts,functions/api/mcp/handlers/archivo.ts.
Solución aplicada
1. System prompt reescrito en inglés (idioma neutro de instrucciones)
El system prompt de synthesizeAnswer se migró completamente a inglés — idioma técnicamente neutro para instrucciones — con la regla de idioma al principio, en mayúsculas y marcada como crítica:
LANGUAGE (CRITICAL — non-negotiable):
- Respond in the EXACT SAME language as the user's question.
- If the user writes in English, answer in English.
- If the user writes in Spanish, answer in Spanish.
- Never switch languages mid-answer. Never translate the question first.
2. Nueva utility detectLanguage
Se introdujo detectLanguage(text: string): 'en' | 'es' para los caminos de fallback donde el modelo no llega a generar respuesta. Usa heurística regex con 30 marcadores léxicos EN. Default 'es'.
3. Fallbacks bilingües
Ambos fallbacks actualizados para retornar el mensaje en el idioma detectado:
archivo.ts— fallback “no matches”.archivo-core.ts— fallback “JSON malformado / query demasiado amplia”.
Frontend
El Help Widget no requirió cambios. Sigue enviando { question, app } al handler. La detección de idioma opera 100% en el backend (modelo en caso normal, detectLanguage en fallbacks).
Lecciones aprendidas
- El idioma de las instrucciones importa: los LLMs tienden a responder en el mismo idioma de su system prompt. Instrucciones técnicas en inglés + regla de idioma explícita al principio es el patrón correcto.
- Las reglas críticas van al principio: enterrar una restricción al final de un prompt largo reduce su efectividad. Poner
LANGUAGE (CRITICAL)antes del contenido principal fue suficiente para corregir el comportamiento. - Los fallbacks también tienen idioma: mensajes hardcodeados de error/fallback deben ser bilingües o parametrizados. Una utility ligera de detección cubre el caso sin overhead.
Estado
✅ Resuelto — commit 917d69e en main (2026-05-08).
Véase también
- [[entity—biblioteca—function—detect-language]]
- [[entity—biblioteca—function—synthesize-answer]]
- [[entity—biblioteca—handler—archivo-core]]
- [[entity—biblioteca—handler—archivo]]
- [[feature—biblioteca—help-widget]]