Databricks AI Tools – typy i rejestracja

15-mar-2026

Tworząc tools możemy je rejestrować korzystając z SQL lub Python. Oto przykład funkcji SQL

  • Funkcja jest automatycznie rejestrowana w Unity Catalog
  • Istotne jest, żeby funkcja miała zdefiniowane metadane, jak np komentarz o tym kiedy i do czego wykorzystywać funkcję. Można dodatkowo dodać opisy parameterów (PARAMETER DESCRIPTION) lub informacje o zwracanej wartości (RETURNS COMMENT). Generalnie – im więcej tym lepiej, bo dzięki tym informacjom agent będzie mógł sobie wybrać, z której funkcji chce skorzystać.

CREATE OR REPLACE FUNCTION total_revenue_by_customer(customer_id STRING)
RETURNS DOUBLE
COMMENT 'Zwraca całkowity obrót wygenerowany przez klienta na podstawie tabeli transactions’
LANGUAGE SQL
AS
$$
SELECT SUM(amount)
FROM sales.transactions
WHERE customer_id = total_revenue_by_customer.customer_id
$$;

Druga możliwość to utworzenie tool przez Python

  • Dzięki użyciu DatabricksFunctionClient() ta funkcja będzie zarejestrowana w Unity Catalog
  • Dekorator @client.register(…) umożliwia przekazanie metadanych, które opisują działanie funkcji.
  • Dzięki dodatkowym wywołaniom funkcji modułu mlflow, ta funkcja uzyskuje automatycznie możliwość śledzenia jej wykonań a także np. przekazane parametery wejściowe i wyliczony wynik.
from databricks.sdk import DatabricksFunctionClient
import mlflow

# Rejestracja funkcji jako narzędzia
client = DatabricksFunctionClient()

@client.register(
    name="total_revenue_by_customer",
    description="Oblicza całkowity obrót wygenerowany przez klienta na podstawie danych sprzedażowych",
    parameters=[{"name": "customer_id", "type": "string", "description": "Identyfikator klienta"}],
    returns={"type": "double", "description": "Całkowity obrót klienta"}
)
def total_revenue_by_customer(customer_id: str) -> float:
    # Śledzenie wykonania przez MLflow
    with mlflow.start_run(run_name=f"revenue_calc_{customer_id}"):
        mlflow.log_param("customer_id", customer_id)
        # Przykładowe zapytanie do Lakehouse
        query = f"SELECT SUM(amount) FROM sales.transactions WHERE customer_id = '{customer_id}'"
        result = spark.sql(query).collect()[0][0]
        mlflow.log_metric("total_revenue", result)
        return result

Teraz, kiedy użytkownik zapyta o obrót generowany przez klienta, to Agent połączy się do Unity Catalog i przejrzy, czy są dostępne jakieś funkcje, które taką informację mogłyby udostępnić. To dlatego tak ważne są komentarze przekazywane podczas tworzenia funkcji. Gdy właściwa funkcja zostanie znaleziona, to Agent ja wywoła, a mlflow zaloguje wywołanie funkcji.

Zauważ, że funkcje SQL nie mają natywnego wsparcia dla mlflow, ale można je dodać wywołując je z notebooka:

  • Ten kod automatycznie utworzy „wszystko co jest potrzebne” pod spodem, np. eksperyment z nazwą notebooka
  • Jeśli chcesz nadać inną nazwę eksperymentu dodaj mlflow.set_experiment(„/Shared/CustomerRevenueAudit”)
import mlflow

with mlflow.start_run(run_name="sql_revenue_audit"):
    mlflow.log_param("customer_id", 123)
    result = spark.sql("SELECT total_revenue_by_customer(123)").collect()[0][0]
    mlflow.log_metric("total_revenue", result)

W drugą stronę – usuwając z definicji funkcji pythonowej odwołania do mlflow, dostaniemy funkcję, która nadal będzie widoczna w Unity Catalog dla Agentów, ale której wykonania nie będą logowane.

Eksperymenty i historyczne informacje o uruchomieniach znajdziemy później w MLflow >> Experiments.

Można też odczytać wyniki eksperymentów programistycznie:

from mlflow import MlflowClient

client = MlflowClient()
experiment = client.get_experiment_by_name("/Shared/CustomerRevenueAudit")
runs = client.search_runs(experiment.experiment_id)

for run in runs:
    print(run.info.run_name, run.data.params, run.data.metrics)

No tak… więc znowu mamy nowy problem:

  • używać funkcji SQL czy Python?
  • korzystać z mlflow czy nie?

SQL czy Python?

Wydaje się, że Python jest lepszy, bo nie tylko pozwoli na utworzenie czy zmodyfikowanie funkcji, ale dodatkowo fajnie integruje sie z istniejącymi API i metodami do zarządzania tymi funkcjami. Można z poziomu Pythona listować funkcje, nadawać do nich uprawnienia, zmieniać metadane itp. Z poziomu SQL tego nie zrobimy…

MlFlow czy bez?

W enterprise, zawsze warto mieć dobry governance, audyt, logi itp. Dlatego MlFlow to dobry wybór

Komentarze są wyłączone

Autor: Rafał Kraik