Powrót do strony głównej

MCP agent w Open WebUI: narzędzia i ReWOO

Artykuł opisuje ewolucję agenta MCP w Open WebUI: od podstawowych narzędzi ClickHouse do ReWOO z planistą. Deterministyczne narzędzia Pydantic wykluczają halucynacje SQL, wyszukiwanie pełnotekstowe przyspiesza analizę dużych danych.

Jak zbudować agenta MCP z planistą w Open WebUI
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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

Advertisement 728x90

Czytaj dalej