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.
Przed zalogowaniem utwórz agenta sztucznej inteligencji.
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.
- 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 jakolc_chain
. - Dołącz
mlflow.models.set_model(lc_chain)
do notesu lub pliku. - Utwórz nowy notes, który będzie służył jako notes sterownika (nazywany
driver.py
w tym przykładzie). - 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. - 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 jeMLmodel
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.
- Narzędzie MLflow
- Po załadowaniu
chain.py
środowiska obsługującego jest wykonywane. - 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)
- 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 jakoPyFuncClass
. - Dołącz
mlflow.models.set_model(PyFuncClass)
do notesu lub pliku. - Utwórz nowy notes, który będzie służył jako notes sterownika (nazywany
driver.py
w tym przykładzie). - 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. Parametrresources
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. - Wdróż model. Zobacz Wdrażanie agenta na potrzeby generowania aplikacji sztucznej inteligencji.
- Po załadowaniu
chain.py
środowiska obsługującego jest wykonywane. - 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)
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
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)
- Dodawanie śladów do agenta sztucznej inteligencji.
- Wdrażanie agenta sztucznej inteligencji.