LoginSignup
1
0

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

Posted at

🔳コンセプト
ChatGPTにLLMの日本語評価データセットを利用して回答させ、ChatGPT自身にその回答結果と正解を照らし合わせて5段階で評価してもらいます。
この評価コード自体も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から採点結果の回答を得る
・1件、1件、問題、正解例、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なのかなー。ありがとう!ChatGPT!!

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0