Skip to content

El asistente (chat)

El asistente de Futuros no es un chatbot que "sabe cosas". Es una capa de razonamiento sobre el corpus verificado: toda cifra que enuncia viene de un resultado de herramienta, ligada a su cita, nunca de la memoria del modelo. Esa disciplina es lo que lo distingue de un asistente genérico — y lo que lo hace utilizable por un regulador o un inversor. Vive sobre todo en /sala y encarna el Pilar 2 — Modelo Soberano: el foso no son los pesos base, es el corpus con procedencia y la disciplina de anclaje.

Reglas de anclaje

Las reglas son estrictas y explícitas:

  • Cada figura sale de un resultado de herramienta, marcada con un token [[cite:id]]. Sin herramienta, no hay número.
  • Sin respuestas de memoria. El modelo no rellena cifras de su entrenamiento; si no las obtuvo de una herramienta, dice que no las tiene.
  • Las contradicciones se muestran. Si dos fuentes discrepan, el asistente lo señala en vez de promediar en silencio.
  • El vintage se marca. Una cifra vieja se presenta con su año, no como si fuera actual.

La suite de herramientas

El asistente actúa a través de herramientas deterministas (agente con MAX_TOOL_ROUNDS=6). En lenguaje llano:

HerramientaQué hace
resolve_metricTraduce lo que el usuario pide a un indicador concreto del corpus.
get_parameter_dataRecupera el valor de un indicador por país, con su cita.
search_corpus / get_datasetBúsqueda semántica sobre el corpus y acceso directo a un dataset catalogado.
compare_countriesCompara países sobre un indicador.
get_news / get_regional_pulseNoticias citadas y pulso regional.
computeCálculo determinista. Incluye pronósticos (marcados como proyección, no como hecho) y explain_change (que declara asociación, no causalidad).
get_data_healthEstado de salud y frescura del dato.
get_discoveriesHallazgos horneados (movimientos, anomalías).
find_pilots / get_pilotPilotos bancables por criterio y ficha de piloto.
recommend_actionEncadena piloto → instrumento de financiamiento → tomador de decisión: del dato a la acción.
web_search / fetch_url / perplexity_searchBúsqueda externa, último recurso y visiblemente badgeada.

La clave de diseño: agregar un dataset (server/chat/datasets.ts) lo vuelve automáticamente catalogado, recuperable y buscable — sin escribir código de herramienta nuevo. La recuperación combina embeddings Voyage (voyage-3-lite, 512-dim) sobre search-index.json con un respaldo BM25/keyword y reranking.

Verificación de fidelidad

Antes de entregar una respuesta, el asistente se audita a sí mismo (server/chat/faithfulness.ts):

  1. Extracción de afirmaciones — determinista, sobre los tokens [[cite:id]].
  2. Juez LLM — clasifica cada afirmación como SUPPORTED / PARTIAL / UNSUPPORTED contra sus fuentes.
  3. Auto-corrección de una pasada — si algo no está soportado, el handler reintenta una vez para corregirlo.
  4. Compuerta de suficiencia (sufficiency.ts) — si la evidencia no alcanza, refina de forma acotada o declara la insuficiencia en vez de inventar.

El resultado viaja a la interfaz en un evento verify que incluye las afirmaciones, cuáles son rastreables, sus fuentes, las figuras sin cita y las contradicciones detectadas. De ahí sale la insignia de confianza que ve el usuario: una lectura honesta de cuán anclada quedó la respuesta, no un adorno.

También hay defensa contra inyección de prompt: quarantine.ts aísla el contenido no confiable traído por herramientas para que no reescriba las instrucciones del asistente.

La cadena de proveedores y el modo soberano

server/chat/provider.ts selecciona el proveedor de inferencia en este orden: soberano → OpenRouter → Anthropic. La función usingSovereign() comprueba si están configuradas SOVEREIGN_INFERENCE_URL / _KEY; si lo están, la inferencia corre en un gateway en-región (LiteLLM/vLLM) sobre pesos abiertos, y el corpus y la consulta nunca salen del host. Esa es la costura del Pilar 2: la soberanía es un toggle de proveedor, no una reescritura, y la calidad de frontera sigue siendo el default hasta alcanzar paridad en las evaluaciones.

Cuando el modo soberano está activo, el proveedor activo se transmite como evento SSE provider y la interfaz muestra una insignia de "modo soberano": el usuario sabe, en la propia conversación, dónde vive la inferencia que está leyendo.

Búsqueda externa como último recurso

La web abierta solo se usa cuando el corpus no basta, y siempre badgeada como externa (citas web-). Un hecho de la web nunca se presenta al mismo nivel que un dato del corpus verificado — la separación es visible, como se explica en Procedencia y citas.

Handoffs

El asistente no es un callejón sin salida. Puede pasar el control a superficies analíticas: a /explorar para consultar los datos con SQL en el navegador (DuckDB-WASM), y a un tablero de embed (/embed/board) para fijar y compartir un conjunto de hallazgos con su procedencia intacta. El mismo corpus y las mismas herramientas se exponen a agentes externos vía el servidor MCP.


En una frase: el asistente convierte un corpus con procedencia en respuestas que declaran su propia confianza, corrigen lo que no soportan, y dicen dónde corre su inferencia. La disciplina de honestidad que lo rige se detalla en Metodología y honestidad.

Cada cifra con su fuente — la trazabilidad es el contrato.