Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Rejestrowanie i rejestrowanie agentów sztucznej inteligencji

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej.

Rejestrowanie agentów sztucznej inteligencji przy użyciu struktury agenta Mozaika AI. Rejestrowanie agenta jest podstawą procesu programowania. Rejestrowanie przechwytuje "punkt w czasie" kodu i konfiguracji agenta, dzięki czemu można ocenić jakość konfiguracji.

Wymagania

Przed zalogowaniem utwórz agenta sztucznej inteligencji.

Rejestrowanie oparte na kodzie a rejestrowanie oparte na serializacji

Możesz użyć rejestrowania MLflow opartego na kodzie lub rejestrowania opartego na serializacji MLflow. Usługa Databricks zaleca używanie rejestrowania opartego na kodzie.

Rejestrowanie MLflow oparte na kodzie: kod łańcucha jest przechwytywany jako plik w języku Python. Środowisko języka Python jest przechwytywane jako lista pakietów. Po wdrożeniu łańcucha środowisko języka Python zostanie przywrócone, a kod łańcucha jest wykonywany w celu załadowania łańcucha do pamięci, aby można go było wywołać po wywołaniu punktu końcowego.

Rejestrowanie MLflow oparte na serializacji: kod łańcucha i bieżący stan w środowisku języka Python są serializowane na dysku, często przy użyciu bibliotek, takich jak pickle lub joblib. Po wdrożeniu łańcucha środowisko języka Python zostanie przywrócone, a serializowany obiekt zostanie załadowany do pamięci, aby można go było wywołać po wywołaniu punktu końcowego.

W tabeli przedstawiono zalety i wady każdej metody.

Method Zalety Wady
Rejestrowanie MLflow oparte na kodzie — Pozwala przezwyciężyć nieodłączne ograniczenia serializacji, które nie są obsługiwane przez wiele popularnych bibliotek GenAI.
— Zapisuje kopię oryginalnego kodu do późniejszego odwołania.
— Nie trzeba restrukturyzacji kodu w pojedynczy obiekt, który można serializować.
log_model(...)element musi być wywoływany z innego notesu niż kod łańcucha (nazywany notesem sterownika).
Rejestrowanie MLflow oparte na serializacji log_model(...) można wywołać z tego samego notesu, w którym zdefiniowany jest model. - Oryginalny kod jest niedostępny.
— Wszystkie biblioteki i obiekty używane w łańcuchu muszą obsługiwać serializacji.

W przypadku rejestrowania opartego na kodzie kod, kod rejestrujący agenta lub łańcuch musi znajdować się w oddzielnym notesie od kodu łańcucha. Ten notes jest nazywany notesem sterownika. Przykładowy notes można znaleźć w temacie Przykładowe notesy.

Rejestrowanie oparte na kodzie za pomocą usługi LangChain

  1. Utwórz notes lub plik w języku Python przy użyciu kodu. Na potrzeby tego przykładu notes lub plik ma nazwę chain.py. Notes lub plik musi zawierać łańcuch LangChain, określany tutaj jako lc_chain.
  2. Dołącz mlflow.models.set_model(lc_chain) do notesu lub pliku.
  3. Utwórz nowy notes, który będzie służył jako notes sterownika (nazywany driver.py w tym przykładzie).
  4. W notesie sterownika użyj polecenia mlflow.lang_chain.log_model(lc_model=”/path/to/chain.py”), aby uruchomić chain.py i zarejestrować wyniki w modelu MLflow.
  5. Wdróż model. Zobacz Wdrażanie agenta na potrzeby generowania aplikacji sztucznej inteligencji. Wdrożenie agenta może zależeć od innych zasobów usługi Databricks, takich jak indeks wyszukiwania wektorowego i model obsługujący punkty końcowe. Dla agentów LangChain:
    • Narzędzie MLflow log_model wywnioskuje zależności wymagane przez łańcuch i rejestruje je MLmodel w pliku w zarejestrowanym artefaktzie modelu. Począwszy od biblioteki Mlflow w wersji 2.17.0, można zastąpić te zależności wnioskowane. Zobacz Określanie zasobów dla agenta PyFunc lub LangChain.
    • Podczas wdrażania databricks.agents.deploy automatycznie tworzy tokeny OAuth M2M wymagane do uzyskiwania dostępu do tych zależności zasobów wnioskowanych i komunikowania się z nimi.
  6. Po załadowaniu chain.py środowiska obsługującego jest wykonywane.
  7. Gdy pojawia się żądanie obsługi, lc_chain.invoke(...) jest wywoływane.

import mlflow

code_path = "/Workspace/Users/first.last/chain.py"
config_path = "/Workspace/Users/first.last/config.yml"

input_example = {
    "messages": [
        {
            "role": "user",
            "content": "What is Retrieval-augmented Generation?",
        }
    ]
}

# example using LangChain
with mlflow.start_run():
  logged_chain_info = mlflow.langchain.log_model(
    lc_model=code_path,
    model_config=config_path, # If you specify this parameter, this is the configuration that is used for training the model. The development_config is overwritten.
    artifact_path="chain", # This string is used as the path inside the MLflow model where artifacts are stored
    input_example=input_example, # Must be a valid input to your chain
    example_no_conversion=True, # Required
  )

print(f"MLflow Run: {logged_chain_info.run_id}")
print(f"Model URI: {logged_chain_info.model_uri}")

# To verify that the model has been logged correctly, load the chain and call `invoke`:
model = mlflow.langchain.load_model(logged_chain_info.model_uri)
model.invoke(example)

Rejestrowanie oparte na kodzie za pomocą funkcji PyFunc

  1. Utwórz notes lub plik w języku Python przy użyciu kodu. Na potrzeby tego przykładu notes lub plik ma nazwę chain.py. Notes lub plik musi zawierać klasę PyFunc, o której mowa tutaj jako PyFuncClass.
  2. Dołącz mlflow.models.set_model(PyFuncClass) do notesu lub pliku.
  3. Utwórz nowy notes, który będzie służył jako notes sterownika (nazywany driver.py w tym przykładzie).
  4. W notesie sterownika użyj polecenia mlflow.pyfunc.log_model(python_model=”/path/to/chain.py”, resources=”/path/to/resources.yaml”) , aby uruchomić chain.py i zarejestrować wyniki w modelu MLflow. Parametr resources deklaruje wszystkie zasoby potrzebne do obsługi modelu, takie jak indeks wyszukiwania wektorowego lub obsługujący punkt końcowy obsługujący model podstawowy. Aby uzyskać przykładowy plik zasobów dla funkcji PyFunc, zobacz Określanie zasobów dla agenta PyFunc lub LangChain.
  5. Wdróż model. Zobacz Wdrażanie agenta na potrzeby generowania aplikacji sztucznej inteligencji.
  6. Po załadowaniu chain.py środowiska obsługującego jest wykonywane.
  7. Gdy pojawia się żądanie obsługi, PyFuncClass.predict(...) jest wywoływane.
import mlflow

code_path = "/Workspace/Users/first.last/chain.py"
config_path = "/Workspace/Users/first.last/config.yml"

input_example = {
    "messages": [
        {
            "role": "user",
            "content": "What is Retrieval-augmented Generation?",
        }
    ]
}

# example using PyFunc model

resources_path = "/Workspace/Users/first.last/resources.yml"

with mlflow.start_run():
  logged_chain_info = mlflow.pyfunc.log_model(
    python_model=chain_notebook_path,
    artifact_path="chain",
    input_example=input_example,
    resources=resources_path,
    example_no_conversion=True,
  )

print(f"MLflow Run: {logged_chain_info.run_id}")
print(f"Model URI: {logged_chain_info.model_uri}")

# To verify that the model has been logged correctly, load the chain and call `invoke`:
model = mlflow.pyfunc.load_model(logged_chain_info.model_uri)
model.invoke(example)

Określanie zasobów dla agenta PyFunc lub LangChain

Możesz określić zasoby, takie jak indeks wyszukiwania wektorowego i punkt końcowy obsługujący, które są wymagane do obsługi modelu.

W przypadku aplikacji LangChain zasoby są automatycznie wykrywane i rejestrowane w modelu przy użyciu podejścia do najlepszego nakładu pracy. Począwszy od platformy MLflow w wersji 2.17.0, można zastąpić te automatycznie wnioskowane zasoby przy użyciu kodu podobnego do przedstawionego poniżej. Jest to zalecane w przypadku przypadków użycia w środowisku produkcyjnym, ponieważ pozwala zagwarantować, że agenci są rejestrowani z niezbędnymi zależnościami.

Podczas wdrażania agenta smakowego pyfunc należy ręcznie dodać wszystkie zależności zasobów wdrożonego agenta. Token OAuth M2M z dostępem do wszystkich określonych zasobów w parametrze resources jest tworzony i udostępniany wdrożonemu agentowi.

Uwaga

Możesz zastąpić zasoby, do których punkt końcowy ma uprawnienia, ręcznie określając zasoby podczas rejestrowania łańcucha.

Poniższy kod określa zależności przy użyciu parametru resources .

import mlflow
from mlflow.models.resources import (
    DatabricksFunction,
    DatabricksServingEndpoint,
    DatabricksSQLWarehouse,
    DatabricksVectorSearchIndex,
)

with mlflow.start_run():
  logged_chain_info = mlflow.pyfunc.log_model(
    python_model=chain_notebook_path,
    artifact_path="chain",
    input_example=input_example,
    example_no_conversion=True,
    resources=[
      DatabricksServingEndpoint(endpoint_name="databricks-mixtral-8x7b-instruct"),
      DatabricksServingEndpoint(endpoint_name="databricks-bge-large-en"),
      DatabricksVectorSearchIndex(index_name="prod.agents.databricks_docs_index"),
      DatabricksSQLWarehouse(warehouse_id="your_warehouse_id"),
      DatabricksFunction(function_name="ml.tools.python_exec"),
    ]
  )

Możesz również dodać zasoby, określając je w resources.yaml pliku. Możesz odwołać się do tej ścieżki pliku w parametrze resources . Token OAuth M2M z dostępem do wszystkich określonych zasobów w obiekcie resources.yaml jest tworzony i udostępniany wdrożonemu agentowi.

Poniżej znajduje się przykładowy resources.yaml plik, który definiuje model obsługujący punkty końcowe i indeks wyszukiwania wektorów.


api_version: "1"
databricks:
  vector_search_index:
    - name: "catalog.schema.my_vs_index"
  serving_endpoint:
    - name: databricks-dbrx-instruct
    - name: databricks-bge-large-en

Rejestrowanie łańcucha w wykazie aparatu Unity

Przed wdrożeniem łańcucha należy zarejestrować łańcuch w katalogu aparatu Unity. Podczas rejestrowania łańcucha jest on pakowany jako model w katalogu aparatu Unity i można użyć uprawnień wykazu aparatu Unity do autoryzacji dla zasobów w łańcuchu.

import mlflow

mlflow.set_registry_uri("databricks-uc")

catalog_name = "test_catalog"
schema_name = "schema"
model_name = "chain_name"

model_name = catalog_name + "." + schema_name + "." + model_name
uc_model_info = mlflow.register_model(model_uri=logged_chain_info.model_uri, name=model_name)

Następne kroki