Registro de agentes de IA
Importante
Esta característica está en versión preliminar pública.
Registro de agentes de IA mediante Mosaic AI Agent Framework. Registrar un agente es la base del proceso de desarrollo. Al registrar se captura un "momento dado" del código y la configuración del agente para que pueda evaluar la calidad de la configuración.
Requisitos
Cree un agente de IA antes de registrarlo.
Registro basado en código frente al registro basado en serialización
Puede usar el registro de MLflow basado en código o el registro de MLflow basado en serialización. Databricks recomienda usar el registro basado en código.
Registro de MLflow basado en código: el código de la cadena se captura como archivo Python. El entorno de Python se captura como lista de paquetes. Cuando se implementa la cadena, se restaura el entorno de Python y el código de la cadena se ejecuta para cargarla en la memoria, por lo que se puede invocar cuando se llama al punto de conexión.
Registro de MLflow basado en serialización: el código de la cadena y el estado actual del entorno de Python se serializan en el disco, para lo que a menudo se usan bibliotecas como pickle
o joblib
. Cuando se implementa la cadena, se restaura el entorno de Python y el objeto serializado se carga en la memoria, por lo que se puede invocar cuando se llama al punto de conexión.
La tabla muestra las ventajas y desventajas de cada método.
Método | Ventajas | Inconvenientes |
---|---|---|
Registro de MLflow basado en código | - Supera las limitaciones inherentes de la serialización, no compatible con muchas bibliotecas populares de GenAI. - Guarda una copia del código original para consultarla más adelante. - No es necesario reestructurar el código en un solo objeto que se pueda serializar. |
Debe llamarse a log_model(...) desde un cuaderno distinto al del código de la cadena (llamado cuaderno de controlador). |
Registro de MLflow basado en serialización | Puede llamarse a log_model(...) desde el mismo cuaderno donde se define el modelo. |
- El código original no está disponible. - Todas las bibliotecas y objetos usados en la cadena deben admitir la serialización. |
Para el registro basado en código, el código que registra el agente o la cadena debe estar en un cuaderno independiente del código de la cadena. Este cuaderno se denomina cuaderno de controlador. Para ver un cuaderno de ejemplo, consulte Cuadernos de ejemplo.
Registro basado en código con LangChain
- Cree un cuaderno o un archivo de Python con el código. Para los fines de este ejemplo, el cuaderno o el archivo se denomina
chain.py
. El cuaderno o el archivo deben contener una cadena LangChain, aquí denominadalc_chain
. - Incluya
mlflow.models.set_model(lc_chain)
en el cuaderno o el archivo. - Cree un cuaderno que actúe como cuaderno de controlador (denominado
driver.py
en este ejemplo). - En el cuaderno del controlador, use
mlflow.lang_chain.log_model(lc_model=”/path/to/chain.py”)
para ejecutarchain.py
y registrar los resultados en un modelo de MLflow. - Se implementa el modelo. Consulte Implementación de un agente para una aplicación de IA generativa.
La implementación del agente puede depender de otros recursos de Databricks, como un índice de búsqueda vectorial y un modelo que atiende los puntos de conexión. Para los agentes de LangChain:
- MLflow
log_model
deduce las dependencias requeridas por la cadena y las registra en el archivoMLmodel
en el artefacto del modelo registrado. A partir de mlflow versión 2.17.0, puede invalidar estas dependencias inferidas. Consulte Especificar recursos para el agente PyFunc o LangChain. - Durante la implementación,
databricks.agents.deploy
crea automáticamente los tokens de OAuth de M2M necesarios para acceder a estas dependencias de recursos inferidas y comunicarse con ellas.
- MLflow
- Cuando se carga el entorno de servicio, se ejecuta
chain.py
. - Cuando se recibe una solicitud de servicio, se llama a
lc_chain.invoke(...)
.
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)
Registro basado en código con PyFunc
- Cree un cuaderno o un archivo de Python con el código. Para los fines de este ejemplo, el cuaderno o el archivo se denomina
chain.py
. El cuaderno o el archivo deben contener una clase PyFunc, aquí denominadaPyFuncClass
. - Incluya
mlflow.models.set_model(PyFuncClass)
en el cuaderno o el archivo. - Cree un cuaderno que actúe como cuaderno de controlador (denominado
driver.py
en este ejemplo). - En el cuaderno del controlador, use
mlflow.pyfunc.log_model(python_model=”/path/to/chain.py”, resources=”/path/to/resources.yaml”)
para ejecutarchain.py
y registrar los resultados en un modelo de MLflow. Elresources
parámetro declara los recursos necesarios para atender el modelo, como un índice de búsqueda vectorial o un punto de conexión de servicio que sirve a un modelo de base. Para obtener un archivo de recursos de ejemplo para PyFunc, consulte Especificar recursos para el agente PyFunc o LangChain. - Se implementa el modelo. Consulte Implementación de un agente para una aplicación de IA generativa.
- Cuando se carga el entorno de servicio, se ejecuta
chain.py
. - Cuando se recibe una solicitud de servicio, se llama a
PyFuncClass.predict(...)
.
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)
Especificar recursos para el agente PyFunc o LangChain
Puede especificar recursos, como un índice de búsqueda vectorial y un punto de conexión de servicio, que son necesarios para servir el modelo.
Para LangChain, los recursos se detectan y registran automáticamente con el modelo mediante un enfoque de mejor esfuerzo. A partir de la versión 2.17.0 de MLflow, puede invalidar estos recursos inferidos automáticamente mediante código similar al que se muestra a continuación. Esto se recomienda para casos de uso de producción, ya que permite asegurarse de que los agentes se registran con las dependencias necesarias.
Al implementar un agente de tipo pyfunc
, debe agregar manualmente las dependencias de recursos del agente implementado. Se crea un token de OAuth de M2M con acceso a todos los recursos especificados del resources
parámetro y se proporciona al agente implementado.
Nota:
Para invalidar los recursos a los que tiene permiso el punto de conexión, especifique manualmente los recursos al registrar la cadena.
El código siguiente especifica las dependencias mediante el resources
parámetro .
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"),
]
)
También puede agregar recursos si los especifica en un archivo resources.yaml
. Puede hacer referencia a esa ruta de acceso del archivo en el parámetro resources
. Se crea un token de OAuth de M2M con acceso a todos los recursos especificados en el resources.yaml
y se proporciona al agente implementado.
A continuación se muestra un archivo de ejemplo resources.yaml
que define los puntos de conexión de servicio del modelo y un índice de búsqueda vectorial.
api_version: "1"
databricks:
vector_search_index:
- name: "catalog.schema.my_vs_index"
serving_endpoint:
- name: databricks-dbrx-instruct
- name: databricks-bge-large-en
Registro de la cadena en Unity Catalog
Antes de implementar la cadena, debe registrarla en Unity Catalog. Al registrar la cadena, se empaqueta como modelo en Unity Catalog y puede usar los permisos de Unity Catalog para la autorización de los recursos de la cadena.
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)