← volver a proyectos
Proyecto

Asesor de turismo — agente conversacional con mapa en vivo

Preguntás en lenguaje natural — "quiero ir a Hokkaido en primavera para ver los sakura" — y te devuelve puntos concretos en un mapa, cada uno con clima, tipo de cambio, distancia desde tu origen, contexto cultural e imagen: datos reales de 5 fuentes públicas, no inventados por el LLM. Continuación del pipeline Medallion, un escalón más arriba: agente con tool calling vía MCP, guardrails de seguridad y frontend mapa + chat de punta a punta.

Arquitectura
5 fuentes
Bronze (paralelo)
Silver
Gold (scoreada)
Agente (MCP)
Mapa + Chat

Bronze (5 fuentes en paralelo: Open-Meteo, Frankfurter, Wikivoyage/Wikimedia, OpenRouteService) → Silver → Gold ya scoreada → agente con tool calling MCP → frontend mapa + chat. Infra completa en Azure (Databricks Premium, ADLS Gen2, Key Vault) desplegada con Terraform; el Job corre en serverless compute.

Decisiones de ingeniería
Stack
Databricks Azure Terraform MCP / Tool calling FastAPI Leaflet
Ver repo en GitHub
El problema
Un agente de turismo que solo charla no sirve: necesita datos reales y verificables (clima, tipo de cambio, distancia, contexto cultural) elegidos por región — no un pin gigante sobre toda la isla — y guardrails para no salirse del dominio ni ejecutar lo que le pida el usuario dentro del prompt.
La solución
5 fuentes en Bronze (paralelo) → Silver → Gold ya scoreada, expuesta al agente como 5 tools vía MCP. Los 3 scores (clima, cambio, distancia) se calculan de forma determinística y testeable; el LLM entra recién para elegir puntos dentro de la región y redactar la respuesta, nunca para inventar el dato.
demo en video
Qué evalúa esto
Pregunta típica de entrevistaDónde está la respuesta
¿Cómo conectás un LLM a datos reales?agente/mcp_client.py, 5 tools MCP sobre la tabla Gold ya scoreada
¿Cómo evitás que el LLM invente datos?Scores deterministicos en scoring.py; el LLM solo redacta y elige dentro de la región
¿Cómo te protegés de prompt injection?agente/session.py + guardrails de scoping de dominio
¿Cómo integrás datos heterogéneos?Medallion multi-fuente: 5 tasks Bronze en paralelo, no una sola fuente
¿Cómo cerrás el círculo end-to-end?frontend/index.html, mapa + chat sobre FastAPI, sin build
¿Cómo manejás infra real (no Free Edition)?Terraform sobre Azure: Databricks Premium, ADLS Gen2, Key Vault