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





























