다음을 통해 공유


AI 에이전트 기록 및 등록

Important

이 기능은 공개 미리 보기 상태입니다.

Mosaic AI 에이전트 프레임워크를 사용하여 AI 에이전트를 기록합니다. 에이전트 로깅은 개발 프로세스의 기초입니다. 로깅은 에이전트 코드 및 구성의 "지정 시간"을 캡처하므로 구성의 품질을 평가할 수 있습니다.

요구 사항

로깅하기 전에 AI 에이전트를 만듭니다.

코드 기반과 serialization 기반 로깅 비교

코드 기반 MLflow 로깅 또는 serialization 기반 MLflow 로깅을 사용할 수 있습니다. Databricks는 코드 기반 로깅을 사용하는 것이 좋습니다.

코드 기반 MLflow 로깅: 체인의 코드가 Python 파일로 캡처됩니다. Python 환경은 패키지 목록으로 캡처됩니다. 체인이 배포되면 Python 환경이 복원되고 체인의 코드가 실행되어 엔드포인트가 호출될 때 호출될 수 있도록 체인을 메모리에 로드합니다.

Serialization 기반 MLflow 로깅: Python 환경의 체인 코드와 현재 상태가 디스크로 직렬화되며, 종종 라이브러리(예: pickle 또는 joblib)를 사용합니다. 체인이 배포되면 Python 환경이 복원되고 직렬화된 개체가 메모리에 로드되므로 엔드포인트가 호출될 때 호출할 수 있습니다.

표에서는 각 메서드의 장점과 단점을 보여 줍니다.

메서드 장점 단점
코드 기반 MLflow 로깅 - 여러 인기 있는 GenAI 라이브러리에서 지원하지 않는 직렬화의 고유한 한계를 극복합니다.
- 나중에 참조할 수 있는 원래 코드의 복사본을 저장합니다.
- 직렬화할 수 있는 단일 개체로 코드를 재구성할 필요가 없습니다.
log_model(...)은 체인의 코드(드라이버 Notebook이라고 함)와 다른 Notebook에서 호출되어야 합니다.
Serialization 기반 MLflow 로깅 log_model(...)은 모델이 정의된 동일한 Notebook에서 호출할 수 있습니다. - 원래 코드를 사용할 수 없습니다.
- 체인에 사용되는 모든 라이브러리 및 개체는 직렬화를 지원해야 합니다.

코드 기반 로깅의 경우 에이전트 또는 체인을 기록하는 코드는 체인 코드와 별도의 Notebook에 있어야 합니다. 이 Notebook을 드라이버 Notebook이라고 합니다. Notebook 예제는 Notebook 예제를 참조하세요.

LangChain을 사용하는 코드 기반 로깅

  1. 코드를 사용하여 Notebook 또는 Python 파일을 만듭니다. 이 예제에서는 Notebook 또는 파일의 이름을 chain.py로 지정합니다. Notebook 또는 파일에는 여기에서 lc_chain으로 참조하는 LangChain 체인이 포함되어야 합니다.
  2. Notebook 또는 파일에 mlflow.models.set_model(lc_chain)을 포함합니다.
  3. 드라이버 Notebook으로 사용할 새 Notebook을 만듭니다(이 예제에서는 driver.py로 부름).
  4. 드라이버 Notebook에서 mlflow.lang_chain.log_model(lc_model=”/path/to/chain.py”)을 사용하여 chain.py를 실행하고 MLflow 모델에 결과를 기록합니다.
  5. 모델을 배포합니다. 생성형 AI 응용 프로그램에 대한 에이전트 배포를 참조하세요. 에이전트 배포는 벡터 검색 인덱스 및 엔드포인트를 제공하는 모델처럼 다른 Databricks 리소스에 따라 달라질 수 있습니다. LangChain 에이전트의 경우는 다음과 같습니다.
    • MLflow log_model은 체인에 필요한 종속성을 유추하고 이를 기록된 모델 아티팩트의 MLmodel 파일에 기록합니다. Mlflow 버전 2.17.0부터 이러한 유추된 종속성을 재정의할 수 있습니다. PyFunc 또는 LangChain 에이전트에 대한 리소스 지정을 참조하세요.
    • 배포하는 동안 databricks.agents.deploy는 이러한 유추된 리소스 종속성에 액세스하고 통신하는 데 필요한 M2M OAuth 토큰을 자동으로 만듭니다.
  6. 제공하는 환경이 로드되면 chain.py가 실행됩니다.
  7. 제공하는 요청이 들어오면 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)

PyFunc를 사용하는 코드 기반 로깅

  1. 코드를 사용하여 Notebook 또는 Python 파일을 만듭니다. 이 예제에서는 Notebook 또는 파일의 이름을 chain.py로 지정합니다. Notebook 또는 파일에는 여기에서 PyFuncClass로 참조하는 PyFunc 클래스가 포함되어야 합니다.
  2. Notebook 또는 파일에 mlflow.models.set_model(PyFuncClass)을 포함합니다.
  3. 드라이버 Notebook으로 사용할 새 Notebook을 만듭니다(이 예제에서는 driver.py로 부름).
  4. 드라이버 Notebook에서 mlflow.pyfunc.log_model(python_model=”/path/to/chain.py”, resources=”/path/to/resources.yaml”)을 사용하여 chain.py를 실행하고 MLflow 모델에 결과를 기록합니다. 매개 변수는 resources 기본 모델을 제공하는 벡터 검색 인덱스 또는 서비스 엔드포인트와 같은 모델을 제공하는 데 필요한 모든 리소스를 선언합니다. PyFunc에 대한 예제 리소스 파일은 PyFunc 또는 LangChain 에이전트에 대한 리소스 지정을 참조하세요.
  5. 모델을 배포합니다. 생성형 AI 응용 프로그램에 대한 에이전트 배포를 참조하세요.
  6. 제공하는 환경이 로드되면 chain.py가 실행됩니다.
  7. 제공하는 요청이 들어오면 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)

PyFunc 또는 LangChain 에이전트에 대한 리소스 지정

모델을 제공하는 데 필요한 벡터 검색 인덱스 및 서비스 엔드포인트와 같은 리소스를 지정할 수 있습니다.

LangChain의 경우 최상의 방법을 사용하여 리소스가 자동으로 검색되고 모델로 기록됩니다. MLflow 버전 2.17.0부터 아래와 유사한 코드를 사용하여 이러한 자동으로 유추된 리소스를 재정의할 수 있습니다. 에이전트가 필요한 종속성으로 기록되도록 할 수 있으므로 프로덕션 사용 사례에 권장됩니다.

pyfunc 버전이 지정된 에이전트를 배포할 때 배포된 에이전트의 모든 리소스 종속성을 수동으로 추가해야 합니다. resources 매개 변수에서 지정된 모든 리소스에 액세스할 수 있는 M2M OAuth 토큰이 만들어지고 배포된 에이전트에 제공됩니다.

참고 항목

체인을 로깅할 때 수동으로 리소스를 지정하여 엔드포인트에 사용 권한이 있는 리소스를 재정의할 수 있습니다.

다음 코드는 매개 변수를 사용하여 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"),
    ]
  )

resources.yaml 파일에 리소스를 지정하여 리소스를 추가할 수도 있습니다. resources 매개 변수에서 해당 파일 경로를 참조할 수 있습니다. resources.yaml에서 지정된 모든 리소스에 액세스할 수 있는 M2M OAuth 토큰이 만들어지고 배포된 에이전트에 제공됩니다.

다음은 엔드포인트 제공 모델 및 벡터 검색 인덱스를 정의하는 예제 resources.yaml 파일입니다.


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

Unity 카탈로그에 체인 등록

체인을 배포하기 전에 Unity 카탈로그에 체인을 등록해야 합니다. 체인을 등록하면 이 체인은 Unity 카탈로그에 모델로 패키징되며, 체인의 리소스에 대한 권한 부여에 Unity 카탈로그 권한을 사용할 수 있습니다.

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)

다음 단계