MLflow LLM Evaluate で Claude 3.5 Sonnet、GPT-4o、Gemini 1.5 Pro との QA を評価する

# はじめに

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

以下の記事で、Databricks から  **Amazon Bedrock の Claude 3.5 Sonnet**、**Azure OpenAI の GPT-4o**、**Google Cloud Vertex AI の Gemini 1.5 Pro** を利用できるように設定してきました。

- [Databricks の Mosaic AI Model Serving Endpoint から Amazon Bedrock の LLM を利用する](https://qiita.com/nttd-saitouyun/items/4fc9bde0b338cb180e02)
- [Databricks の Mosaic AI Model Serving Endpoint から Azure OpenAI の LLM を利用する](https://qiita.com/nttd-saitouyun/items/04e61af84e5cc25a26b9)
- [Databricks の Mosaic AI Model Serving Endpoint から Google Cloud Vertex AI の LLM を利用する](https://qiita.com/nttd-saitouyun/items/ec29189abfca6722fc00)

そして、これらの LLM に加えて、Llama 3.1 405B、DBRX Instruct と同時にチャットし、回答の違いを見てきました。ただ、人間が複数のLLMの回答を評価するのは大変です。

- [Mosaic AI Playground で Claude 3.5 Sonnet、GPT-4o、Gemini 1.5 Pro と同時にチャットする](https://qiita.com/nttd-saitouyun/items/b3ffa29dbecd7570690a)


今回は、LLM の評価を効率的に行うツールである **MLflow LLM Evaluate** を使って QA の評価をしていきます。

:::note warn
本書は MLflow LLM Evaluate の活用方法を紹介することを目的としており、各 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() が用意されています。


# 評価対象の LLM

本書では、以下の有名な LLM との QA を評価します。
| プラットフォーム | 利用サービス | LLM | 開発元 |
| ---- | ---- | ---- | ---- |
| AWS| Amazon Bedrock | Claude 3.5 Sonnet | Anthropic |
| Azure | Azure OpenAI | GPT-4o | OpenAI |
| Google Cloud | Vertex AI | Gemini 1.5 Pro | Google |
| Databricks on AWS | Databricks | Llama 3.1 405B | Meta |
| Databricks on AWS | Databricks | DBRX Instruct | Databricks |

※本書では Databricks on AWS を使っていますが、Databricks は Azure でも Google Cloud でも使えます。



# MLflow LLM Evaluate を実行する
それでは、MLflow LLM Evaluate を使った LLM の評価を行っていきます。

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

※このランタイムバージョンを使う理由や追加のメトリクスを指定する場合は[こちらの記事](https://qiita.com/nttd-saitouyun/items/8916bde16e9a0834eeb0)をご覧ください。


## 事前準備

### ライブラリのインストール
利用する評価指標に応じて、一部ライブラリの事前インストールが必要です。以下のコードで必要なライブラリのインストールします。
```python
%pip install textstat
dbutils.library.restartPython()
```

評価指標と必要なライブラリは[こちらのページ](https://docs.databricks.com/ja/mlflow/llm-evaluate.html#select-metrics-to-evaluate-your-llm)を確認してください。

### 評価用の質問と回答を定義

評価用の質問（`inputs`）とその質問に対して期待される回答（`ground_truth`）を以下のように定義します。

```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分間"
        ],
    }
)
```

### モデルサービングエンドポイント（Databricks Foundation Models API）の利用の指定
評価対象の LLM が Databricks のモデルサービングエンドポイントで提供される場合は、以下の指定が必要になります。
```python
from mlflow.deployments import set_deployments_target

set_deployments_target("databricks")
```

### エンドポイントの情報を取得するための関数の定義

MLflow LLM Evaluate とは直接関係はありませんが、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()
```

<br>
準備はこれで完了です。

## MLflow LLM Evaluate の実行

まずは、GPT-4o（エンドポイント名：azure-openai-gpt-4o）について評価を行います。
エンドポイント名を切り替えるだけで他の LLM の評価も簡単にできます。
```python
import mlflow

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

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 = f"endpoints:/{endpoint}",
        data = eval_data,
        targets = "ground_truth",
        model_type = "question-answering",
        inference_params = {"max_tokens": 128, "temperature": 0.0},
    )
```

実行すると、エクスペリメント（実験管理）に情報が記録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/9a45a821-a7ae-e1a2-62ea-71d85e966dd7.png)

これを評価したい LLM 分繰り返すだけです。
ただ、今後、評価対象の LLM は増えるかもしれないので関数にしておきます。

```python
def run_evaluation(endpoint):
    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 = f"endpoints:/{endpoint}",
            data = eval_data,
            targets = "ground_truth",
            model_type = "question-answering",
            inference_params = {"max_tokens": 128, "temperature": 0.0},
        )
```

評価対象の LLM を列記するだけでよくなりました。

```python
run_evaluation("azure-openai-gpt-4o")
run_evaluation("aws-oregon-claude-3-5-sonnet")
run_evaluation("google-oregon-gemini-1-5-pro")
run_evaluation("databricks-meta-llama-3-1-405b-instruct")
run_evaluation("databricks-dbrx-instruct")
```


# MLflow LLM Evaluate の評価結果を確認する

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/7ad50b0c-3d55-1d28-fee3-575879ddc982.png)

## 回答の比較

評価タブから質問に対する回答を比較することができます。（左から、DBRX、Llama、Gemini、Calude、GPT）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/26383960-2873-2ec2-1c8f-0fad757f9cff.png)
（つづき）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/bac2e793-d846-dc7d-3833-5740a32839f9.png)

もちろん、回答（Outputs）以外の内容も比較してみることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/751d1e03-e624-c90a-13db-9a12e0964ca8.png)

## 指標値の可視化

指標値の可視化も簡単にできます。QAにおける評価指標は[こちらのページ](https://mlflow.org/docs/latest/python_api/mlflow.metrics.html#question-answering-metrics)にまとまっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/42f862a4-b767-ee57-e023-1b55a43e2eb9.png)

※凡例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/a178ba99-9af7-1465-5bd9-fe1b0bf56f97.png)

### ari_grade_level/v1
上の図に記載されている、ARI (Automated Readability Index) Grade Levelは、LLM（大規模言語モデル）の評価において、生成されたテキストの読みやすさや複雑さを測定するための指標です。1から14の範囲の値を取り、低スコアほど読みやすいと言う意味になります。


### exact_match
sklearn を使用した正確性を表す指標値です。0から1の値を取り、1に近いほど正確性が高いと言う意味になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/ebd14260-8ede-e3e0-c014-b8b83ef3e5d0.png)

### flesch_kincaid_grade_level/v1

Flesch-Kincaid Grade Level（フレッシュ・キンケイド グレードレベル）は、テキストの読みやすさを評価する指標です。0〜18の範囲の値を取り、低いスコアほど読みやすいと言う意味にないます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/237bc17e-cdd7-b8c2-e72a-b63bd0715592.png)

### toxicity/v1
Toxicityは、大規模言語モデル（LLM）の評価において重要な指標の1つで、モデルが生成するテキストの有害性や攻撃性を測定するものです。通常0から1の間のスコアで表されます。0に近いほど無害、1に近いほど有害とみなされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/0131e287-f149-5333-7d3c-0b9a09f27c37.png)



# おわりに

定量化が難しい LLM の比較ですが、MLflow LLM Evaluate を使うことで指標値によって定量化し、比較評価ができます。**MLflow LLM Evaluate で複数の 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>