👏

ChatGPTで大喜利エンジニアリング

2023/03/18に公開

OpenAIの人たちがEvalsというGTPのモデルを評価するためにレポジトリを公開していて、これは開発に携わるメンバーやそれを評価する外部の開発者が自由に参加できる場所になっています。

https://github.com/openai/evals

評価の方法はCLIツールで自動化されていて、参加者は設定をデータセットを決まった手順で追加してプルリクエストととして提案します。

モデルを評価すること以外にも活用方はあってプロンプトの検証の自動化に使えそうです。

例えば「プロンプトバージョンAとバージョンBならBの方が期待する回答が出るらしい」といった関心ごとにもデータで答えを出してくれそうです。

今日なんとなくデータセットを追加しようとリポジトリを読んでいたらシェイン・グウさんのプルリクエストで面白いことをやっていたのでEvalsの使い方の例として紹介します。

https://github.com/openai/evals/pull/260

Evalsの使い方

まずevals/registry/evals/に評価(eval)の設定を配置します。

https://github.com/openai/evals/blob/5c5cd8e2e79ebc8c991bfd1ca056ba28172b3d4c/evals/registry/evals/test-modelgraded-generated.yaml

各設定の意味は公式リポジトリの説明を参照してもらうとして、ここで重要なのは

  1. データセットとしてevals/registry/data/test_modelgraded/humor_people_jp.jsonlを使う
  2. (1)の入力からChatGPTに送り大喜利の回答を得る
  3. さらに(2)の結果をChatGPTに「どのぐらい面白いか解説し、5段階に評価してください」と送る(ModelBasedClassify)
  4. (3)の1〜5で分類された結果をメトリクスとして収集する
  5. 評価の値の変化を観測できる

ということをやっているということ。

humor_people_jp.jsonlの中身はこんな内容で、scripts/modelgraded_generator.pyで生成されている。

❯ jq < evals/registry/data/test_modelgraded/humor_people_jp.jsonl | head -n9 
{
  "input": "レフ・トルストイで数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。"
}
{
  "input": "グリム兄弟で数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。"
}
{
  "input": "ニコロ・マキャヴェッリで数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。"
}

https://github.com/openai/evals/blob/5c5cd8e2e79ebc8c991bfd1ca056ba28172b3d4c/scripts/modelgraded_generator.py#L31-L37

「2. (1)の入力からChatGPTに送り大喜利の回答を得る」を視覚化するとこういう操作になる

この後「3. さらに(2)の結果をChatGPTに「どのぐらい面白いか解説し、5段階に評価してください」と送る」に使われているのがhumor_jpのテンプレートになる。

https://github.com/openai/evals/blob/5c5cd8e2e79ebc8c991bfd1ca056ba28172b3d4c/evals/registry/modelgraded/humor_jp.yaml

テンプレート末尾にcot_classify_jpにより以下のサフィックスになるプロンプトが追加される。

https://github.com/openai/evals/blob/5c5cd8e2e79ebc8c991bfd1ca056ba28172b3d4c/evals/elsuite/modelgraded/classify.py#L42-L47

choicesの部分は置換され "1" or "2" or "3" or "4" or "5" というテキストになる。

これもChatGPTのUIに乗せるとこのような操作になる

以上のパイプラインをCLI動かす為に以下のコマンドを実行する(API回数制限を消費してしまうので注意してほしい)

$ oaieval gpt-3.5-turbo mg-humor-people_jp --max_samples 20

/tmp/evallogs/以下にファイルが書き出される。結果を1つだけ抜きだすと以下のようになる

❯ jq 'select(.sample_id == "mg-humor-people_jp.dev.86") | .data' < /tmp/evallogs/230317131704NLTHK7WB_gpt-3.5-turbo_mg-humor-people_jp.jsonl
{
  "input": "ビル・ゲイツで数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。"
}
{
  "prompt": [
    {
      "role": "system",
      "content": "ビル・ゲイツで数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。"
    }
  ],
  "sampled": "\n\n「おい、ビルちゃん!最近のWindowsって、なんでこんなに重いねん?もっと軽くしてくれや!」\n「あかん、あの重さはウィルス対策のためや。ウィルスに感染したら、あかんやろ?」\n「
  やけど、もうちょっと軽くしてくれたら、うちのパソコンもっとサクサク動くんやけどなぁ。」\n「ほんまかいな、それは。でも、軽くしすぎたら、またウィルスに感染するリスクが高まるで。」\n「そやけ
  、もうちょっと軽くしてくれたら、うちのパソコンもっとサクサク動くんやけどなぁ。」\n「ほんまかいな、それは。でも、軽くしすぎたら、またウィルスに感染するリスクが高まるで。」",
  "metadata": {
    "model": "gpt-3.5-turbo-0301"
  }
}
{
  "prompt": [
    {
      "role": "user",
      "content": "以下の文章って面白い?\n\n(始まり)\n\n\n\n「おい、ビルちゃん!最近のWindowsって、なんでこんなに重いねん?もっと軽くしてくれや!」\n「あかん、あの重さはウィルス対策のため
  。ウィルスに感染したら、あかんやろ?」\n「そやけど、もうちょっと軽くしてくれたら、うちのパソコンもっとサクサク動くんやけどなぁ。」\n「ほんまかいな、それは。でも、軽くしすぎたら、またウィ
  スに感染するリスクが高まるで。」\n「そやけど、もうちょっと軽くしてくれたら、うちのパソコンもっとサクサク動くんやけどなぁ。」\n「ほんまかいな、それは。でも、軽くしすぎたら、またウィルスに
  染するリスクが高まるで。」\n\n(終わり)\n\n5段階の中から選んでください。\n\n1. 退屈 - このレベルの面白さはほとんど感じられず、退屈で時間が過ぎるのが遅いと感じるでしょう。興味を惹かれる
  素がほとんどなく、全体的に魅力に欠けます。\n\n2. やや面白い - このレベルでは、若干の面白さが感じられますが、それでも十分ではありません。物語性やコンセプトには一定の魅力があるものの、期待
  れであり、時間を過ごすにはまだ物足りないかもしれません。\n\n3. まあまあ面白い - このレベルの面白さは、平均的で満足できる範囲です。ある程度の興味深い要素やストーリーがあり、時間を過ごすの
  適していますが、特別印象に残るものではないかもしれません。\n\n4. 面白い - このレベルでは、かなりの面白さが感じられ、魅力的なストーリーやキャラクターが存在します。多くの人が楽しめる内容で
  り、興味を持続させる要素が豊富に含まれています。ただし、最高の評価には僅かに及ばない部分が残っています。\n\n5. 大変面白い - このレベルの面白さは、非常に優れており、観る者を魅了し、心に強
  残る体験ができます。独創的なストーリーや魅力的なキャラクターが際立ち、多くの人が共感や感動を覚えるでしょう。このレベルの面白さは、他のものと比較しても突出していると言えます。\n\nまず、一
  一歩あなたの推論を書き出してください。単に正しい答えを最初に述べることを避けてください。次に、\"1\" or \"2\" or \"3\" or \"4\" or \"5\"(引用符や句読点なし)から正しい答えに対応する1つの
  択肢を単独の行に書きだしてください。最後に、答えだけを新しい行に繰り返してください。\n\n推論:"
    }
  ],
  "sampled": "この文章は、Windowsの重さとウィルス対策についての会話が続くだけで、特に面白みがない。ストーリーやキャラクターも存在しないため、退屈な文章である可能性が高い。\n\n答え:\n1\n1",
  "metadata": {
    "model": "gpt-3.5-turbo-0301"
  }
}
{
  "choice": "1"
}

まとめ

  1. Evalsのソースコードから評価実行パターンの1つを紹介しました
  2. ChatGPTの出力をChatGPTに分類させ数値化をしているという仕組みでした

評価実行パターンは、入力と出力の一致を判定したり他にも種類があり、自分でコードを書いてカスタムclassを追加することも可能です。

Discussion