見出し画像

ChatGPTで難易度3段階の4択クイズを生成しスプレッドシートに出力する(GoogleColab)


アウトプットイメージ

以下のような4択クイズをChatGPTで量産し、スプレッドシートに転記したい。難易度調整もChatGPTに任せる。

問題1:
オフィスの照明を節電するために、最も効果的な方法は次のうちどれでしょうか?
1. 昼休みや退社時には必ず消灯する
2. 電球の定期的清掃を行う
3. 照明をLEDに交換する
4. 窓際の照明を間引きする

正解: 3. 照明をLEDに交換する

解説:
LEDへの交換が最も節電効果が高い。LEDは従来の照明と比べ消費電力が少なく、長寿命であるため、交換コストも削減できる。
A は心がけとして重要だが、消し忘れが発生するリスクがある。
B は照明の明るさを維持するために有効だが、節電効果は限定的。
D は自然光を活用する方法の一つだが、天候に左右されるため、安定的な節電は難しい。
スプレッドシートに転記された状態

流れ


まずopenaiをインストールする。

!pip install openai

次に、Googleスプレッドシートにアクセスするための認証プロセスを自動化し、Colabからスプレッドシートのデータを読み書きするプログラムを実行。

from google.colab import auth
auth.authenticate_user()

import gspread
from google.auth import default
creds, _ = default()

gc = gspread.authorize(creds)

続いて、文字列データから直接CSVデータを読み込み、操作や分析が可能な形式にする。
ここでは一例として3つのトピックを入れている。

import io
import pandas as pd
data = pd.read_csv(io.StringIO('''
ジャンル,サブトピック
気候変動の基礎知識,地球温暖化のメカニズム
気候変動の基礎知識,温室効果ガスの種類と発生源
気候変動の基礎知識,気候変動の影響(自然災害、生態系、健康など)
'''))

OpenAIのAPIキーを入力。Colabの鍵マークからシークレットを追加。

import os
from google.colab import userdata
os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")

次に、指定されたスプレッドシートIDを持つ既存のスプレッドシートを開き、特定のワークシートを操作できるようにする。

spreadsheet_id = 'ここにスプレッドシートのIDを入力'
spreadsheet = gc.open_by_key(spreadsheet_id)

worksheet_name = 'ここにワークシートの名前を入力'
try:
    worksheet = spreadsheet.worksheet(worksheet_name)
except gspread.exceptions.WorksheetNotFound:
    worksheet = spreadsheet.add_worksheet(title=worksheet_name, rows="1000", cols="20")

プロンプトを入力し実行。

from openai import OpenAI
import pandas as pd
import json
df = pd.DataFrame(columns=['genre', 'subtopic', 'difficulty', 'quiz', 'choice1', 'choice2', 'choice3', 'choice4', 'answer', 'reason'])
def generate_quiz(genre, subtopic, difficulty):
    client = OpenAI()
    prompt_template = f"""
「{genre}」ジャンルの「{subtopic}」サブトピックで問題を作成してください。
問題文では、「{subtopic}」に関する知識を問うような内容にしてください。
選択肢は4つ用意し、1つの正解と3つの誤答を含めてください。
解説文では、正解の選択肢が正しい理由を説明し、誤答の選択肢がなぜ不適切なのかを簡潔に述べてください。
生成された問題文、選択肢、解説文を確認し、不適切な表現や誤った情報がある場合は修正してください。
生成したデータは、json形式にしてください。
answerは番号のみにしてください。

genre:
subtopic:
difficulty:
quiz:
choice1:
choice2:
choice3:
choice4:
answer:
reason:
​"""

    completion = client.chat.completions.create(
    model="gpt-4-turbo-preview",
    messages=[
        {"role": "system", "content": prompt_template},
    ],
    )
    print(completion.choices[0].message.content)
    quiz_data = json.loads(completion.choices[0].message.content)
    print(quiz_data)
    df.loc[len(df)] = [quiz_data['genre'], quiz_data['subtopic'], quiz_data['difficulty'], quiz_data['quiz'], quiz_data['choice1'], quiz_data['choice2'], quiz_data['choice3'], quiz_data['choice4'], quiz_data['answer'], quiz_data['reason']]
    worksheet.append_row(df.loc[len(df) - 1].tolist())

# 難易度ごとのクイズ数
quiz_counts = {'初級': 1, '中級': 2, '上級': 1}

# 各行に対してクイズを生成
for index, row in data.iterrows():
    genre = row['ジャンル']
    subtopic = row['サブトピック']
    for level, count in quiz_counts.items():
        for _ in range(count):
            try:
                generate_quiz(genre, subtopic, level)
            except Exception as e:
                print(f"エラーが発生しました: {e}")

すると冒頭のようにシートに出力される。

注意とまとめ

ただし生成結果は毎回変わるため、エラーが発生してうまくシートにインプットされない場面が多々ある。
たとえばわざわざ冒頭に「以下のような結果になりました」という余計な説明をつけてくれる場合や、JSONではなくMarkdownで出力されてしまう場合などがある。その際はプロンプト調整をがんばることで対処する。 

そしてこの方法はインターネット上から文言を拾ってきているだけなので、クイズとして成立していないものも多い印象。
「環境に優しい行動」というトピックでクイズを生成した場合、肌感で、出力の1割はそのまま使えて、6割は修正すれば使える、3割は使用しないといった判断をしている。

ちなみに自社サービスとしては、企業のサステナビリティレポートをRAGのナレッジとして取り込み企業独自の環境クイズを生成するということをやっていて、精度はいい感じです。興味があればお問い合わせください(宣伝みたいになってしまった)


この記事が気に入ったらサポートをしてみませんか?