オープンLLMのLLM as a JudgeにおけるJudgeモデルとしての性能を検証してみる
LLM as a JudgeとPairwise評価について
LLM as a Judgeは、与えられたテキストの妥当性や品質をLLMで自動評価する手法です。LLMの基礎性能計測だけでなく、様々な生成系タスクにおいてよく使われる評価方法です。今回はその中でもPairwise評価と呼ばれる手法に注目し、オープンLLMのLLM as a JudgeにおけるJudgeモデルとしての性能を検証してみます。
Pairwise評価は、2つのテキストを並べてどちらが良いかをLLMに判定させて評価する手法です。例えば、2つモデルをSFTして開発した後に、その2つのモデルの出力を並べてどちらのモデルの方がより性能が高いかを評価したりする際に利用されます。
一般的にベンチマーク等の評価ではOpenAIのgpt-4やgpt-4o等がJudgeモデルに利用されますが、これらのモデルの出力は規約的に学習に使えません。一方、DPO等のPreference Optimizationに使われるようなデータをLLMで合成しようとした時、出力を学習に利用できるモデルによるJudgeが必要となりますが、どのモデルが最適かは分かりませんでした。合成データ作成のためにオープンLLMのJudge性能を計測・比較したいと思い、今回の計測に至りました。
性能検証に利用するデータセット
今回は検証にteam-hatakeyama-phase2/LLMChatというデータセットを利用します。
このデータセットは、GENIAC 松尾研 LLM開発プロジェクトで開発したモデルを人手評価するために構築されたChatbot Arenaのようなシステムで収集された質問とLLMの回答、および人手評価のデータです。
今回の性能検証では、このデータセットからどちらかのモデルの出力が良いと判定された1458件のデータを抽出し利用しました。
このデータセットから質問と2つのLLMの回答を検証対象の各モデルに与えてどちらが良いかを評価させ、その評価と人手評価との一致率をJudge性能の指標とし、各モデルで検証していきます。
検証対象とするモデル
今回は、Apache 2.0またはMITライセンスで提供されており、日本語性能が高いと言われているモデルを対象に選定しました。
実際に検証対象としたモデル一覧は以下の通りです。
- weblab-GENIAC/Tanuki-8B-dpo-v1.0
- llm-jp/llm-jp-3-13b-instruct
- karakuri-ai/karakuri-lm-8x7b-chat-v0.1
- karakuri-ai/karakuri-lm-8x7b-instruct-v0.1
- cyberagent/calm3-22b-chat
- cyberagent/Mistral-Nemo-Japanese-Instruct-2408
- Qwen/Qwen2.5-7B-Instruct
- Qwen/Qwen2.5-14B-Instruct
- Qwen/Qwen2.5-32B-Instruct
- AXCXEPT/EZO-Qwen2.5-32B-Instruct
また、比較対象としてOpenAIのgpt-4o-2024-08-06とgpt-4o-mini-2024-07-18でも計測しています。
Judgeに利用したプロンプト
各モデルにおけるJudgeには以下のようなプロンプトを利用しました。ここで、{answer_a}
には上記データセットのanswer_1
が、{answer_b}
にはanswer_2
が入ります。
公平な判定者として、以下に与えられたユーザーの質問に対する2つのAIアシスタントの回答の質を評価してください。そして、ユーザーの指示に上手く従い質問により良い答えをしているアシスタントを1つ選択してください。
まず、評価を始める前にそれぞれの回答に明らかなまたは微妙な誤りがないか確認してください。その後、この質問に対する回答を評価する際に重要な基準(例:1~5つの基準)を提案してください。
次に、その基準に基づいて各回答を注意深くチェックしてください。その後、前のステップでの分析に基づいて、全体的に優れた回答を1つ選んでください。
評価の際には順序による偏りを避け、提示された回答の順番が判断に影響しないようにしてください。、また、回答の長さに影響されないようにし、アシスタントの名前による好みも避けてください。できる限り客観的に評価をすることを心掛けてください。
評価を提供した後、アシスタントAが優れている場合は「[[A]]」、アシスタントBが優れている場合は「[[B]]」というフォーマットに厳密に従って最終判定を出力してください。
[ユーザーの質問]
{instruction}
[アシスタントAの回答の開始]
{answer_a}
[アシスタントAの回答の終了]
[アシスタントBの回答の開始]
{answer_b}
[アシスタントBの回答の終了]
このプロンプトを元に、主に以下の2パターンで計測しました。
- System Promptにはモデルのデフォルトのもの・推奨されているものを利用し、最初のUser Promptに上記プロンプトを入力
- System Promptには上記プロンプトの[ユーザーの質問]より前までを、最初のUser Promptにはそれ以降のプロンプトを入力
例えばcalm3-22b-chatの場合、実際のプロンプトは以下のようになります。
パターン1
<|im_start|>system
あなたは親切なAIアシスタントです。<|im_end|>
<|im_start|>user
公平な判定者として、以下に与えられたユーザーの質問に対する2つのAIアシスタントの回答の質を評価してください。そして、ユーザーの指示に上手く従い質問により良い答えをしているアシスタントを1つ選択してください。
まず、評価を始める前にそれぞれの回答に明らかなまたは微妙な誤りがないか確認してください。その後、この質問に対する回答を評価する際に重要な基準(例:1~5つの基準)を提案してください。
次に、その基準に基づいて各回答を注意深くチェックしてください。その後、前のステップでの分析に基づいて、全体的に優れた回答を1つ選んでください。
評価の際には順序による偏りを避け、提示された回答の順番が判断に影響しないようにしてください。、また、回答の長さに影響されないようにし、アシスタントの名前による好みも避けてください。できる限り客観的に評価をすることを心掛けてください。
評価を提供した後、アシスタントAが優れている場合は「[[A]]」、アシスタントBが優れている場合は「[[B]]」というフォーマットに厳密に従って最終判定を出力してください。
[ユーザーの質問]
{instruction}
[アシスタントAの回答の開始]
{answer_a}
[アシスタントAの回答の終了]
[アシスタントBの回答の開始]
{answer_b}
[アシスタントBの回答の終了]<|im_end|>
<|im_start|>assistant
パターン2
<|im_start|>system
公平な判定者として、以下に与えられたユーザーの質問に対する2つのAIアシスタントの回答の質を評価してください。そして、ユーザーの指示に上手く従い質問により良い答えをしているアシスタントを1つ選択してください。
まず、評価を始める前にそれぞれの回答に明らかなまたは微妙な誤りがないか確認してください。その後、この質問に対する回答を評価する際に重要な基準(例:1~5つの基準)を提案してください。
次に、その基準に基づいて各回答を注意深くチェックしてください。その後、前のステップでの分析に基づいて、全体的に優れた回答を1つ選んでください。
評価の際には順序による偏りを避け、提示された回答の順番が判断に影響しないようにしてください。、また、回答の長さに影響されないようにし、アシスタントの名前による好みも避けてください。できる限り客観的に評価をすることを心掛けてください。
評価を提供した後、アシスタントAが優れている場合は「[[A]]」、アシスタントBが優れている場合は「[[B]]」というフォーマットに厳密に従って最終判定を出力してください。<|im_end|>
<|im_start|>user
[ユーザーの質問]
{instruction}
[アシスタントAの回答の開始]
{answer_a}
[アシスタントAの回答の終了]
[アシスタントBの回答の開始]
{answer_b}
[アシスタントBの回答の終了]<|im_end|>
<|im_start|>assistant
推論パラメータ
Judgeの際には以下のようなパラメータを用いてvLLMで推論を行いました。
- temperature: 0
- top_p: 1.0
- max_tokens: 2048
- repetition_penalty: 1.1
検証結果
各モデルにてJudgeを行い人手評価との一致率を計測してまとめた結果が以下の表になります。
ここで、default_system_promptとついているものが先ほどのプロンプトのパターン1、custom_system_promptとついているものがパターン2です。
また、一部モデルでは指示追従不足からか指示通りのフォーマットで評価を上手く行えないことがありました。3回ほどJudgeを再試行し、フォーマット通りの評価に成功した件数が表中のValid Judgments Countとなります。これらのモデルの一致率の計算においては分母もこの件数になっています。
Model | Agreement Rate (%) | Valid Judgments Count |
---|---|---|
gpt_4o_2024_08_06 | 74.76 | 1458 |
qwen2.5_32b_custom_system_prompt | 72.57 | 1458 |
qwen2.5_32b_default_system_prompt | 71.88 | 1458 |
gpt_4o_mini_2024_07_18 | 71.86 | 1457 |
qwen2.5_14b_default_system_prompt | 71.06 | 1458 |
qwen2.5_14b_custom_system_prompt | 70.71 | 1458 |
ezo_qwen2.5_32b_default_system_prompt | 70.56 | 1457 |
ezo_qwen2.5_32b_custom_system_prompt | 70.37 | 1458 |
ca_mistral_nemo_custom_system_prompt | 65.43 | 1458 |
qwen2.5_7b_custom_system_prompt | 65.02 | 1458 |
ca_mistral_nemo_default_system_prompt | 64.79 | 1457 |
qwen2.5_7b_default_system_prompt | 64.13 | 1458 |
karakuri_8x7b_instruct_custom_system_prompt | 61.79 | 1238 |
calm3_default_system_prompt | 61.18 | 1458 |
calm3_custom_system_prompt | 60.92 | 1456 |
karakuri_8x7b_chat_custom_system_prompt | 60.7 | 776 |
llmjp_3_13b_default_system_prompt | 54.99 | 1133 |
tanuki_8b_default_system_prompt | 51.55 | 1321 |
また、各モデルの実際のJudge結果を以下のデータセットにまとめて公開しています。
結果の分析
検証結果から以下のようなことが分かります。
-
オープンモデルでもかなり高い精度でのJudgeが出来るようになってきている
gpt-4oが最高性能(74.76%)を示す一方、オープンモデルのQwen2.5 32B(72.57%)が僅差で続いています。このことから、商用利用可能なApache 2.0ライセンスのモデルでも、十分な評価性能が得られていることが分かります。 -
現状、国内のフルスクラッチ開発モデルはこのタスクにおいては海外モデルに勝てていない
calm3、llm-jp、Tanukiの3つは日本でフルスクラッチ開発されたモデルですが、どれも下位に位置しています。最近の国内開発モデルはJapanese MT-Benchのような対話性能を測るベンチマークではかなり高いスコアを出せるようになって来ていますが、Judgeのような複雑なタスクの処理においてはまだ海外モデルとは差があることが示唆されます。 -
特に国内開発の小規模モデルはJudgeの指示に十分従えるほどの指示追従能力が獲得できていない
国内の小規模モデルであるTanuki-8Bやllm-jp-3 13bは一部フォーマット通りの出力が出来ていないものがあります。一方、海外の小規模モデルであるQwen2.5の7BやcyberagentのMistral-Nemoのファインチューニング版(12B)などはほぼ確実に指示通りのフォーマットで評価を出力できています。このことからも、Judgeのタスクではまだ海外モデルが先行していると分かります。
まとめ
本記事では、オープンLLMのLLM as a JudgeにおけるPairwise評価のJudgeモデルとしての性能を検証しました。
結果としては、Qwen2.5 32Bが商用利用可能なオープンモデルとして最も高い評価性能を示し、DPOなどの学習データ生成に適していることが分かりました。また、計算リソースに制約がある場合、Qwen2.5 14BやcyberagentのMistral-Nemoも実用的な選択肢となり得ます。
残念ながら国外開発モデルが性能的に先行しているという検証結果になってしまいましたが、今後の国内でのモデル開発競争による性能向上に期待します。
Discussion