【MLflow GenAI 教學】#01 三大核心功能:Tracing、Logging、Evaluation

測驗:MLflow GenAI 三大核心功能

共 5 題,點選答案後會立即顯示結果

1. MLflow GenAI 的三大核心功能是什麼?

  • A. Training、Serving、Monitoring
  • B. Preprocessing、Training、Deployment
  • C. Tracing、Logging、Evaluation
  • D. Inference、Caching、Scaling

2. 在 MLflow 中,如何「一行程式碼啟用追蹤」OpenAI 的 API 呼叫?

  • A. mlflow.trace.enable()
  • B. mlflow.openai.autolog()
  • C. mlflow.start_trace("openai")
  • D. mlflow.genai.trace(openai)

3. MLflow Prompt Registry 的 alias(別名)機制主要解決什麼問題?

  • A. 讓 prompt 可以被加密保護
  • B. 讓 prompt 可以自動翻譯成多國語言
  • C. 讓 prompt 可以被多個團隊共享
  • D. 切換版本時不需要修改程式碼

4. MLflow 的 LLM-as-a-Judge 評估方法是什麼意思?

  • A. 由法律專家審查 LLM 的輸出是否合規
  • B. 由人類評審逐一為 LLM 回答打分
  • C. 用 LLM 來評估另一個 LLM 的輸出品質
  • D. 讓使用者投票決定 LLM 回答的好壞

5. MLflow Tracing 完全相容 OpenTelemetry 標準,這意味著什麼?

  • A. 只能使用 MLflow 官方的監控介面
  • B. 可以匯出到 Jaeger、Zipkin、Datadog 等現有監控系統
  • C. 必須使用 OpenTelemetry SDK 才能執行追蹤
  • D. 追蹤資料只能儲存在本地端

前言:LLM 應用開發的現實困境

當你第一次看到 LLM 應用的程式碼時,可能會覺得「就這麼簡單?」——呼叫 API、傳入 prompt、拿到回應。但當這段程式碼進入生產環境後,噩夢才真正開始:

  • 使用者回報「AI 回答怪怪的」,但你完全不知道當時的 prompt 長什麼樣
  • 上週運作正常的功能,這週突然品質下降,卻無從追查原因
  • 團隊成員各自修改 prompt,沒人知道哪個版本效果最好
  • 想評估 AI 回答品質,只能靠人工一筆一筆檢查

這些就是 LLM 應用的「黑盒問題」——你無法觀測、無法追溯、無法系統性評估。

MLflow GenAI 正是為了解決這些問題而生。

MLflow GenAI 是什麼?

MLflow GenAI 是 MLflow 針對生成式 AI 應用推出的專用模組,提供從開發到生產的完整生命週期管理。與傳統的 ML 實驗追蹤不同,它專注於解決 LLM 應用特有的挑戰:

傳統 MLflow MLflow GenAI
追蹤模型訓練參數 追蹤 prompt 和 LLM 呼叫鏈路
記錄模型 metrics 記錄 token 使用量、延遲、品質分數
版本化模型檔案 版本化 prompt 模板和配置
評估模型準確度 用 LLM 評估 LLM(LLM-as-a-judge)

MLflow GenAI 建構在三大核心功能之上:Tracing(可觀測性)、Logging(版本管理)、Evaluation(品質評估)。

核心功能一:Tracing(可觀測性)

問題情境

假設你的 LLM 應用串接了 RAG(檢索增強生成),流程是:

使用者問題 -> 向量檢索 -> 組合 prompt -> LLM 呼叫 -> 回應

當回答品質不佳時,問題可能出在任何一個環節:

  • 檢索到的文件不相關?
  • prompt 組合方式有問題?
  • LLM 本身幻覺?

沒有 tracing,你只能盲目猜測。

Tracing 如何解決

MLflow Tracing 會捕捉完整的執行鏈路,記錄每個步驟的:

  • 輸入與輸出:每個函式接收什麼、回傳什麼
  • 執行時間:哪個步驟最耗時
  • Token 使用量:成本分佈在哪裡
  • 中繼資料:模型版本、溫度參數等配置

程式碼範例

import mlflow

# 啟用自動追蹤(支援 OpenAI、LangChain 等 30+ 框架)
mlflow.openai.autolog()

# 你的程式碼完全不需要修改
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "什麼是 MLflow?"}]
)

# MLflow 自動記錄:
# - 完整的 prompt 內容
# - 回應內容
# - token 數量(input/output)
# - 延遲時間
Code language: PHP (php)

這就是 MLflow 強調的「一行程式碼啟用追蹤」——透過 autolog() 自動攔截框架的 API 呼叫。

在 UI 中看到什麼

在 MLflow UI 中,你可以看到類似這樣的追蹤結果:

[Trace] user_query_handler (總耗時: 2.3s)
  |
  +-- [Span] vector_search (0.3s)
  |     inputs: {"query": "什麼是 MLflow?"}
  |     outputs: {"documents": [...], "scores": [0.92, 0.87]}
  |
  +-- [Span] prompt_assembly (0.01s)
  |     inputs: {"template": "...", "context": "..."}
  |     outputs: {"final_prompt": "..."}
  |
  +-- [Span] llm_call (2.0s)
        inputs: {"model": "gpt-4", "messages": [...]}
        outputs: {"response": "MLflow 是一個..."}
        metadata: {"tokens": {"input": 150, "output": 200}}
Code language: JavaScript (javascript)

一眼就能看出:LLM 呼叫佔了 87% 的時間,而檢索結果的相關性分數都很高,所以問題可能出在 prompt 組合或 LLM 本身。

OpenTelemetry 相容性

MLflow Tracing 完全相容 OpenTelemetry 標準,這意味著:

  • 可以匯出到 Jaeger、Zipkin、Datadog 等現有監控系統
  • 可以與後端服務的 traces 串接,形成端對端追蹤
  • 沒有供應商鎖定,隨時可以遷移
# 匯出到 OpenTelemetry Collector
import os
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "http://collector:4317"
Code language: PHP (php)

核心功能二:Logging(版本管理)

問題情境

你的團隊有三個人同時在調整 prompt:

  • Alice 覺得加上「請用繁體中文回答」效果更好
  • Bob 認為應該在 system prompt 強調「簡潔回答」
  • Carol 想嘗試新的 few-shot 範例

一週後,生產環境的 prompt 已經面目全非,沒人記得原本長什麼樣,也不知道哪次修改造成了品質下降。

Prompt Registry 如何解決

MLflow Prompt Registry 提供類似 Git 的版本控制:

import mlflow

# 註冊一個 prompt 模板
mlflow.genai.register_prompt(
    name="customer-support",
    template="""你是一個客服助理。

使用者問題:{{question}}
相關文件:{{context}}

請根據文件內容回答問題。如果文件中沒有相關資訊,請誠實說明。""",
    commit_message="初始版本:基本客服模板"
)
Code language: PHP (php)

每次修改都會產生新版本,且舊版本永遠不會被覆蓋(immutable):

customer-support
  |- v1: 初始版本(2024-01-15)
  |- v2: 新增繁體中文要求(2024-01-16)
  |- v3: 調整語氣更友善(2024-01-18)

Alias 機制

實務上,你不會想在程式碼中寫死 v3。MLflow 提供 alias(別名)機制:

# 設定 production alias 指向 v2
# 設定 staging alias 指向 v3

# 程式碼中使用 alias
prompt = mlflow.genai.load_prompt("prompts:/customer-support@production")
Code language: PHP (php)

當 v3 測試通過後,只需要把 production alias 指向 v3,不需要改任何程式碼。

LoggedModel:完整應用版本

除了 prompt,MLflow 的 LoggedModel 可以追蹤整個應用的狀態:

  • Git commit hash
  • 所有 prompt 版本
  • 模型配置(temperature、max_tokens 等)
  • 相依套件版本
with mlflow.start_run():
    mlflow.set_active_model(name="customer-support-bot")

    # 所有後續的 traces 都會關聯到這個版本
    response = process_user_query(question)
Code language: PHP (php)

當問題發生時,你可以精確知道「2024-01-18 15:30 的那個異常回應,用的是哪個版本的程式碼和 prompt」。

核心功能三:Evaluation(品質評估)

問題情境

你修改了 prompt,覺得效果變好了。但「覺得」不夠客觀——怎麼證明?

傳統做法是人工評估:準備 100 個測試問題,請人逐一判斷回答品質。這不僅耗時,還有主觀偏差。

LLM-as-a-Judge 如何解決

MLflow 採用「用 LLM 評估 LLM」的方法,稱為 LLM-as-a-Judge:

import mlflow

# 定義評估資料集
eval_data = [
    {"question": "如何重設密碼?", "expected": "請至設定頁面..."},
    {"question": "退款需要幾天?", "expected": "一般需要 3-5 個工作天..."},
]

# 執行評估
results = mlflow.genai.evaluate(
    data=eval_data,
    predict_fn=my_chatbot,
    scorers=[
        mlflow.genai.scorers.Correctness(),      # 回答是否正確
        mlflow.genai.scorers.Relevance(),        # 回答是否相關
        mlflow.genai.scorers.Guidelines(         # 自訂評估標準
            guidelines="回答必須使用繁體中文,語氣友善專業"
        ),
    ]
)
Code language: PHP (php)

內建 Scorers

MLflow 提供多種內建評估器:

Scorer 評估內容
Correctness 回答是否正確(需提供預期答案)
Relevance 回答是否與問題相關
RetrievalGroundedness 回答是否基於檢索的文件(防止幻覺)
Guidelines 是否符合自訂準則

評估結果解讀

評估結果摘要:
- 正確性:85% (85/100 通過)
- 相關性:92% (92/100 通過)
- 準則符合度:78% (78/100 通過)

失敗案例分析:
- Q: "如何取消訂閱?"
- A: "請聯繫客服處理。"
- 評估:準則不符合 - 回答過於簡短,未提供具體步驟
Code language: JavaScript (javascript)

與 Tracing 整合

評估結果會自動關聯到對應的 traces,讓你可以:

  1. 找出所有「幻覺」分數低的回應
  2. 檢視這些回應的完整執行鏈路
  3. 分析是哪個環節出了問題

MLflow GenAI vs 傳統 MLflow:差異比較

面向 傳統 MLflow MLflow GenAI
追蹤對象 訓練迭代(epoch、loss) 推論請求(prompt、response)
版本化內容 模型權重檔案 prompt 模板、應用配置
評估方式 數值 metrics(accuracy) LLM 評估 + 人類反饋
主要場景 模型訓練實驗 LLM 應用開發與監控
資料量級 少量實驗記錄 大量即時請求

簡單來說:傳統 MLflow 關注「如何訓練出好模型」,MLflow GenAI 關注「如何用好模型建構好應用」。

何時該使用 MLflow GenAI?

適合使用的情境

  • 你正在開發 LLM 應用(聊天機器人、RAG 系統、AI Agent)
  • 團隊多人協作,需要版本控制 prompt
  • 應用已上線,需要監控品質和除錯
  • 想要系統性評估 prompt 修改的效果
  • 偏好開源方案,避免供應商鎖定

可能不需要的情境

  • 只是簡單的一次性 API 呼叫
  • 尚在 POC 階段,還沒確定架構
  • 已有成熟的內部監控系統

框架整合支援

MLflow GenAI 支援 30+ 框架的自動追蹤:

LLM Provider

  • OpenAI
  • Anthropic (Claude)
  • Google Gemini
  • AWS Bedrock

Application Framework

  • LangChain / LangGraph
  • LlamaIndex
  • DSPy
  • Pydantic AI
  • AutoGen / AG2

TypeScript 生態系

  • Vercel AI SDK
  • LangChain.js
  • Mastra

只需一行 mlflow.xxx.autolog() 即可啟用。

小結

本文介紹了 MLflow GenAI 的三大核心功能:

  1. Tracing:捕捉完整執行鏈路,解決「黑盒」問題
  2. Logging:版本化管理 prompt 和應用配置
  3. Evaluation:LLM-as-a-Judge 自動化品質評估

這三個功能相互配合:Tracing 產生資料,Logging 追蹤版本,Evaluation 評估品質。形成一個完整的 LLM 應用可觀測性解決方案。

下一篇文章,我們將實際動手安裝 MLflow,並使用 Tracing 功能追蹤第一個 LLM 呼叫。

延伸閱讀

進階測驗:MLflow GenAI 三大核心功能

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你的 RAG 應用回答品質突然下降,需要找出問題所在 情境題

你負責維護一個客服聊天機器人,使用 RAG 架構。最近使用者反映「AI 回答都答非所問」。你需要找出問題是出在向量檢索、prompt 組合、還是 LLM 本身。你已經整合了 MLflow GenAI。

最適合的做法是?

  • A. 重新訓練向量模型,提升檢索品質
  • B. 查看 MLflow Tracing UI,檢視執行鏈路中每個步驟的輸入輸出
  • C. 修改 prompt 加上「請仔細思考後再回答」
  • D. 升級到更大的 LLM 模型

2. 團隊需要管理多人協作修改的 prompt 情境題

你的團隊有三個人同時在調整客服 prompt。一週後發現生產環境的 prompt 品質下降,但沒人記得原本長什麼樣。你想建立一套流程避免這種情況再次發生。

使用 MLflow GenAI 最適合的做法是?

  • A. 建立 Google Doc 讓大家共同編輯 prompt
  • B. 每次修改都發 Email 通知團隊成員
  • C. 使用 Prompt Registry 註冊 prompt,搭配 alias 管理 production/staging 版本
  • D. 把 prompt 寫在程式碼裡,用 Git 版本控制

3. 需要證明新的 prompt 確實比舊版好 情境題

你修改了客服機器人的 prompt,主觀感覺效果變好了。但主管要求你提供客觀數據證明「新版確實比舊版好」,而且不想花太多人力做人工評估。

使用 MLflow GenAI 最適合的做法是?

  • A. 請團隊成員各自測試 10 個問題,統計感覺變好的比例
  • B. 比較新舊版本的回應時間和 token 數量
  • C. 收集使用者回饋,統計滿意度分數
  • D. 使用 mlflow.genai.evaluate() 搭配 Correctness、Relevance 等 Scorers 自動評估

4. 小明想要載入生產環境的 prompt,但程式碼有問題 錯誤診斷

# 小明的程式碼 prompt = mlflow.genai.load_prompt(“customer-support@v3”)

這段程式碼無法正確載入 prompt,最可能的原因是?

  • A. load_prompt 方法不存在,應該用 get_prompt
  • B. 路徑格式錯誤,應該使用 prompts:/customer-support@production 格式
  • C. 版本號應該寫成 v3 而不是 @v3
  • D. 需要先呼叫 mlflow.genai.connect() 建立連線

5. 小華的評估程式碼有問題,RetrievalGroundedness 分數一直是 0 錯誤診斷

# 小華的評估程式碼 eval_data = [ {“question”: “如何重設密碼?”, “expected”: “請至設定頁面…”}, {“question”: “退款需要幾天?”, “expected”: “一般需要 3-5 個工作天…”}, ] results = mlflow.genai.evaluate( data=eval_data, predict_fn=my_chatbot, scorers=[ mlflow.genai.scorers.RetrievalGroundedness(), ] )

RetrievalGroundedness 評分一直是 0 分,最可能的原因是?

  • A. expected 欄位的內容太短,需要更詳細的預期答案
  • B. my_chatbot 函式回傳格式不正確
  • C. 評估資料缺少檢索文件欄位,RetrievalGroundedness 需要比對回答是否基於檢索的文件
  • D. 應該使用 Correctness scorer 而非 RetrievalGroundedness

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *