ChatGPTのChatGPTによるChatGPTのための日本語評価コードを書いてみます。

**🔳コンセプト**
ChatGPTにLLMの日本語評価データセットを利用して回答させ、ChatGPT自身にその回答結果と正解を照らし合わせて５段階で評価してもらいます。
この評価コード自体もChatGPTに書いてもらいます。
そしてそして、おそらく、ChatGPTはこれを学習してしまって、もっと賢くなるはず。
ということで、「ChatGPTのChatGPTによるChatGPTのための日本語評価」コードを書いてみます。

**🔳プロンプト**
ChatGPTにプログラムを書いてもらうプロンプトを検討します。これは、試行錯誤（シンプルな指示→ChatGPTにプログラムを書いてもらう→出力されたコードを実行→エラー、足りないところ、意図と違うところについて追加・修正を指示→（繰り返し））を試行錯誤しながら、プロンプトにまとめていきました。
プログラムの流れに沿って、仕様を羅列していく感じですね。

```
###指示
与えられた評価用データセットを入力として、ChatGPTに回答させ、その回答内容自体をChatGPT自身が評価するパイソンプログラムを以下の条件に従って、ステップバイステップで書いて下さい。
###条件
・評価のデータセットは、「elyza/ELYZA-tasks-100」とする
・評価のデータセットの区切りは 'input’,'output’,'eval_aspect’となっている
・OpenAI APIを利用する
・ChatGPT-3.5 Turboを利用する
・評価用データセットから、問題を取得し、ChatGPTに答えさせる
・上記のChatGPTの答えと、評価用データセットから取得した、問題、正解例、およびを以下の採点基準とセットにしてプロンプトを作成する
・採点基準は、以下のURLに従うこと
https://huggingface.co/datasets/elyza/ELYZA-tasks-100/blob/main/baseline/humaneval/guideline.md
・上記プロンプトでChat GPTから採点結果の回答を得る
・１件、１件、問題、正解例、ChatGPTの回答、その回答をChatGPT自身が採点したスコアを出力する
```

**🔳完成！！**
完成しました！！そして、ChatGPTの限界も少し見えちゃいました。。。
OpenAIのAPIが仕様変更となっていて、肝心のChatGPTにプロンプトを投げて、レスポンスを得る関数がエラーとなってしまい、その解決策をChatGPT自身が答えられなかったのです。
自社のAPIの仕様変更くらい、ファインチューニングで追加で覚えさせておいて欲しかったなー（以下のコードでコメントアウトしている部分です）。
しょうがないので、この部分だけは、OpenAIのサイトに載っているコード（クイックスタートにありました）をコピペして対応。

```
# 必要なライブラリをインポート
import os
import openai
from datasets import load_dataset
from openai import OpenAI

# OpenAI APIキーを設定
#openai.api_key = 'your-api-key'
openai.api_key = os.environ["OPENAI_API_KEY"]

# データセットを読み込む
ds = load_dataset("elyza/ELYZA-tasks-100")

def completion_with_backoff(**kwargs):
    client = OpenAI()
    return client.chat.completions.create(**kwargs)   

# 各問題に対してChatGPT-3.5 Turboに回答させ、自己評価をさせる
for task in ds['test']:  
    input_question = task['input']
    output_answer = task['output']
    eval_aspect = task['eval_aspect']

    # ChatGPT-3.5 Turboに質問を投げて回答を得る
    #response = openai.Completion.create(
    #    model="gpt-3.5-turbo",
    #    prompt=input_question,
    #    max_tokens=150 ) 
    #chatgpt_response = response.choices[0].text.strip()

    # ChatGPTに質問して回答を取得
    response = completion_with_backoff(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": input_question}],
        temperature=0,
        frequency_penalty=0,
        presence_penalty=0,
    )
    # ChatGPTの回答をgpt4eval関数でChatGPTに渡して、ChatGPT自身に採点させる
    chatgpt_response = response.choices[0].message.content
    
    # 採点基準を含むプロンプトを作成する
    scoring_prompt = f"""
    Input: {input_question}
    Expected Output: {output_answer}
    Evaluation Aspect: {eval_aspect}
    ChatGPT Response: {chatgpt_response}
    
    Please evaluate the response according to the scoring guidelines provided at:
    https://huggingface.co/datasets/elyza/ELYZA-tasks-100/blob/main/baseline/humaneval/guideline.md
    """
    
    # ChatGPT-3.5 Turboに自己評価をさせる
    #scoring_response = openai.Completion.create(
    #    model="gpt-3.5-turbo",
    #    prompt=scoring_prompt,
    #    max_tokens=60
    #)
    #chatgpt_score = scoring_response.choices[0].text.strip()
    
    
    # ChatGPT-3.5 Turboに自己評価をさせる
    scoring_response = completion_with_backoff(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": scoring_prompt}],
        temperature=0,
        frequency_penalty=0,
        presence_penalty=0,
    )
    chatgpt_score = scoring_response.choices[0].message.content
    
    # 結果を出力する
    print(f"Input: {input_question}")
    print(f"Expected Output: {output_answer}")
    print(f"Evaluation Aspect: {eval_aspect}")
    print(f"ChatGPT Response: {chatgpt_response}")
    print(f"ChatGPT Self-Score: {chatgpt_score}")
    print("-" * 50)
```

**🔳出力結果**
こんな感じです。

```

Input: 仕事の熱意を取り戻すためのアイデアを5つ挙げてください。
Expected Output: 1. 自分の仕事に対する興味を再発見するために、新しい技能や知識を学ぶこと。
2. カレッジやセミナーなどで講演を聴くことで、仕事に対する新しいアイデアや視点を得ること。
3. 仕事に対してストレスを感じている場合は、ストレスマネジメントのテクニックを学ぶこと。
4. 仕事以外の楽しいことをすることで、ストレスを発散すること。
5. 仕事に対して自己評価をすることで、自分がどのように進化しているのかを知ること。
Evaluation Aspect: - 熱意を取り戻すのではなく、仕事の効率化・スキルアップのような文脈になっていたら1点減点
- 出したアイデアが5つより多い、少ない場合は1点減点
- 5つのアイデアのうち、内容が重複しているものがあれば1点減点


ChatGPT Response: 1. 目標を再設定する：仕事に対する熱意を取り戻すためには、自分自身に新たな目標を設定することが重要です。目標を明確にし、達成感を得ることでモチベーションが高まります。

2. 新しいスキルを学ぶ：仕事において新しいスキルを学ぶことは、自己成長につながります。新しいスキルを習得することで、仕事に対する興味や熱意が復活することがあります。

3. チームメンバーとのコミュニケーションを活発化させる：仕事の熱意を取り戻すためには、チームメンバーとのコミュニケーションを活発化させることが重要です。お互いの意見やアイデアを共有し、協力して仕事を進めることで、仕事への情熱が高まることがあります。

4. ワークライフバランスを整える：仕事に熱心に取り組むためには、適切なワークライフバランスを保つことが重要です。十分な休息やリラックスの時間を確保し、自分自身をリフレッシュさせることで、仕事への熱意を取り戻すことができます。

5. 自分の成果を振り返る：仕事の熱意を取り戻すためには、自分の成果を振り返ることが重要です。過去の成功体験や達成した目標を思い出し、自信を持つことで、仕事への情熱が再燃することがあります。
ChatGPT Self-Score: {
  "quality": 4,
  "completeness": 4,
  "relevance": 5,
  "novelty": 3,
  "overall": 4
}
--------------------------------------------------
```

**🔳ChatGPTの親切**
ちゃんと注意事項を教えてくれました！責任あるAIなのかなー。ありがとう！CｈatGPT！！

```
注意：このプログラムを実行するには、有効なOpenAI APIキーが必要です。
また、実際のデータセットのフォーマットに合わせて、データセットの読み込み部分を調整する必要があるかもしれません。
また、APIの使用にはコストがかかる場合があるため、使用前に料金体系を確認してください。
```