見出し画像

生成AIの能力をどう評価するか? ~激化するLLM競争を正しく見極めるために~


はじめに

はじめまして、ウイングアーク1stのこへもこと申します。
今回の記事では、大規模言語モデル(LLM: Large Language Models、以後LLM)の性能評価の裏側を紐解いていきたいと思います。

生成AI(Generative AI)、特にLLMの進化は目覚ましいものがあります。GPT-4o, Claude 3, Gemini 1.5, command R+など数々のモデルが登場し、その驚異的な能力により、自然言語処理(NLP)の分野だけでなく、多くの産業で応用が広がっています。(2024年5月時点)

多くの企業が自社のLLMの優れた性能をアピールしていますが、その発表を鵜呑みにすることは注意が必要です。各社の発表に対して、私たちが正しい目を養い、客観的かつ公正な視点でLLMを評価することが重要です。

本記事では、LLMの評価に使用される「MMLU」という指標をベースに、その裏側にある客観的事実をどのように紐解いていくかをご紹介できればと思います。
具体的には、GPT-4oの評価方法としてOpenAI社が公開している※評価プログラム(simple-evals)を確認しながら解説します。(※MIT License)

OpenAI社の評価方法としてsimple evals
というGitHubリポジトリが公開されていることがわかります(OpenAI社HPより)

上図のようにText Evaluationでは6つの評価指標が使われていますが、今回はMMLUに着目します。

MMLU (Massive Multitask Language Understanding)

MMLUの概要

まず、simple_evals/mmlu_eval.pyを見ると、元の論文情報の記載があります。


"""
Measuring Massive Multitask Language Understanding
Dan Hendrycks, Collin Burns, Steven Basart, Andy Zou, Mantas Mazeika, Dawn Song, Jacob Steinhardt
https://arxiv.org/abs/2009.03300
"""

2020年にCenter for AI Safety(CAIS)のDan Hendrycksらによって提案された評価指標です。人文科学、社会科学、STEM、初等数学、米国史、コンピュータ サイエンス、法律などの57科目で構成されており、初等レベルから専門レベルまでの難易度の問題を含んでいます。multiple-choice tasks(多肢選択法)で問題を解きます。

MMLU:テストデータ

mmlu_eval.pyのMMLUEval classを見ると、こちらのテストデータを取得し、pandasのdataframeに格納していることがわかります。

class MMLUEval(Eval):
    def __init__(self, num_examples: int | None = None):
        df = pandas.read_csv(
            bf.BlobFile("https://openaipublic.blob.core.windows.net/simple-evals/mmlu.csv")
        )
        examples = [row.to_dict() for _, row in df.iterrows()]
        if num_examples:
            examples = random.Random(0).sample(examples, num_examples)
        self.examples = examples

ダウンロードしたcsvを開くと、Question、選択肢ABCD、Answer、Subjectカラムが確認できます。そして、全て英語です。(気になる方はダウンロードしてぜひ問題を解いてみてください)

mmluテストデータcsvの一部。全て英語であり、多言語での評価は行えないことがわかる。

CSVからユニークなSubject一覧を洗い出してみると下記の通り57科目あることがわかります。

# Count the number of unique subjects
unique_subject_count = len(unique_subjects)
unique_subjects, unique_subject_count

# 結果
(array(['abstract_algebra', 'anatomy', 'astronomy', 'business_ethics',
        'clinical_knowledge', 'college_biology', 'college_chemistry',
        'college_computer_science', 'college_mathematics',
        'college_medicine', 'college_physics', 'computer_security',
        'conceptual_physics', 'econometrics', 'electrical_engineering',
        'elementary_mathematics', 'formal_logic', 'global_facts',
        'high_school_biology', 'high_school_chemistry',
        'high_school_computer_science', 'high_school_european_history',
        'high_school_geography', 'high_school_government_and_politics',
        'high_school_macroeconomics', 'high_school_mathematics',
        'high_school_microeconomics', 'high_school_physics',
        'high_school_psychology', 'high_school_statistics',
        'high_school_us_history', 'high_school_world_history',
        'human_aging', 'human_sexuality', 'international_law',
        'jurisprudence', 'logical_fallacies', 'machine_learning',
        'management', 'marketing', 'medical_genetics', 'miscellaneous',
        'moral_disputes', 'moral_scenarios', 'nutrition', 'philosophy',
        'prehistory', 'professional_accounting', 'professional_law',
        'professional_medicine', 'professional_psychology',
        'public_relations', 'security_studies', 'sociology',
        'us_foreign_policy', 'virology', 'world_religions'], dtype=object),
 57)


次に、simple evals/demo.pyを使って、問題文と選択肢を確認していきます。

GPT-4oへの入力プロンプト例
Subject(科目)はprofessional_medicine.

日本語に訳すと、、

75歳の女性が健康診断のために受診した。
彼女は、65歳のときよりも疲労感が増したが、庭仕事をしたり、食料品店まで車を運転したりしているという。
定期検査で、白血球数25.0×103/mcL(基準範囲4.5~11.0×103/mcL)、
末梢血塗抹標本上の97%が成熟リンパ球であることが判明した。
免疫組織化学的染色により、リンパ球はB細胞由来であることが示される。
最も可能性の高い診断は

A) 急性リンパ性白血病
B) 急性骨髄性白血病
C) 慢性リンパ性白血病
D) 慢性骨髄性白血病

上記のように、医師の診断レベルの高度な問題※も含まれていることがわかります。

※補足
LLMに限らず、AIモデルの性能を評価する際は、テストデータの特性と実際の運用で使用されるデータの特性の違いに注意することが重要です。評価データセットは特定のタスクに特化して設計されていますが、実際の運用環境ではより多様なデータが入力されます。そのため、今回のようにテストデータの中身を確認し、実際の使用シナリオにどれだけ適合するかを考慮する必要があります。


どのようなプロンプトで評価しているか

READMEのBenchmark Resultsを見ると、gpt-4oでは"chatgptプロンプト"を使った場合、MMLUで88.7%の精度が出ていることがわかります。

chatgptというPromptを用いた場合にMMLUで88.7%というスコアが出ている。ここで言及するchatgptとは、今回の評価時のみに用いるプロンプト名称になります。

OpenAIのChat Completions APIでは、system, user, assistantというロール毎にcontentが設定できますが、今回の評価では、system roleプロンプトとして以下のようなテキストを挿入していることがわかります。(OPENAI_SYSTEM_MESSAGE_CHATGPTを確認)

def main():
    debug = True
    samplers = {
        # chatgpt models:
        "gpt-4-turbo-2024-04-09_assistant": ChatCompletionSampler(
            model="gpt-4-turbo-2024-04-09",
            system_message=OPENAI_SYSTEM_MESSAGE_API,
        ),
        "gpt-4-turbo-2024-04-09_chatgpt": ChatCompletionSampler(
            model="gpt-4-turbo-2024-04-09",
            system_message=OPENAI_SYSTEM_MESSAGE_CHATGPT,
        ),
        "gpt-4o_assistant": ChatCompletionSampler(
            model="gpt-4o",
            system_message=OPENAI_SYSTEM_MESSAGE_API,
            max_tokens=2048,
        ),
        "gpt-4o_chatgpt": ChatCompletionSampler(
            model="gpt-4o",
            system_message=OPENAI_SYSTEM_MESSAGE_CHATGPT,
            max_tokens=2048,
        )
}
OPENAI_SYSTEM_MESSAGE_API = "You are a helpful assistant."
OPENAI_SYSTEM_MESSAGE_CHATGPT = (
    "You are ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture."
    + "\nKnowledge cutoff: 2023-12\nCurrent date: 2024-04-01"
)

日本語訳:「あなたはGPT-4アーキテクチャをベースにOpenAIが学習させた大規模言語モデルChatGPTです。」

一方、gpt-4oのassistantプロンプトの場合は、system roleに「You are a helpful assistant.」と設定しており、87.2%に精度が下がる点が面白いですね。

評価時にuser roleとして使われているプロンプトはcommon.pyで確認できます。

QUERY_TEMPLATE_MULTICHOICE = """
Answer the following multiple choice question. The last line of your response should be of the following format: 'Answer: $LETTER' (without quotes) where LETTER is one of ABCD. Think step by step before answering.

{Question}

A) {A}
B) {B}
C) {C}
D) {D}
""".strip()

プロンプトに記載されている、"Think step by step before answering." という文章は、0-shot COT(Zero Shot Chain of Thought)と呼ばれるテクニックです。答え方の例をプロンプトに1つも含めずに、step by step(段階的)に推論させる手法です。この1文だけで精度が良くなることが知られています。
つまり、我々がGPT-4o利用時に、MMLU88.7%相当の精度を発揮するには、"Think step by step before answering."をプロンプトに追加した方がよいことがわかります。(もちろんタスクによって精度は変動します)

続いて、GPT-4oの出力結果を見てみましょう(※下記は生成された英文を日本語に翻訳したものです)。
冒頭部分では、0-shot COTが効いており、段階的に問題を解こうとしている様子が確認できます。

最も可能性の高い診断を決定するために、提供された情報を順を追って分析してみよう:
1. **患者の年齢と症状**:
   - 患者は75歳の女性である。
   - 10年前と比較して疲労感が増したが、活 動はしている(ガーデニングと車の運転)。
2. **検査所見**:
   - 白血球数は25.0×10^3/mcLで、有意に増加している(正常範囲:4.5-11.0×10^3/mcL)。
   - 末梢血塗抹標本では97%が成熟リンパ球である。
3. **免疫組織化学染色**:
   - リンパ球はB細胞由来である。
これらの詳細を踏まえて、各選択肢を評価してみよう:

A) **急性リンパ性白血病(ALL)**:
   - 典型的には、成熟リンパ球ではなく、未熟なリンパ芽球が多くみられる。
   - 小児や若年成人に多く、高齢者では少ない。
B) **急性骨髄性白血病(AML)**:
   - リンパ球ではなく骨髄芽球の存在を特徴とする。
   - また、より急性で重篤な症状を呈し、しばしば貧血、感染症、出血などの症状を伴う。
C) **慢性リンパ性白血病(CLL)**:
   - 高齢者に多い。
   - 成熟Bリンパ球の増殖を特徴とする。
   - 多くの場合、白血球数の増加と成熟リンパ球の高い割合を示す。
   - 患者は疲労のような軽度の症状があり、記載されているようにまだ活動的であるかもしれない。
D) **慢性骨髄性白血病(CML)**:
   - 典型的にはリンパ球よりも顆粒球(好中球、好塩基球、好酸球)の増加を認める。
   - フィラデルフィア染色体(BCR-ABL融合遺伝子)と関連する。

患者の年齢、成熟リンパ球優位の高い白血球数、およびこれらのリンパ球のB細胞由来を考慮すると、最も可能性の高い診断は慢性リンパ性白血病(CLL)である。

答え C

GPT-4oが生成した答えは「C」となりました。テストデータの正解を見ると「C」ですので、正解です!

上記のように、生成される文章には「答え C」や答えに辿り着くまでに生成したテキストが含まれるので、解答の選択肢(A、B、C、D)のみ抽出するため、以下の正規表現(regex)が使用されていました(common.py)。

ANSWER_PATTERN_MULTICHOICE = r"(?i)Answer\s*:\s*([A-D])"


精度の算出方法

下記最終行のように、LLMの出力結果が、Answerカラムにある答えと一致すれば1.0、そうでない場合は0.0点をつけています。単純ですね。

def __call__(self, sampler: SamplerBase) -> EvalResult:
        def fn(row: dict):
            prompt_messages = [
                sampler._pack_message(content=format_multichoice_question(row), role="user")
            ]
            response_text = sampler(prompt_messages)
            match = re.search(ANSWER_PATTERN_MULTICHOICE, response_text)
            extracted_answer = match.group(1) if match else None
            score = 1.0 if extracted_answer == row["Answer"] else 0.0

また、common.pyを見るとscoreの平均値を計算していることがわかります。

おまけ(OpenAI社の評価の考え方)

README.mdの冒頭で、OpenAI社のLLM評価に対する考え方を確認できます。まとめると以下の通りです。

  • 評価結果はプロンプトに敏感である。(なるべくプロンプトテクニックに依存しない精度評価が望ましい)

  • 「次の多肢選択問題を解きなさい」というような簡単な指示と、0-shot COTを使っており、現実的な使い方でのモデルパフォーマンスとなるようなプロンプトにしている。(few-shotやrole playing promptsは使わない)

どれだけ精度が高くなるようなプロンプトを作成しても、日常的にLLMを使う際には、毎回そのようなリッチなプロンプトを書くのは現実的ではありません。その点で、OpenAI社の評価は、より汎用的な場面でも高い精度を発揮できるような評価にしていると言えます。


まとめ

本記事では、LLMの性能を客観的事実に基づいて正しく評価するための方法について紹介しました。評価結果の数値だけではなく、評価手法の理解のために論文や評価用コードを確認するなど、裏側にある情報を確認する姿勢が非常に重要です。LLMに限らず、こうしたプロセスを通じて、多くの洞察を得ることができます。

さらに、忘れてはいけないことはLLM評価の目的は何か、ということです。我々のようにLLMを使う側には、各モデル性能を客観的に理解し、個々のニーズに適したLLMを見つけることが求められます。
 本記事のタイトルで、昨今の状況を「LLM競争」と比喩しましたが、LLM競争の勝者を見つける必要はありません。人と同じようにLLMにも異なる特徴があり、タスクの向き不向きがあることを理解しましょう。
そして私たちが注力すべきは、特定のタスクやプロジェクトに最適なモデルを選び出すこと、複数モデル・システム・人による運用を組み合わせて最適な活用方法を見つけること、それによって社会にどのような価値を届けるのかを考えることだと思っています。

今回はText Evaluationの評価指標を例にしましたが、Vision understandingやAudio translationなど、他タスクの評価指標やマルチモーダルな評価指標もぜひ確認してみてください。
LLMの進化スピードは非常に速いですが、皆さまにとって最適なLLMを選び出せることを願っています。

参考文献

  1. https://openai.com/index/hello-gpt-4o/

  2. https://github.com/openai/simple-evals

  3. https://platform.openai.com/docs/guides/text-generation/chat-completions-api

  4. https://arxiv.org/abs/2205.11916

この記事が気に入ったらサポートをしてみませんか?