CreaRack-SL

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

TimestampEvento
Anterior a 2026-05-08Comportamiento incorrecto en producción. Identificado internamente como bug s53 (querys muy abiertas / respuestas en ES forzadas).
2026-05-08T15:37:33ZFix 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_ask en 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

  1. 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.
  2. 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.
  3. 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]]