Appearance
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:
| Herramienta | Qué hace |
|---|---|
resolve_metric | Traduce lo que el usuario pide a un indicador concreto del corpus. |
get_parameter_data | Recupera el valor de un indicador por país, con su cita. |
search_corpus / get_dataset | Búsqueda semántica sobre el corpus y acceso directo a un dataset catalogado. |
compare_countries | Compara países sobre un indicador. |
get_news / get_regional_pulse | Noticias citadas y pulso regional. |
compute | Cálculo determinista. Incluye pronósticos (marcados como proyección, no como hecho) y explain_change (que declara asociación, no causalidad). |
get_data_health | Estado de salud y frescura del dato. |
get_discoveries | Hallazgos horneados (movimientos, anomalías). |
find_pilots / get_pilot | Pilotos bancables por criterio y ficha de piloto. |
recommend_action | Encadena piloto → instrumento de financiamiento → tomador de decisión: del dato a la acción. |
web_search / fetch_url / perplexity_search | Bú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):
- Extracción de afirmaciones — determinista, sobre los tokens
[[cite:id]]. - Juez LLM — clasifica cada afirmación como
SUPPORTED/PARTIAL/UNSUPPORTEDcontra sus fuentes. - Auto-corrección de una pasada — si algo no está soportado, el handler reintenta una vez para corregirlo.
- 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.