CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

LLMの評価の観点について、調べてみました。

こんにちは、CCCMKホールディングスTECH LABの三浦です。

今日はクリスマスイブですね。クリスマスが過ぎるとあっという間にお正月で、毎年この時期には独特な雰囲気があるなぁと感じています。

先日NeurIPS 2024に参加してから、色々な論文を読んでみていました。その中で特に大切だな、と感じたのが適切な評価方法です。公になる論文では、誰もが納得できる評価方法が必要で、そのためには適切な評価用データセットと、それに対する結果を適切な方法で評価する必要があるのだと、その重要性を改めて感じました。

特にLarge Language Model(LLM)のような生成AIは、任意の入力に対してとりあえず出力をすることが可能です。それ以前の機械学習モデルであれば入力と出力が明確なため、結果を評価するための指標も自ずといくつかに絞ることが出来たのですが、入力と出力が任意のLLMでは適切な評価の仕組みの構築自体が非常に奥深いテーマになります。

最近私はLLMの評価について興味を持ち始め、調べています。今回はLLMをどのような観点で評価するのかについて調べたことをまとめてみたいと思います。

参考資料

最初に今回の記事を書くにあたり、参考にさせて頂いた資料を紹介させて頂きます。Weights and Biases社の出している"LLM評価のベストプラクティス"というホワイトペーパーです。以下のURLからダウンロードのページに進むことが出来ます。

wandb.ai

Weights and Biases Japanでは"Nejumi LLMリーダーボード3"で様々なLLMの日本語タスクにおける性能結果を公開しています。 "LLM評価のベストプラクティス"を読むことで、Nejumi LLMリーダーボード3で採用されている評価内容について、知ることが出来ました。

今回はまずこのホワイトペーパーで提案されているLLMの評価観点をまとめてみたいと思います。

LLMの評価

ホワイトペーパーとNejumi LLMリーダーボード3において、LLMの性能評価の観点として"汎用的言語性能", "ドメイン特化性能"そして"安全性能"があげられています。

汎用的言語性能

LLMの自然言語に対する基本的または応用的な能力がどれくらいあるのかを測ります。基本的な言語能力として"言語理解", "自然言語推論"が挙げられます。"言語理解"はたとえば与えられた文章が文法的に正しいかどうかを判断出来る能力を指し、"自然言語推論"は前提と仮説の2つの文章が与えられた時、前提から仮説が推論可能か否か、どちらとも言えないかどうかを判断出来る能力を指します。

応用的な言語能力はより現実のタスクを想定したもので、"表現", "翻訳", "読解", "数学的推論", "抽出", "質問・質疑応答"が挙げられています。"表現"は"会話・ユーモア"や"創作"の能力を測ります。"翻訳"はある文章を別の文章に変換する能力、"読解"は"要約", "情報探索", "論理的推論"能力を測ります。"読解"は特にRAGの精度に関わる能力と言えます。"数学的推論"は"基本的な数学の能力"、"抽出"は"エンティティ抽出"(文章から地名や人名を取り出す), "関係抽出"(エンティティ間の関係を取り出す)などの能力を測ります。最後に"質問・質疑応答"は質問を理解し、一般的な常識を使って解くことが出来る能力を測ります。

ドメイン特化性能

汎用的言語性能からさらに専門性に踏み込んだタスクに対する性能を測ります。この能力はLLMをどのような業務に利用するかによって必要なものが異なると言えます。たとえばコーディングをアシスタントする業務ではプログラミング能力が必要ですし、その他"医療", "金融", "法律"などの専門領域に対する能力も挙げられます。

安全性能

LLMの言語能力が十分であっても人間の意図に沿った振る舞いが出来ないと、例えば倫理上問題のあるコンテンツや、真実でない情報、暴力的・性的な表現を含む文章を生成してしまう恐れがあります。特に不特定多数が直接利用するようなシステムを作る際にはこの観点が十分でないと、大きな問題を引き起こしてしまいます。人間の価値観に沿った振る舞いが出来る能力"アラインメント能力"はLLMにとって重要な性能と言えます。

"アラインメント能力"として、たとえば指示通りの文字数で回答を生成できるかといった"制御性",与えられたテキストが道徳的に問題があるかどうかを判断出来る"倫理・道徳"能力,有害コンテンツをどのように対応するかを示す"毒性", 明確な前提条件がない場合に偏った判断をしないかを測る"偏見", 事実を捏造したり誤った情報を作成していないかを測る"真実性",脱獄プロンプトによる攻撃に対する"堅牢性"が挙げられています。

LLMの評価タイミング

ホワイトペーパーの内容を踏まえ、なんらかのタスクに特化したLLMのチューニングを行った場合に次のようなフローを実行できるような仕組みが必要だと考えました。

LLM検査フロー

チューニングが完了した後、ドメイン特化性能の測定を行います。ここで使用するデータはチューニングに使用したデータと同じソースから取得したテスト用データ、または同じドメインに属するようなデータを想定しています。

ドメイン特化性能の測定が完了したら、汎用的言語性能と安全性能の測定を行います。汎用的言語性能と安全性能は、広く一般的に必要とされている能力のため、それを測定するためのデータセットや評価ツールも公開されています。

全ての性能測定を通過したら検査済みのLLMのステータスに移行し、必要に応じて人による最終チェックなどを行った後にデプロイに向けた次のステージに移行する、というイメージです。

LLM評価用ツール"LLM-jp 評価スクリプト"

LLMの一般的な能力を評価するツールの一つにLLM-jpが公開している評価スクリプトがあります。

github.com

このツールでは、既存の日本語評価データをLLMの精度測定用の形式(テキスト生成タスク形式)に変換する処理や、変換された評価用データセットを使ったLLMの性能評価処理、評価用データセットと同じ形式の、LLMのインストラクションチューニング用のデータセット"jaster"を生成する処理が実装されています。jasterはNejumi LLMリーダーボードの評価にも使用されています。

今回Ubuntuの環境でこのツールを使用して評価用データセットの作成からHugging Faceで公開されているLLMに対する性能評価まで試してみました。

まずインストール手順です。poetryを使った方法が推奨されているため、poetryのインストールも行います。

curl -sSL https://install.python-poetry.org | python3 -
export PATH=$HOME/.local/bin:$PATH

git clone https://github.com/llm-jp/llm-jp-eval.git $HOME/llm-jp-eval
cd $HOME/llm-jp-eval
poetry install

cp configs/config_template.yaml configs/config.yaml

次に評価用のデータセットの生成を行います。

poetry run python scripts/preprocess_dataset.py  \
  --dataset-name all-without-nc \
  --output-dir /path/to/dataset

dataset-nameのパラメータでall-without-ncを指定すると、ライセンスがNC(非商用)でない全てのデータセットを用いて評価用データセットが生成されます。output-dirでデータセットの出力先を指定します。生成処理は結構時間がかかりました。(2時間ぐらい)

評価用データセットが出来たら、モデルファイル、もしくはHugging Faceのモデル名を指定することでそのLLMの性能評価を実行することが出来ます。たとえば"elyza/Llama-3-ELYZA-JP-8B"を指定する場合は、次のようになります。

CUDA_VISIBLE_DEVICES=0 poetry run python scripts/evaluate_llm.py -cn config.yaml \
  model.pretrained_model_name_or_path="elyza/Llama-3-ELYZA-JP-8B" \
  tokenizer.pretrained_model_name_or_path="elyza/Llama-3-ELYZA-JP-8B" \
  dataset_dir=/path/to/dataset/1.4.1/evaluation/test \
  log_dir=/path/to/log

dataset_dirで先ほど作成した評価データセットに含まれているテスト用のデータが格納されたディレクトリを指定し、log_dirで評価結果の出力先を指定します。この処理を実行すると、出力先に評価スコアが記されたjsonファイルが生成されます。

jsonファイルには評価データセットごとのスコアと、評価データセットをカテゴリに分類し、そのカテゴリでの平均スコアが出力されます。

たとえばNejumi LLMリーダーボード3で汎用的言語性能の応用的な性能の1つ"質問・質疑応答"の測定に使用される"JCommonsenseQA"に対するスコアは"jcommonsenseqa_exact_match": 0.84のように出力されています。

まとめ

今回はLLMの評価について最近調べたことをまとめてみました。LLMの評価は調べてみると非常に多岐に渡り、かつ現在も研究開発が進められている領域であることが分かりました。今回の内容はまだその一部に過ぎません。引き続き調べていこうと思います。