MLflow 追蹤的代理程式可觀察性

本文說明如何使用 Databricks 上的 MLflow 追蹤,將可檢視性新增至您的產生 AI 應用程式。

什麼是 MLflow 追蹤?

MLflow 跟踪 提供從開發到部署的端對端生成式 AI 應用程式觀察能力。 追蹤功能與 Databricks 的生成式 AI 工具組全面整合,能夠在整個開發和生產生命週期內捕捉詳細深入的洞見。

內嵌追蹤會擷取 gen AI 應用程式中每個步驟的詳細資訊

以下是在 Gen AI 應用程式中追蹤的主要使用案例:

  • 簡化偵錯:追蹤可讓您更輕鬆瞭解 Gen AI 應用程式的每個步驟,讓您更輕鬆地診斷和解決問題。

  • 離線評估:追蹤會產生寶貴的代理評估數據,讓您能夠測量並隨著時間改善代理的品質。

  • 生產監視:追蹤可讓您查看代理程式行為和詳細的執行步驟,讓您監視及優化生產中的代理程式效能。

  • 稽核記錄:MLflow 追蹤會產生代理程式動作和決策的完整稽核記錄。 這對於確保發生非預期問題時的合規性和支持偵錯至關重要。

需求

MLflow 追蹤可在 MLflow 2.13.0 版和更新版本上使用。 Databricks 建議安裝最新版的 MLflow,以存取最新的功能和改進。

%pip install mlflow>=2.13.0 -qqqU
%restart_python

自動追蹤

MLflow 自動記錄 可讓您將單行新增至程式代碼,以快速檢測代理程式,mlflow.<library>.autolog()

MLflow 支援對大多數受歡迎的代理編寫庫進行自動紀錄。 如需有關各個撰寫庫的詳細資訊,請參閱 MLflow 自動記錄功能說明文件

圖書館 自動記錄版本支援 自動記錄命令
LangChain 0.1.0 ~ 最新 mlflow.langchain.autolog()
Langgraph 0.1.1 ~ 最新 mlflow.langgraph.autolog()
OpenAI 1.0.0 ~ 最新 mlflow.openai.autolog()
LlamaIndex 0.10.44 ~ 最新 mlflow.llamaindex.autolog()
DSPy 2.5.17 ~ 最新 mlflow.dspy.autolog()
Amazon Bedrock 1.33.0 ~ 最新版 (boto3) mlflow.bedrock.autolog()
人類 0.30.0 ~ 最新 mlflow.anthropic.autolog()
AutoGen 0.2.36 ~ 0.2.40 mlflow.autogen.autolog()
Google Gemini 1.0.0 ~ 最新 mlflow.gemini.autolog()
CrewAI 0.80.0 ~ 最新 mlflow.crewai.autolog()
LiteLLM 1.52.9 ~ 最新 mlflow.litellm.autolog()
Groq 0.13.0 ~ 最新 mlflow.groq.autolog()
密史特拉 1.0.0 ~ 最新 mlflow.mistral.autolog()

停用自動記錄

在 Databricks Runtime 15.4 ML 及以上版本中,以下函式庫預設會啟用自動記錄追蹤功能:

  • LangChain
  • Langgraph
  • OpenAI
  • LlamaIndex

若要停用這些連結庫的自動記錄追蹤,請在筆記本中執行下列命令:

`mlflow.<library>.autolog(log_traces=False)`

手動新增痕跡

雖然自動記錄提供方便的方式檢測代理程式,但您可能會想要更細微地檢測代理程式,或新增自動記錄不會擷取的其他追蹤。 在這些情況下,請使用 MLflow 追蹤 API 手動新增追蹤。

MLflow 追蹤 API 是用於新增追蹤的低程式代碼 API,而不必擔心管理追蹤的樹狀結構。 MLflow 會利用 Python 堆疊自動確定適當的父級/子級跨度關係。

結合自動記錄和手動追蹤

手動追蹤 API 可以搭配自動記錄使用。 MLflow 結合由自動記錄和手動追蹤所建立的跨度,以建立代理執行的完整追蹤。 如需結合自動記錄和手動追蹤的範例,請參閱 使用 MLflow 追蹤配置叫用代理的工具。

使用 @mlflow.trace 裝飾器進行函式追蹤

手動為程式代碼添加監控的最簡單方法是使用 @mlflow.trace 裝飾器來修飾一個函式。 MLflow 追蹤裝飾器 會建立一個與裝飾函式範圍相關的「區段」,此區段代表追蹤中的執行單位,並顯示為追蹤視覺化中的單一行。 範圍會擷取函式的輸入和輸出、延遲,以及從函式引發的任何例外狀況。

例如,下列程式代碼會建立名為 my_function 的範圍,以擷取輸入自變數 xy 和輸出。

import mlflow

@mlflow.trace
def add(x: int, y: int) -> int:
  return x + y

您也可以自訂範圍名稱、範圍類型,以及將自訂屬性新增至範圍:

from mlflow.entities import SpanType

@mlflow.trace(
  # By default, the function name is used as the span name. You can override it with the `name` parameter.
  name="my_add_function",
  # Specify the span type using the `span_type` parameter.
  span_type=SpanType.TOOL,
  # Add custom attributes to the span using the `attributes` parameter. By default, MLflow only captures input and output.
  attributes={"key": "value"}
)
def add(x: int, y: int) -> int:
  return x + y

使用內容管理員追蹤任意程式代碼區塊

若要為任意程式代碼區塊建立範圍,而不只是函式,請使用 mlflow.start_span() 做為包裝程式代碼區塊的內容管理員。 範圍會在進入上下文時開始,並在退出上下文時結束。 應該手動使用上下文管理員所產生的 span 物件的 setter 方法來提供 span 的輸入和輸出。 如需詳細資訊,請參閱 MLflow 文件 - 上下文處理程式

with mlflow.start_span(name="my_span") as span:
  span.set_inputs({"x": x, "y": y})
  result = x + y
  span.set_outputs(result)
  span.set_attribute("key", "value")

低層次的追蹤函式庫

MLflow 也提供低階 API,以明確控制追蹤樹狀結構。 請參閱 MLflow 檔案 - 手動偵測

追蹤範例:結合自動記錄和手動追蹤

下列範例結合 OpenAI 自動記錄和手動追蹤,以完整檢測工具呼叫代理程式。

import json
from openai import OpenAI
import mlflow
from mlflow.entities import SpanType

client = OpenAI()

# Enable OpenAI autologging to capture LLM API calls
# (*Not necessary if you are using the Databricks Runtime 15.4 ML and above, where OpenAI autologging is enabled by default)
mlflow.openai.autolog()

# Define the tool function. Decorate it with `@mlflow.trace` to create a span for its execution.
@mlflow.trace(span_type=SpanType.TOOL)
def get_weather(city: str) -> str:
  if city == "Tokyo":
    return "sunny"
  elif city == "Paris":
    return "rainy"
  return "unknown"


tools = [
  {
    "type": "function",
    "function": {
      "name": "get_weather",
      "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
      },
    },
  }
]

_tool_functions = {"get_weather": get_weather}

# Define a simple tool-calling agent
@mlflow.trace(span_type=SpanType.AGENT)
def run_tool_agent(question: str):
  messages = [{"role": "user", "content": question}]

  # Invoke the model with the given question and available tools
  response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages,
    tools=tools,
  )
  ai_msg = response.choices[0].message
  messages.append(ai_msg)

  # If the model requests tool calls, invoke the function(s) with the specified arguments
  if tool_calls := ai_msg.tool_calls:
    for tool_call in tool_calls:
      function_name = tool_call.function.name
      if tool_func := _tool_functions.get(function_name):
        args = json.loads(tool_call.function.arguments)
        tool_result = tool_func(**args)
      else:
        raise RuntimeError("An invalid tool is returned from the assistant!")

      messages.append(
        {
          "role": "tool",
          "tool_call_id": tool_call.id,
          "content": tool_result,
        }
      )

    # Send the tool results to the model and get a new response
    response = client.chat.completions.create(
      model="gpt-4o-mini", messages=messages
    )

  return response.choices[0].message.content

# Run the tool calling agent
question = "What's the weather like in Paris today?"
answer = run_tool_agent(question)

使用標籤標註記錄追蹤

MLflow 追蹤標籤 是鍵值對,可讓您將自定義的元數據新增至追蹤,例如交談標識碼、使用者標識碼、Git 提交哈希等。標籤顯示在 MLflow UI 中,讓您可以篩選和搜尋追蹤。

標記可以使用 MLflow API 或 MLflow UI 設定為進行中或已完成的追蹤。 下列範例示範如何使用 mlflow.update_current_trace() API 將標記新增至進行中的追蹤。

@mlflow.trace
def my_func(x):
    mlflow.update_current_trace(tags={"fruit": "apple"})
    return x + 1

若要深入瞭解標記追蹤,以及如何使用它們來篩選和搜尋追蹤,請參閱 MLflow 文件 - 設定追蹤標籤

檢視追蹤

若要在執行代理後檢閱追蹤,請使用以下其中一個選項:

  • 內嵌視覺化:在 Databricks 筆記本中,追蹤會內嵌呈現在單元格輸出中。
  • MLflow 實驗:在 Databricks 中,前往 實驗> 選擇實驗 >跟蹤 以檢視和搜尋該實驗的所有記錄。
  • MLflow 運行:當代理程式在活躍的 MLflow 運行下執行時,追蹤會出現在 MLflow UI 的 [運行] 頁面上。
  • 代理程式評估 UI:在馬賽克 AI 代理程式評估中,您可以在評估結果中點擊 查看詳細的執行記錄檢視 來檢閱每個代理程式的執行記錄。
  • 追蹤搜尋 API:若要以程式設計方式擷取追蹤,請使用 追蹤搜尋 API

使用追蹤評估代理程式

追蹤資料可作為評估代理人的重要資源。 藉由擷取模型執行的詳細資訊,MLflow 追蹤在離線評估中至關重要。 您可以使用追蹤數據,針對黃金數據集評估代理程式的效能、找出問題,以及改善代理程式的效能。

%pip install -U mlflow databricks-agents
%restart_python
import mlflow

# Get the recent 50 successful traces from the experiment
traces = mlflow.search_traces(
    max_results=50,
    filter_string="status = 'OK'",
)

traces.drop_duplicates("request", inplace=True) # Drop duplicate requests.
traces["trace"] = traces["trace"].apply(lambda x: x.to_json()) # Convert the trace to JSON format.

# Evaluate the agent with the trace data
mlflow.evaluate(data=traces, model_type="databricks-agent")

若要深入了解代理評估,請參閱 執行評估並檢視結果

使用推斷數據表監視已部署的代理程式

將代理程式部署至馬賽克 AI 模型服務之後,您可以使用 推斷數據表 來監視代理程式。 推斷數據表包含來自檢閱應用程式的要求、回應、代理程序追蹤和代理程式意見反應的詳細記錄。 這項資訊可讓您偵錯問題、監視效能,以及建立用於離線評估的黃金數據集。

若要開啟代理程式部署的推斷資料表,請參閱 啟用 AI 代理程式的推斷資料表

查詢線上追蹤

使用筆記本來查詢推斷數據表並分析結果。

若要將追蹤可視化,請執行 display(<the request logs table>) 並選取要檢查的數據列:

# Query the inference table
df = spark.sql("SELECT * FROM <catalog.schema.my-inference-table-name>")
display(df)

監視代理程式

請參閱 如何監控您的 Gen AI 應用程式

追蹤額外負荷延遲

追蹤紀錄是以異步方式寫入,以降低效能影響。 不過,追蹤仍會對端點回應速度增加延遲,特別是當每個推斷要求的追蹤大小很大時。 Databricks 建議先測試您的端點,以瞭解部署至生產環境前的追蹤延遲影響。

下表提供追踪大小對延遲影響的大致估算:

每個請求的跟蹤大小 回應速度延遲的影響 (毫秒)
約10 KB ~1 毫秒
~ 1 MB 50 ~ 100 毫秒
10 MB 150 毫秒 ~

故障排除

如需疑難解答和常見問題,請參閱 MLflow 文件:追蹤操作指南MLflow 文件:常見問題