🔖

学習用の問題集をChatGPTに作らせる方法

2023/05/12に公開

概要

ChatGPTを使って学習用コンテンツを作るための方法のうち、以下について紹介します。

  • OpenAIのAPIに投げるプロンプトの例
  • レスポンスをそのままデータベースに登録するためのjson出力方法
  • 実際にGPT3-5に投げてみた結果

ウェブサイト運営やアプリ開発している方はコンテンツを確保する方法に悩まれていると思いますが、この方法なら正確性が確認できる領域であれば、大量に安価にコンテンツを生成できると思います。また、自身で学習に活かしたりお忙しい先生方の練習プリント作成などでも活用できるんじゃないでしょうか。

プロンプト例

以下のようなプロンプトをChatGPTに投げると、いい感じに問題を出力してくれます。
DBなどに登録しやすいようにjson形式での出力としていますし、好きなようにデータ構造を定義できていい感じに生成してくれるので工夫すれば狙ったようなコンテンツを量産できます。

あなたは優秀な日本人向け英語教師です。
日本人がTOEICの試験対策に行う問題文を作ってください。

問題文の形式: 
{
  "question": "The company is known for its commitment to ——- customer satisfaction.",
  "choices": {
    "A": "ensure",
    "B": "neglect",
    "C": "complicate",
    "D": "limit"
  },
  "choices_commentary": {
    "A": [
      {
        "noun": "動詞",
        "meaning": "確保する,保証する",
        "usage": "We take measures to ensure the safety of our customers.",
        "in_japanese": "私たちは顧客の安全を確保するために対策を取っています。"
      }
    ],
    "B": [
      {
        "noun": "動詞",
        "meaning": "無視する,怠る",
        "usage": "They neglect their responsibilities.",
        "in_japanese": "彼らは自分の責任を怠っています。"
      }
    ],
    "C": [
      {
        "noun": "動詞",
        "meaning": "複雑にする,困難にする",
        "usage": "The new regulations complicate the process.",
        "in_japanese": "新しい規制は手続きを複雑にします。"
      }
    ],
    "D": [
      {
        "noun": "動詞",
        "meaning": "制限する,限定する",
        "usage": "They limit the number of participants.",
        "in_japanese": "彼らは参加者の数を制限しています。"
      }
    ]
  },
  "answer": "A",
  "answer_commentary": "この文では、会社が顧客満足に対する「確約」を持っていることが述べられています。文脈から判断すると、最も適切な動詞は「ensure」です。それは顧客満足を保証する意味で使用されています。"
}

制約: 
answer_commentaryと、choices_commentaryの中のnoun, meaning, in_japaneseはかならず日本語で出力してください。
かならず上記のjson形式に沿って出力してください。
json以外の文字列は出力しないでください。

生成されたコンテンツ

{
  "question": "Mr. Sato was appointed to —— the new project.",
  "choices": {
    "A": "lead",
    "B": "ignore",
    "C": "dodge",
    "D": "release"
  },
  "choices_commentary": {
    "A": [
      {
        "noun": "動詞",
        "meaning": "導く,リードする",
        "usage": "She was chosen to lead the marketing team.",
        "in_japanese": "彼女はマーケティングチームをリードするために選ばれました。"
      }
    ],
    "B": [
      {
        "noun": "動詞",
        "meaning": "無視する",
        "usage": "It's not a problem you can ignore.",
        "in_japanese": "それは無視できる問題ではありません。"
      }
    ],
    "C": [
      {
        "noun": "動詞",
        "meaning": "避ける",
        "usage": "He managed to dodge the question.",
        "in_japanese": "彼は質問を巧みに避けました。"
      }
    ],
    "D": [
      {
        "noun": "動詞",
        "meaning": "リリースする,公開する",
        "usage": "They plan to release the new product next month.",
        "in_japanese": "彼らは来月新製品をリリースする予定です。"
      }
    ]
  },
  "answer": "A",
  "answer_commentary": "この文では、佐藤さんが新しいプロジェクトを「リードする」ために任命されたことが述べられています。文脈から判断すると、「lead」が最も適切な動詞です。それはプロジェクトを導く、またはリードするという意味で使用されています。"
}

生成のコツ

  • 本記事ではプロンプトを日本語で記述していますが、英語で記述することでさらに精度があがります。
  • 何度か出力してみたところ、生成されるものが例題に近いものに偏っていました。以下のように指示を追加することでコンテンツの多様性を確保できました。
    • 接続詞を選ばせる問題にしてください。
    • 熟語を選ばせるような問題にしてください。
「熟語を選ばせるような問題にしてください」と指示した結果
{
  "question": "The marketing team is working hard to ——- the brand's image.",
  "choices": {
    "A": "keep up with",
    "B": "put off",
    "C": "bring about",
    "D": "polish up"
  },
  "choices_commentary": {
    "A": [
      {
        "noun": "熟語",
        "meaning": "追いつく,立ち向かう",
        "usage": "It's hard to keep up with the latest technology.",
        "in_japanese": "最新の技術に追いつくのは難しいです。"
      }
    ],
    "B": [
      {
        "noun": "熟語",
        "meaning": "延期する",
        "usage": "They decided to put off the meeting until next week.",
        "in_japanese": "彼らは会議を来週まで延期することに決めました。"
      }
    ],
    "C": [
      {
        "noun": "熟語",
        "meaning": "引き起こす",
        "usage": "The new policy could bring about significant changes.",
        "in_japanese": "新しい方針は大きな変化を引き起こす可能性があります。"
      }
    ],
    "D": [
      {
        "noun": "熟語",
        "meaning": "磨き上げる",
        "usage": "He needs to polish up his presentation skills.",
        "in_japanese": "彼はプレゼンテーションスキルを磨き上げる必要があります。"
      }
    ]
  },
  "answer": "D",
  "answer_commentary": "この文では、マーケティングチームがブランドのイメージを「磨き上げる」ために一生懸命働いていることが述べられています。文脈から判断すると、「polish up」が最も適切な熟語です。それは何かを改善したり、良くしたりするという意味で使用されています。"
}

統計検定2級の問題

続いて、ChatGPTが苦手としている計算系の問題についても試してみました。
生成されるコンテンツの質にフォーカスしたいのでjsonにしていません。

プロンプト

統計検定2級を受験したいのですが、問題文と回答と解説を作ってもらえますでしょうか?

出力

もちろんです!以下に統計検定2級の問題文、回答、解説を用意しました。ご参考にしてください。

問題1:
ある学校で生徒の身長データを調査したところ、男子生徒の身長は平均が170cm、標準偏差が5cmであることがわかりました。この学校に通う男子生徒のうち、身長が180cm以上である割合を求めてください。

回答1:
標準正規分布表を用いて計算します。標準化を行い、Z値を求めます。

Z = (180 - 170) / 5 = 2

標準正規分布表からZ値が2に対応する部分の面積を調べると、0.9772 です。

したがって、身長が180cm以上である割合は、1 - 0.9772 = 0.0228、つまり2.28%です。

解説1:
問題文において、男子生徒の身長は平均が170cm、標準偏差が5cmとされています。身長が180cm以上である割合を求めるためには、正規分布を利用して計算します。まず、身長のデータを標準化します。その後、標準正規分布表を用いて、標準化された値に対応する面積を求めます。それが求める割合になります。

問題2:
ある製品の製造工程において、欠陥品が生産される確率は2%であるとします。ある日、100個の製品が生産されたとき、欠陥品の数の確率分布を求めてください。

回答2:
この問題は二項分布を利用して解くことができます。欠陥品の確率をpとすると、非欠陥品の確率は1 - pです。

n = 100 (製品の数)
p = 0.02 (欠陥品の確率)
q = 1 - p = 0.98 (非欠陥品の確率)

欠陥品の数がk個である確率は、以下の式で計算できます。

P(X = k) = (nCk) * p^k * q^(n-k)

それぞれのkについて、上記の式を計算して確率分布を求めることができます。

解説2:
問題文では、ある日に生産される製品の数が100個とされています。このような場合、欠陥品の数の確率分布を求めるには二項分布を用います。二項分布は、2つの結果(欠陥品または非欠陥品)が起こる独立な試行を複数回行った場合の確率分布を表します。

上記の回答でも示した通り、欠陥品の数がk個である確率は以下の式で計算されます。

P(X = k) = (nCk) * p^k * q^(n-k)

ここで、nは製品の数、pは欠陥品の確率、qは非欠陥品の確率です。nCkは二項係数と呼ばれる組み合わせの数を表します。

例えば、欠陥品の数が0個の場合、P(X = 0)を求めると、以下のようになります。

P(X = 0) = (100C0) * (0.02)^0 * (0.98)^(100-0) = (1) * (1) * (0.98)^100 ≈ 0.1326

同様に、欠陥品の数が1個、2個、...、100個の場合についても確率を計算していきます。

このようにして得られた確率分布が、ある日に生産される100個の製品の欠陥品の数に関する情報を提供します。

以上が問題2の回答と解説です。欠陥品の数の確率分布を求めるためには、二項分布の式を利用し、各値に対する確率を計算する必要があります。

おわり

最後まで読んでくださりありがとうございました。
なかなか正確にjson形式のデータを作成できることが伝わっていましたら幸いです。

昨今のLLM、流れが早すぎて大変ですが、工夫次第でいろいろ可能だし、ブラックボックスなおかげで工夫の余地が大きいからさわっていて楽しいです。
これからも継続的に発信していきますので、よろしければいいねやフォローをお願いいたします。

Happy Elements

Discussion