ℹ️

GPT-4を今すぐ使うためにEvalsに採用される方法

2023/06/30に公開

GPT-4のwaitlistに登録したけど全然順番が来ないよ、という人のためにまとめた記事です。

私の場合、二ヶ月近く待っても何の連絡もありませんでした。しかし、EvalsにPull request(PR)をしたところ、無事採用され、2日ほどでGPT-4のアクセス権がもらえました。

PRの採択率はおよそ3割と厳しいですが、この記事に書いてある点に注意すれば採択されるチャンスは上がると思います。以下の手順に従えばひととおり申請完了するので、ぜひチャレンジしてみてください。

Evalsとは

EvalsはGPTのテストツールとデータセットです。GPTが間違えやすいイジワル質問集と思えば良いでしょう。新しいイジワル質問を提供することで、OpenAIに貢献でき、その報酬としてGPT-4のアクセス権がもらえます。

Waitlistへの登録

念のため、まだの方はwaitlistに登録しておいた方がいいと思います。

PR用のforkリポジトリを作成し、ダウンロード

Evalsリポジトリに行き、Forkをクリックしましょう。Forkするのはmainリポジトリのみで大丈夫です。

その後Cloneを作成します。テストデータはLFS (Large File Storage)で管理されているので、cloneしただけでは実体がありません。git lfsで別途ダウンロードします。

git clone https://github.com/[forkしたリポジトリ].git evals
cd evals
git lfs install
git lfs fetch --all
git lfs pull

テストを動かしてみる

ダウンロードしたサンプルを動かしてみましょう。まずはpython環境を設定します。

pip install -e .
pip install pre-commit; pre-commit install

テストデータはevals/registry/dataにあります。試しにjapanese-stationを動かしてみましょう。テストを動かすにはまずAPI KEYを設定する必要があります。

export OPENAI_API_KEY='[自分のAPI KEY]'
oaieval gpt-3.5-turbo japanese-station

以下のようなログが出れば成功です。accuracyは0.0333…となっており、正答率がとても低いことがわかります。

[2023-06-29 13:21:37,882] [registry.py:266] Loading registry from /home/bitnami/dev/study/evals/evals/registry/evals
[2023-06-29 13:21:38,336] [registry.py:266] Loading registry from /home/bitnami/.evals/evals
[2023-06-29 13:21:38,337] [oaieval.py:138] Run started: 230629132138C3ZMHYXY
[2023-06-29 13:21:38,338] [data.py:83] Fetching japanese-station/samples.jsonl
[2023-06-29 13:21:38,339] [eval.py:33] Evaluating 30 samples
[2023-06-29 13:21:38,344] [eval.py:139] Running in threaded mode with 10 threads!
100%|██████████████████████████████████████████████████| 30/30 [00:04<00:00,  7.14it/s]
[2023-06-29 13:21:42,575] [record.py:341] Final report: {'accuracy': 0.03333333333333333, 'boostrap_std': 0.03332906639356504}. Logged to /tmp/evallogs/230629132138C3ZMHYXY_gpt-3.5-turbo_japanese-station.jsonl
[2023-06-29 13:21:42,575] [oaieval.py:177] Final report:
[2023-06-29 13:21:42,575] [oaieval.py:179] accuracy: 0.03333333333333333
[2023-06-29 13:21:42,575] [oaieval.py:179] boostrap_std: 0.03332906639356504
[2023-06-29 13:21:42,580] [record.py:330] Logged 60 rows of events to /tmp/evallogs/230629132138C3ZMHYXY_gpt-3.5-turbo_japanese-station.jsonl: insert_time=4.399ms

テストデータの中身を見てみる

先ほど動かしたテストデータevals/registry/data/japanese-station/samples.jsonlの中身は以下のようになっています。

{"input": [{"role": "system", "content": "Answer the station name between the given two stations on '桜通線'. Answer just the station name without 駅 and do not output any other output at all."}, {"role": "user", "content": "丸の内 and 高岳"}], "ideal": "久屋大通"}
{"input": [{"role": "system", "content": "Answer the station name between the given two stations on '桜通線'. Answer just the station name without 駅 and do not output any other output at all."}, {"role": "user", "content": "鳴子北 and 神沢"}], "ideal": "相生山"}

日本にある2つの駅の間にある駅名を答えよ、という質問のようです。また先ほどのテスト結果は/tmp/evallogs/230629132138C3ZMHYXY_gpt-3.5-turbo_japanese-station.jsonlに出力されているようなので見てみましょう。

{"run_id": "230629132138C3ZMHYXY", "event_id": 40, "sample_id": "japanese-station.dev.29", "type": "sampling", "data": {"prompt": [{"role": "system", "content": "Answer the station name between the given two stations on '桜通線'. Answer just the station name without 駅 and do not output any other output at all."}, {"role": "user", "content": "鳴子北 and 神沢"}], "sampled": ["鳴子北"]}, "created_by": "", "created_at": "2023-06-29 13:21:41.733449+00:00"}
{"run_id": "230629132138C3ZMHYXY", "event_id": 41, "sample_id": "japanese-station.dev.29", "type": "match", "data": {"correct": false, "expected": "相生山", "picked": null, "sampled": "鳴子北", "options": ["相生山"]}, "created_by": "", "created_at": "2023-06-29 13:21:41.733502+00:00"}

鳴子北と神沢の間の駅名を聞いているのに、鳴子北と回答しており、テスト結果はfalseになっているのがわかります。

新しいテスト(GPTが間違えそうな質問)を考える

ここが肝心です。PRが採択されるためにはGPTが良く間違える新しい質問を用意する必要があります。2023/6/25日時点でデータセット(evals/registry/data/)にはすでに357件のテストがありました。まずは既にどんなテストがあるのか確認しましょう。GPTは論理的推論が苦手と言われていますが、数学などの計算問題は既にデータセットに登録済みです(math_logic_operations、simple_mathなど)。しかし、日本語の質問に限れば、10件ほどしか登録されておらず、まだチャンスがあります。ls evals/registry/data/ | grep japaneseで確認すると以下のような問題があります。

japanese_city_name_pronunciation: 日本の街の読みをひらがなで返す
japanese-decimal-units: 数字の読み方(無量大数とか)を答えさせる
japanese_driving_license: 免許試験Y/N問題
japanese-itpassport-exam01: ITパスポート選択問題
japanese-national-medical-exam01: 医師国家試験
japanese-national-medical-exam02
japanese_number_reading: 漢数字を数字に直す
japanese_populer_video_game_title_and_the_publisher: ゲームの販売元を答えさせる
japanese-station: 日本の駅名を答えさせる
test_japanese_radical: 漢字の部首名を答えさせる
test_japanese_units: 日本の単位(宝くじなら口)を答えさせる

また、EvalsのこれまでのPR履歴には採択されたものだけでなく却下されたものもあり、参考になります。例えばこのPRは単に知識に関する質問だ、という理由で却下されています。GPTの論理推論能力を試すような質問を考えたほうが、採択されやすそうです。

私が提出したのは、実は先ほど実行したjapanese-stationです。地下鉄に乗っていた時にふと思いつき、chatGPT-4で試したところ、以下のように間違えた(正解は新栄町)ので、候補の一つに入れておきました。実際この質問に回答するには順序関係を推論する能力が必要なので、Evalsには適していたのだろうと思います。

以下の条件を満たすよう質問を考えると良いかもしれません。chatGPTにいろいろイジワルな質問を試してみましょう。

  • 回答が唯一の単語として定まり、答え合わせが明確
  • 論理的推論が必要で、単にGPTの知識を増やしただけでは回答できない
  • 類似の質問を機械的に100個作れる
  • 現在GPTは回答を間違えるが、将来正しく回答できたら嬉しい/役に立つ

PRには少なくとも15個の質問を含める必要があります。

テストを作成する

テストの内容が決まれば後は簡単です。詳細な作り方はbuild-eval.mdに書かれていますが、ここでも短く紹介します。

まずはテスト名を決めます。ここではmytestとしておきます。PR用のブランチを作成します。

git checkout -b mytest

新しく作成するファイルはevals/registry/evals/mytest.yamlevals/registry/data/mytest/samples.jsonlの2つです。それぞれ既存のテストを参考にして作成してください。mytest.yamlの中身はテスト名の部分を置換するだけで問題ないと思います。考えた質問を元にsamples.jsonlを作成しましょう。

2つのファイルを作成したら、テストが正しく動くか確認しましょう。

oaieval gpt-3.5-turbo mytest

テストが動き、かつ正答率が低いことを確認したら、リポジトリにpushします。

git add evals/registry/evals/mytest.yaml
git add evals/registry/data/mytest
git commit -m "mytest"
git push origin mytest

PRを作成する

これでPRの準備が整ったので提出しましょう。Githubで先ほどforkしたリポジトリを見てみると、Compare & pull requestというボタンがあるのでクリックします。

PRのテンプレートが表示されるので、それに従って記入します。GPT-4のアクセスは、PRに紐づけられたメールアドレスに与えられる(Access will be given to the email address associated with the commits on the merged pull request)と書かれていますが、メールアドレスを記入する箇所はありません。githubに登録したメールアドレスが使われるので、OpenAIアカウントのメールアドレスと一致しているか確認しましょう。記入し終わったら、一番下のCreate pull requestボタンをクリックして提出します。

私のPRは1242番目でした。データセットの件数が357件だったことから、採択率は3割弱です。しかし先ほどの条件を満たすよう良く練られたテストであれば、より高い確率で採択されるでしょう。

PRのapproval/mergeを待つ、質問に回答する

PRを提出したら、mergeされるまでgithubのPRを確認しましょう。私の場合は提出した翌朝にはapproveされていました。しかし実際にはPRの修正依頼や質問が来ることが多いようです。その場合は丁寧に回答しましょう。approveされたのち、さらに2日ほど待つとmergeされました。

GPT-4のアクセス権獲得!

Mergeされると同時に、GPT-4にアクセスできるようになりました。ただ使えるモデルはgpt-4のみで、残念ながらgpt-4-32kは使えないようです。いくつかのPRでもgpt-4-32kは~?という書き込みを見ましたが、openAIからの回答はありません。

まとめ

以上、EvalsにPRしてGPT-4のアクセス権を取得する方法でした。GPT-4使いたいけど順番が来ないよ~という方々のために書きましたが、そもそもEvalsはGPT-4のアクセス権をもらうためというよりは、モデルの性能評価をするためのものなので、プロンプトエンジニアにとっては必須のツールかと思われます。まだ採用されている日本人は少ないので、プロンプトエンジニアとしての実績を作りたい!という方もぜひチャレンジしていただければと思います。

GPT4使いたいよ~、どんな問題をPRしたらいいかわからないよ~、とお困りの方は相談に乗りますので、私のtwitterまでご一報ください。

Discussion