Tworzenie agenta z MCP w Open WebUI: od prostych narzędzi do planisty
Agent w Open WebUI dla MCP zaczyna się od prostoty — dostarczamy LLM zestaw narzędzi do pracy z ClickHouse i obserwujemy. Na początku dostępne są trzy podstawowe: list_databases, list_tables, run_select_queries. Dla prostych zapytań SQL wystarczy, ale przy skomplikowaniu zadania model nie rozumie struktury danych.
Rozwiązanie: szczegółowy prompt z przykładami zapytań. Struktura zawiera zmienne (portfolio_name, start_date, end_date), instrukcje dotyczące filtrów LIKE oraz wzorce typu Dt::date >= '{start_date}'. Przykład zapytania dotyczący rentowności portfela wykorzystuje funkcje okienkowe:
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;
Wyniki są lepsze, ale niestabilne: błędy składni, niepoprawne metryki. RAG w Open WebUI nie pomaga.
Rozszerzanie arsenalu: niestandardowe narzędzia bez halucynacji
Przejście do determinizmu — tworzymy gotowe narzędzia na schematach Pydantic. LLM wybiera tylko i parametryzuje, zapytania są stałe. Klasy narzędzi:
ClickHouseClientBase: otoczka nad podstawowymi operacjami MCP.ProfitTool: rentowność (TWR według dat, arytmetyczna/geometria).PortfolioDiscoveryTool: atrybuty portfeli (lista, typy, strategie).PortfolioCashflowTool: przepływy pieniężne, CASHFLOW.
Przykład schematu dla ClickHouseClientBaseParams:
class ClickHouseClientBaseParams(BaseModel):
operation: Literal['list_databases', 'list_tables', 'run_select_query'] = Field(
description='Typ operacji: list_databases, list_tables lub run_select_query'
)
database: Optional[str] = Field(default=None, description='Nazwa bazy danych')
query: Optional[str] = Field(default=None, description='Zapytanie SQL')
like: Optional[str] = Field(default=None, description='Filtr LIKE')
not_like: Optional[str] = Field(default=None, description='Filtr NOT LIKE')
def clickhouse_client_base(params: ClickHouseClientBaseParams) -> str:
# Logika zapytań do http://clickhouse-mcp.services.kfim.int
# Obsługa list_databases, list_tables, run_select_query
# Automatyczna zamiana contribution_twr_1s_mcp na pełne imię
Funkcja pydantic_to_openai_schema konwertuje schematy do formatu OpenAI dla LLM. To eliminuje halucynacje: narzędzie zawsze zwraca spójny JSON.
Zalety podejścia:
- Determinizm: ten sam wejście — ten sam wynik.
- Skalowalność: nowe metryki dodaje się jako narzędzia.
- Debugowanie: logika zapytań jest przejrzysta, bez czarnej skrzynki LLM.
Problemy prostoty: gdy narzędzi brakuje
Naiwny agent psuje się na skomplikowanych zadań: wiele portfeli, agregacje, JOIN-y. Model myli funkcje okienkowe, filtry dat. Nawet z przykładami — 30–40% błędów. Skala analizy portfelowej wymaga przetwarzania dużych zbiorów danych: tysiące wierszy TWR, cashflow.
Ulepszenie: podział na planistę i wykonawcę
Drugie ulepszenie — agent jak ReWOO: Reason + Act. Planista (oddzielny LLM) dzieli zadanie na kroki, wykonawca wywołuje narzędzia. Rozwiązuje to:
- Filtrowanie danych: pełnotekstowy wyszukiwarka po portfelach przez
PortfolioDiscoveryTool. - Kolejność: łańcuch zapytań (lista → filtr → agregacja).
- Kontekst: tabele łączy się w jedną dla UI.
Planista generuje plan:
- Krok 1: listuj portfele LIKE '%name%'.
- Krok 2: run_query dla TWR.
- Krok 3: agregacja i wyświetlenie.
Wykonawca ścisłe przestrzega planu, bez improvisacji.
Wyszukiwanie pełnotekstowe w działaniu
Dla dużych tabel — wstępne filtrowanie. Narzędzie szuka według lowerUTF8(Portfolio) LIKE '%query%', zwraca ID/tipy. To przyspiesza run_select_query: zamiast pełnego skanowania — precyzyjne zapytanie.
Przykład łańcucha:
PortfolioDiscoveryTool(like='akcje')→ lista ID.ProfitTool(portfolios=ids, dates=range)→ TWR.- Łączenie w Pandas/DataFrame dla UI.
Co ważne
- Deterministyczne narzędzia na Pydantic minimalizują błędy LLM w SQL.
- Podejście ReWOO dzieli planowanie i wykonanie dla skomplikowanych łańcuchów.
- Wyszukiwanie pełnotekstowe jest kluczowe do filtrowania w dużych zbiorach danych ClickHouse.
- Integracja z Open WebUI umożliwia kolejne wywołania z końcowym renderowaniem tabeli.
- Chain-of-thought w promptach poprawia stabilność nawet słabych modeli.
— Editorial Team
Brak komentarzy.