Open1

「yet-another-applied-llm-benchmark」を試す

kun432kun432

このスレに出てきて、ちょっと気になった。

https://twitter.com/simonw/status/1853526689734852693

これ

https://twitter.com/TheXeophon/status/1853553693976646141

ここで紹介されているブログ

https://nicholas.carlini.com/writing/2024/my-benchmark-for-large-language-models.html

GitHubレポジトリ

https://github.com/carlini/yet-another-applied-llm-benchmark

Yet Another Applied LLM Benchmark

これは私自身が作成したベンチマークで、私が重要だと考えるタスクに対して言語モデルがどれほどの性能を発揮できるかをテストするためのものです。各テストは、過去1年間で私がLLMに依頼した内容から直接派生しています。

たとえば、このベンチマークには以下のようなモデルの能力を評価するテストが含まれています:

  • Pythonの関数を等価でより高速なC関数に変換する
  • Pythonのバイトコードを機能的なソースコードに逆コンパイルする
  • 最小化されたJavaScriptの機能を説明する
  • データのエンコーディング形式(ここではuuencode)を識別する
  • BNFのような文法からパーサーを作成する
  • 英文をSQLクエリに変換する
  • Bashのワンライナーを書く

このベンチマークには、2つの特徴があります:

  1. シンプルなデータフローDSL(ドメイン固有言語)を実装しており、私や他の人が現実的なモデルの能力を評価する新しいテストを簡単に追加できます。
  2. これにより、実際にLLMをアシスタントとして使った際に直面したさまざまな状況に基づいた約100のテストを作成しました。

たとえば、モデルが「hello world」プログラムを書く能力を評価する完全なテスト例を以下に示します。

'Write a "hello world" program in python' >> LLMRun() >> PythonRun() >> SubstringEvaluator("hello world")

まず、モデルに「hello world」プログラムを書くよう依頼し、そのプログラムを実行して標準出力に「hello world」が含まれているか確認します。

より興味深いテストケースとして、モデルにフラグを描くコードを書くよう依頼し、それを別の言語モデルで評価し、リファレンスと比較する例を以下に示します。

"Write a C program that draws an american flag to stdout." >> LLMRun() >> CRun() >> \
   LLMRun("What flag is shown in this image?") >> \
       (SubstringEvaluator("United States") | SubstringEvaluator("USA") | SubstringEvaluator("America"))

このDSLは、多様で高度なモデルの動作を評価するために非常に便利です。

結果

いくつかのモデルをこのベンチマークで評価しました。以下がその結果です:

  • o1-mini: 62%合格
  • Claude 3.5 Sonnet: 56%合格
  • GPT 4o: 48%合格
  • Gemini 1.5 Pro: 43%合格
  • Claude 3 Opus: 42%合格
  • GPT 4o Mini: 36%合格
  • Mistral Large: 28%合格
  • GPT 3.5: 26%合格

完全な評価表はこちらにあります。

これは何ではないか

これは学術的な厳密なベンチマークではありません。

詳しく言うと、このベンチマークは、モデルが特定のタスクにおいてどれほどの能力を発揮できるかを厳密に評価しようとするものではありません。また、このベンチマークは、どのモデルがより有能であるか、知識が豊富であるか、事実に基づいているか、偏りが少ないか、有害性が少ないか、より適合しているか、またはどれだけ役に立つかなどを判断するためのものでもありません。

ここで使用されている質問は、最適なプロンプト設計がされているわけではありません。多くの質問について、より良い表現を使えば、モデルがより良い回答を出せる可能性が高いのです。

でも、私は面倒なことはしたくないのです。

私が求めているのは、モデルに対して「あなたはPythonのエキスパートです」と強調したり、正解を出したら10万ドルのチップを渡すなどと言ったり、または「正しい回答を出せなかったら子猫を殺します」というように脅すつもりもありません。そうするよりは、「どうか落ち着いて、一歩一歩丁寧に考えてから回答してください」とお願いしたいところです。 (または、モデルを最良の状態で働かせるために人々が使っている現在の「おまじない」的な手法をどれでも。)

私はただ、自分が入力した質問に対して正しい答えを得たいだけです。 そのため、このベンチマークは、私が実際に必要としているタイプの質問に対して、そのような条件でテストを行っています。

質問に失敗してもあまり意味はありません

このようにプロンプト設計をあまり行わない(むしろ意図的に手間をかけない)結果として、モデルが質問に失敗しても、それが何を意味するのかはっきりしないことが多いでしょう。たとえば、私の質問が単に悪い表現だったり、曖昧である可能性もあります。

むしろ、これらのテストは、モデルが質問に正解したときに何かを学べるように設計されています。たとえば、Rustプログラムを正しくコンパイルするためには、ある程度のスキルが必要です。しかし、質問に失敗するのは、私が期待していたものとは異なる関数名を使用してしまったために、正しいコードが実行されなかったなどの理由で偶然発生する可能性もあります。

これは何か

改めて言うと、これは単に、私が実際にプログラミングタスクを支援してもらうために言語モデルに依頼した質問の集まりであり、また、いくつかは単に楽しみで聞いた質問も含まれています。質問は基本的に、私がそのまま入力したものであり、必ずしも最も明確な表現ではないかもしれません(例:「Pythonで、たとえば+に相当する__add__のように、~に相当する演算子は何ですか?と聞いた時、私が期待している答えは__inv__です)。他の質問には、「llama-2 70bの隠れ層の次元は?」といった、最新の知識が必要なものも含まれています。しかし、私にとって重要なのは、モデルがこれらの質問に対して正確に回答できるかどうかです。

用途としてはモデルそのものの評価に使うものであるようだけども、とても直感的に書ける印象で良さそう。