MLflow LLM Evaluate：モデルサービングされたLLM をカスタム関数で評価する

# はじめに

株式会社NTTデータ [デジタルサクセスソリューション事業部](https://enterprise-aiiot.nttdata.com/) で AWS や Databricks を推進している [nttd-saitouyun](https://qiita.com/nttd-saitouyun) です。

MLflow LLM Evaluate で モデルサービングされた LLM を評価する記事を書きました。

https://qiita.com/nttd-saitouyun/items/5b4014f9326bd3997736

この記事では**簡単に LLM を評価できること**を紹介しました。

今回は、**評価用のプロンプトをカスタマイズ**したり、Databricks 上にない**外部の LLM の評価を行うことができる 「カスタム関数」** を使って同様の評価を実施してみます。（外部の LLM の評価は今後記事を書きたいと思います。）


# MLflow LLM Evaluate
LLM の評価は正解を定義することが難しいなど従来と違った難しさがありますが、[MLflow LLM Evaluate](https://docs.databricks.com/ja/mlflow/llm-evaluate.html#what-is-mlflow-llm-evaluate) は、LLM の評価を効率的に行うフレームワークです。

マニュアルの説明は以下のとおりです。
>LLMのパフォーマンスの評価は、比較する単一のグラウンドトゥルースが存在しないことが多いため、従来の機械学習モデルとは少し異なります。 MLflow には、LLM の評価に役立つ API mlflow.evaluate() が用意されています。


# Python から モデルサービングエンドポイントで提供される LLM を操作する

**カスタム関数では LLM とのやり取りを Python のプログラムを通じて行います。**

本題に入る前の事前準備として、Python から モデルサービングエンドポイントで提供されているモデルとやり取りする方法を確認しておきます。
<br>

まず、クライアントを生成します。
```python
import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
```

次に、LLM に投げるメッセージの定義をします。メッセージはサービングエンドポイントの疎通に使われるメッセージと同じものを今回は使用します。
```python
inputs={
    "messages": [
        {
        "role": "user",
        "content": "Hello!"
        },
        {
        "role": "assistant",
        "content": "Hello! How can I assist you today?"
        },
        {
        "role": "user",
        "content": "What is Databricks?"
        }
    ],
    "max_tokens": 128
}
```

LLM へクエリするには`predict`関数を使って以下のようなコードになります。シンプルで簡単です。

```python:Azure OpenAI / GPT-4o
response_gpt4o = client.predict(
    endpoint="azure-openai-gpt-4o",
    inputs=inputs
)
```

以下のような結果となりました。正しくクエリできているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/b3308eb8-40ee-c8da-7401-d9137435e09c.png)

<br>
他の LLM についてもエンドポイントを変えるだけです。

```python:Amazon Bedrock / Claude 3.5 Sonnet
response_claude35s = client.predict(
    endpoint="aws-oregon-claude-3-5-sonnet",
    inputs=inputs
)
```

```python:Google Cloud Vertex AI / Gemini 1.5 Pro
response_geminip = client.predict(
    endpoint="google-oregon-gemini-1-5-pro",
    inputs=inputs
)
```

# カスタム関数を使って、MLflow LLM Evaluate を実行する

それでは本題です。ステップバイステップで記載します。

クラスターのランタイムは `15.3 ML` を使っています。

## 準備

一部の評価指標では追加でライブラリのインストールが必要となります。※カスタム関数を利用することとは関係のないステップです。
```python
%pip install textstat rouge-score 
dbutils.library.restartPython()
```

前段で確認した通り、カスタム関数の中で LLM を操作するためのクライアントを作ります。
```python
import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
```


評価のための質問と回答のセットを定義します。
```python
import pandas as pd

eval_data = pd.DataFrame(
    {
        "inputs": [
            "What is MLflow?",
            "What is Spark?",
            "What is Databricks?",
            "What is NTT DATA?",
            "ウルトラマンが活動できる時間は？時間のみを答えてください。"
        ],
        "ground_truth": [
            "MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. It was developed by Databricks, a company that specializes in big data and machine learning solutions. MLflow is designed to address the challenges that data scientists and machine learning engineers face when developing, training, and deploying machine learning models.",
            "Apache Spark is an open-source, distributed computing system designed for big data processing and analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, offering improvements in speed and ease of use. Spark provides libraries for various tasks such as data ingestion, processing, and analysis through its components like Spark SQL for structured data, Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
            "Databricks is a unified, open analytics platform for building, deploying, sharing, and maintaining enterprise-grade data, analytics, and AI solutions at scale. The Databricks Data Intelligence Platform integrates with cloud storage and security in your cloud account, and manages and deploys cloud infrastructure on your behalf.",
            "NTT DATA Corporation is a Japanese multinational information technology (IT) service and consulting company headquartered in Tokyo, Japan. It is a partially-owned subsidiary of Nippon Telegraph and Telephone (NTT).",
            "3分間"
        ],
    }
)
```


LLM（モデルサービングエンドポイント）の情報を実験条件として記録しておくための関数を定義しておきます。※カスタム関数を利用することとは関係のないステップです。
```python:環境や認証情報の定義
my_databricks_endpoint = "dbc-XXXXXXXX-XXXX.cloud.databricks.com"
token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
```

```python:サービングエンドポイントの情報を取得する関数の定義
import requests

def get_serving_endpoint_info(endpoint_name):
    url = f"https://{my_databricks_endpoint}/api/2.0/serving-endpoints/{endpoint_name}"
    headers = {
        "Authorization": f"Bearer {token}",
    }
    response = requests.get(url, headers=headers)
    return response.json()
```

## カスタム関数の定義
MLflow LLM Evaluate で呼びされる**カスタム関数の定義をします**。クライアントを使ってLLM に質問し、受け取った回答を返しています。

```python
endpoint = "azure-openai-gpt-4o"

def openai_qa(inputs):
    answers = []
    system_prompt = "Please answer the following question in formal language."

    for index, row in inputs.iterrows():
        completion = client.predict(
            endpoint = endpoint,
            inputs={
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": row["inputs"]},
            ],
            "max_tokens": 128
          }
        )
        answers.append(completion.choices[0]["message"]["content"])

    return answers
```

`messages`を変更することで、**プロンプトをカスタマイズすることができます**。
さらに、`completion = client.predict()`の部分を変更することで、**Databricks 以外の LLM の評価を行うことができます。**


## MLflow LLM Evaluate の実行

`mlflow.evaluate` の `model` に先ほど定義したカスタム関数の名前（openai_qa）を指定するだけです。

```python
with mlflow.start_run(run_name = endpoint) as run:
    # LLM（サービングエンドポイント）の情報を記録
    mlflow.log_param("endpoint", endpoint)
    mlflow.log_param("endpoint details", get_serving_endpoint_info(endpoint))

    # LLMの評価を実行
    results = mlflow.evaluate(
        model = openai_qa,
        data = eval_data,
        targets = "ground_truth",
        model_type = "question-answering",
        extra_metrics = [
            mlflow.metrics.exact_match(),
            mlflow.metrics.rouge1(),
            mlflow.metrics.rouge2(),
            mlflow.metrics.rougeL(),
            mlflow.metrics.rougeLsum(),
            mlflow.metrics.toxicity(),
            mlflow.metrics.token_count(),
            mlflow.metrics.latency(),
        ],
    )
```

## MLflow LLM Evaluate の評価結果の確認

Databricks の**エクスペリメント（実験管理）** に質問と回答、実験条件、回答の評価指標値が記録されています。


# おわりに

**カスタム関数のおかげで評価の幅が一気に広がりますね！**

今回のプログラムをもとに、Amazon Q など外部の LLM の評価にも使ってみようと思います。


# 仲間募集
NTTデータ デザイン＆テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary> 1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア) </summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary> 2. データサイエンス領域（データサイエンティスト／データアナリスト） </summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary> 3.お客様のAI活用の成功を推進するAIサクセスマネージャー </summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary> 4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》 </summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>

# ソリューション紹介
<details><summary> Trusted Data Foundationについて </summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</details>

<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

 https://enterprise-aiiot.nttdata.com/service/databricks

</details>

<details><summary> TDF-AM（Trusted Data Foundation - Analytics Managed Service）について </summary>
～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDF-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</details>

</details>

<details><summary> NTTデータとSnowflakeについて </summary>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</details>

</details>

<details><summary> NTTデータとInformaticaについて </summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica

</details>

</details>

<details><summary> NTTデータとTableauについて </summary>
ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau

</details>

</details>

<details><summary> NTTデータとAlteryxについて </summary>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</details>

</details>

<details><summary> NTTデータとDataRobotについて </summary>
DataRobotは、包括的なAIライフサイクルプラットフォームです。
NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</details>