📑

MLflow 3.0 on DatabricksでLLMの評価を行う

に公開

はじめに

2025/6/12 に MLflow 3.0 がリリースされました。MLflow 3.0 では、GenAI の機能が強化され LLM(大規模言語モデル)の評価が容易になりました。私はこれまで OpenAI のモデルを評価する記事をいくつか書いてきました[1][2][3]。この記事では、MLflow 3.0 を使って Databricks 上で LLM の評価を行う方法を紹介します。

実行環境

実行環境

  • Azure Databricks
  • MLflow 3.2.0
  • 17.1 (includes Apache Spark 4.0.0, Scala 2.13) ML

本記事は MLflow 3.0 の以下のドキュメントを参考しました。

https://mlflow.org/docs/latest/genai/eval-monitor/quickstart/

!pip install --upgrade mlflow openai databricks-agents
%restart_python or dbutils.library.restartPython()

データセットの準備

今回は以下のようなデータセットを準備しました。

display(eval_dataset_df)

データセットは以下のようなデータ構造にする必要があります。

[
  {
    "inputs": { "question": "What is the capital of France?" },
    "expectations": { "expected_response": "Paris" }
  },
  {
    "inputs": { "question": "Who was the first person to build an airplane?" },
    "expectations": { "expected_response": "Wright Brothers" }
  },
  {
    "inputs": { "question": "Who wrote Romeo and Juliet?" },
    "expectations": { "expected_response": "William Shakespeare" }
  }
]

inputsはモデルに入力するデータで、questionフィールドに質問を設定します。expectationsは期待される応答を設定するフィールドで、expected_responseに正解を設定します。この形式でデータセットを準備する必要があるようです。

LLM の準備

LLM の準備を行います。今回は Azure OpenAI を利用しますが、他のプロバイダーでも OpenAI API に対応していれば同様の手順で利用できます。

import os

endpoint = os.getenv("ENDPOINT_URL", "https://XXXXXXX.openai.azure.com/")
deployment = os.getenv("DEPLOYMENT_NAME", "gpt-oss-120b")
subscription_key = os.getenv("AZURE_OPENAI_API_KEY", "XXXXXXX")

今回はシンプルな QA モデルを評価します。一般的な OpenAI の Python ライブラリの利用法に従い、以下のようにモデルを呼び出す関数を定義します。

from openai import AzureOpenAI

client = AzureOpenAI(
    azure_endpoint=endpoint,
    api_key=subscription_key,
    api_version="2025-04-01-preview",
)

def qa_predict_fn(question):
    system_prompt = """Answer using ONLY letter choices in alphabetical order, separated by commas.
Choose ONE answer unless the question specifies otherwise.

Examples:
A
A, B
A, C, E
"""
    response = client.chat.completions.create(
        model=deployment,
        messages=[
            {
                "role": "system",
                "content": system_prompt,
            },
            {"role": "user", "content": question},
        ],
    )
    return response.choices[0].message.content

システムプロンプトは、今回の評価に合わせて調整しています。

LLM の評価方法

データセットとモデルの準備ができたら、MLflow の GenAI 評価機能を使って LLM の評価を行います。以下のコードで評価を実行します。

import mlflow
from mlflow.genai.scorers import scorer

@scorer
def exact_match(outputs, expectations) -> bool:
    return outputs == expectations["expected_response"]

scorers = [exact_match]

results = mlflow.genai.evaluate(
    data=eval_dataset_df,
    predict_fn=qa_predict_fn,
    scorers=scorers,
)

MLflow には多くの組み込みスコアラーが用意されていますが、今回は exact_match スコアラーを定義して、モデルの応答が期待される応答と完全に一致するかどうかを評価します。

MLflow 3.0 にはいくつか組み込みのスコアラーが用意されています。例えばCorrectnessスコアラーも同様の機能を提供しますが、こちらは内部で LLM を呼び出して評価を行うためコストがかかります。今回は exact_match スコアラーを定義して、モデルの応答が期待される応答と完全に一致するかどうかを評価を行います。

LLM の評価結果

上記のコードを実行すると、以下のような評価結果が得られます。

おわりに

MLflow 3.0 を使用することで、Databricks 上で LLM の評価を効率的に行うことができました。GenAI 機能を活用することで、モデルの性能を簡単に測定し、改善点を見つけることができます。今後も MLflow の新機能に注目していきたいと思います。

今後のアップデート次第で上記のコードや手順が変更される可能性があります。最新のドキュメントを確認しながら、適宜調整していくことをおすすめします。

脚注
  1. https://zenn.dev/derbuihan/articles/5c61728a4311d2 ↩︎

  2. https://zenn.dev/derbuihan/articles/8904c7870658f8 ↩︎

  3. https://zenn.dev/derbuihan/articles/4dbc4273aca6b1 ↩︎

Discussion