Crear un agente MCP en Open WebUI: De herramientas básicas a un planificador
Un agente en Open WebUI para MCP comienza sencillo: le damos al modelo de lenguaje una serie de herramientas para interactuar con ClickHouse y observamos lo que sucede. Inicialmente, hay tres herramientas básicas disponibles: list_databases, list_tables y run_select_queries. Estas manejan consultas SQL directas, pero cuando las tareas se vuelven más complejas, el modelo tiene dificultades para entender los esquemas de datos.
Solución: un prompt detallado con ejemplos concretos. La estructura incluye variables (portfolio_name, start_date, end_date), instrucciones para filtros LIKE y patrones como Dt::date >= '{start_date}'. Por ejemplo, para calcular el rendimiento de un portafolio se usan funciones de ventana:
WITH log_coef as (SELECT Portfolio, Dt,
sum(log(TWR_dod+1)) OVER (
PARTITION BY InvestmentPortfolioID
ORDER BY Dt ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING
) AS TWR_cumulative_coef
FROM Contribution.contribution_twr_1s_mcp
WHERE lowerUTF8(Portfolio) LIKE '%{portfolio_name}%'
AND Dt::date >= {start_date}
AND Dt::date <= {end_date}
ORDER BY Dt DESC)
SELECT Portfolio, Dt, exp(TWR_cumulative_coef) - 1 AS TWR_cumulative
FROM log_coef;
Los resultados mejoran, pero siguen siendo inestables: errores de sintaxis, métricas incorrectas persisten. El RAG en Open WebUI no resuelve este problema.
Ampliando la herramienta: Herramientas personalizadas sin alucinaciones
Avanzar hacia la determinismo: creamos herramientas predefinidas usando esquemas Pydantic. El modelo solo selecciona y parametriza estas herramientas; las consultas son fijas. Las clases de herramientas incluyen:
ClickHouseClientBase: envoltorio alrededor de operaciones centrales de MCP.ProfitTool: calcula rendimientos (TWR por fecha, aritmético/geométrico).PortfolioDiscoveryTool: descubre atributos del portafolio (lista, tipos, estrategias).PortfolioCashflowTool: rastrea entradas/salidas, análisis de flujo de efectivo.
Ejemplo de esquema para ClickHouseClientBaseParams:
class ClickHouseClientBaseParams(BaseModel):
operation: Literal['list_databases', 'list_tables', 'run_select_query'] = Field(
description='Tipo de operación: list_databases, list_tables o run_select_query'
)
database: Optional[str] = Field(default=None, description='Nombre de la base de datos')
query: Optional[str] = Field(default=None, description='Consulta SQL')
like: Optional[str] = Field(default=None, description='Filtro LIKE')
not_like: Optional[str] = Field(default=None, description='Filtro NOT LIKE')
def clickhouse_client_base(params: ClickHouseClientBaseParams) -> str:
# Lógica para solicitudes HTTP a http://clickhouse-mcp.services.kfim.int
# Maneja list_databases, list_tables, run_select_query
# Reemplaza automáticamente contribution_twr_1s_mcp por el nombre completo de la tabla
La función pydantic_to_openai_schema convierte estos esquemas a formato compatible con OpenAI, eliminando alucinaciones: las herramientas siempre devuelven JSON predecible.
Beneficios de este enfoque:
- Determinismo: misma entrada → mismo resultado.
- Escalabilidad: nuevas métricas se añaden como herramientas.
- Depuración: la lógica de consulta es transparente, sin comportamientos de caja negra del modelo.
Los límites de la simplicidad: cuándo las herramientas fallan
Un agente ingenuo fracasa con tareas complejas: múltiples portafolios, agregaciones, JOINs. El modelo confunde funciones de ventana y filtros de fechas. Aun con ejemplos, las tasas de error alcanzan entre 30–40%. Escalar el análisis de portafolios requiere procesar grandes volúmenes de datos — miles de filas de TWR, registros de flujo de efectivo.
Mejora: Dividir en Planificador y Ejecutor
Segunda iteración: agente como ReWOO — Razonar + Actuar. El planificador (un modelo separado) descompone tareas en pasos; el ejecutor llama a las herramientas. Esto soluciona:
- Filtrado de datos: búsqueda full-text en portafolios mediante
PortfolioDiscoveryTool. - Control de secuencia: consultas encadenadas (listar → filtrar → agrupar).
- Gestión de contexto: tablas fusionadas en una sola para renderizado en UI.
El planificador genera un plan:
- Paso 1: listar portafolios LIKE '%name%'.
- Paso 2: ejecutar consulta para TWR.
- Paso 3: agrupar y mostrar.
El ejecutor sigue el plan estrictamente, sin improvisaciones.
Búsqueda full-text en acción
Para tablas grandes — el pre-filtrado es clave. La herramienta busca usando lowerUTF8(Portfolio) LIKE '%query%', devuelve IDs/tipos. Esto acelera run_select_query: en lugar de escaneos completos, se hacen consultas dirigidas.
Ejemplo de cadena:
PortfolioDiscoveryTool(like='stocks')→ devuelve lista de IDs.ProfitTool(portfolios=ids, dates=range)→ obtiene TWR.- Fusionar en Pandas/DataFrame para la interfaz.
Conclusiones clave
- Herramientas deterministas basadas en Pydantic reducen errores del modelo en SQL.
- El enfoque ReWOO separa planificación y ejecución para flujos complejos.
- La búsqueda full-text es esencial para filtrar en grandes conjuntos de datos de ClickHouse.
- La integración con Open WebUI permite llamadas secuenciales con renderizado final de tabla.
- Los prompts de pensamiento en cadena aumentan la estabilidad, incluso con modelos menos potentes.
— Editorial Team
Aún no hay comentarios.