ChatGPTで小テスト用の問題を作ってみる

生成AIがやってきた

囲碁や将棋のAI、自動車の自動運転技術など、AI技術の発展著しい昨今ですが、2023年になってからはいわゆる「生成AI」の話題を聞かない日は無いようです。G7でも話題になりました。

教育での利用についてはまだ議論が始まったばかりですが、何事も試してみようということで、掲題の通り、小テスト用の問題を作ってみました。

なお、下記の記事では、ChatGPTの仕組みや、利用するためのアカウントの作成手順については触れていません。「どんなことができるか」を紹介する一例を示そうと思います。

小テストを作るよう依頼する

プログラムの中で、ランダムな振る舞いを実現したいとき、「乱数」という仕組みを使います。各社の情報Iの教科書を見ますと、ほぼ必ず登場している、基礎的な概念です。

今回は、この乱数について問う小テストを作っていきます。

作り方は簡単で、次のようにChatGPTのプロンプトに入力しました。

(入力したプロンプト)

プログラミングを学習中の生徒に、知識を確認するためのクイズを出そうと思います。正解が「乱数」になるクイズを作ってください。作成するクイズは、4つの選択肢から1つ選ぶ選択式で、1つの正解の選択肢と、3つの誤答の選択肢を示す必要があります。

「乱数」という概念は、情報技術だけでなく、統計学などの分野でも使われる概念ですので、冒頭に「プログラミングを学習中」という文言を入れました。さらに「生徒」とすることで、大人、特に専門家向けの難しすぎる問題にならないよう注意しました。

生成する小テストを、4つから1つ選ぶ択一式にしたかったので、後半でその旨を指示しています。

この結果、ChatGPTが生成したのが、次のテキストです。

(ChatGPTが生成したテキスト)

以下に「乱数」に関するクイズを作成しました:

質問: プログラミングにおいて、不規則で予測不能な値を生成するのは次のうちどれですか?

選択肢:

  1. 定数
  2. 変数
  3. ループ
  4. 乱数

正解は「4. 乱数」です。

短いけれど明瞭で、意図が汲み取りやすい問題文が生成されました。

3つの誤りの選択肢も、プログラミング初学者が近い時期・段階に学んだであろう語彙が選ばれています。正解もきちんと明言されています。

かなり的確な小テストの問題ができました。

穴埋め式にしてみる

同じ「乱数」の問題を、今度は穴埋め式にしてみようと思います。一連のチャットに続けて、次のように入力しました。

(入力したプロンプト)

穴埋め式のクイズにしてください。

すると、以下のテキストが生成されました。

(ChatGPTが生成したテキスト)

もちろんです。穴埋め式のクイズとして次のようになります:

質問: プログラミングにおいて、不規則で予測不能な値を生成するのは____です。

選択肢:

  1. 定数
  2. 変数
  3. ループ
  4. 乱数

正解は「4. 乱数」です。

「(動作)を実現するのは(機能)です」という、物事の定義を表すための文に、穴が空いた形式になりました。

少し硬い感じの問題文になりましたが、知識を確認するための小テストの問題としては、十分な出来だと思います。

ところで、ChatGPTの生成するテキストの冒頭にある「もちろんです。」は、英語の”Sure.”の直訳のように思われます。自然な日本語のやりとりの中に、ちょっと直訳っぽい文が混じると、不思議な感じがしますね。

誤りの選択肢についての解説文を作る

さらに、生徒に示す解説も付けられないかと考えて、解説文も生成するよう依頼してみました。

(入力したプロンプト)

3つの誤りの選択肢について、簡単な解説をしてください。

結果、ChatGPTが生成したテキストは、次の通りです。

(ChatGPTが生成したテキスト)

もちろんです。以下にそれぞれの誤答の選択肢について解説します。

定数: 定数はプログラミングにおいて一度設定されるとその値を変更することができない値のことを指します。そのため、不規則で予測不能な値を生成することはできません。定数は不変性が必要な場合や、特定の値をプログラム全体で使い回す場合などに使用されます。

変数: 変数はプログラミングにおいて値を格納するための箱のようなもので、その値はプログラムの実行中に変更することができます。しかし、その値が不規則かどうかは、その変数にどのような値を割り当てるかによります。もし変数に乱数を割り当てるのであれば、その変数は不規則な値を持つことになりますが、それ自体が乱数を生成するわけではありません。

ループ: ループはプログラミングにおいて一連の命令を繰り返す構造を指します。ループは同じ処理を何度も実行したい場合や、特定の条件が満たされるまで処理を続けたい場合などに使用されます。ループ自体は値を生成することはありませんが、ループの中で乱数を生成するコードを書くことは可能です。しかし、ループそのものが乱数を生成するわけではありません。

前の手順で作成した小テストの選択肢の解説なので、正解(「乱数」の動作)に触れながら、なぜこの選択肢が正解になり得ないのか、説明していることが分かります。

3つの誤りの選択肢それぞれについて、いちいち乱数の概念や動作に触れているため、少し表現がくどいようにも見えますが、誤答した生徒は、まず自身の誤答の解説を読むだろうことを考えると、このような繰り返しもやむを得ないところでしょうか。

便利、だけど要注意

上記の一連の小テストは、ほんの10分あまりで作成することができました。

一番しっかり考えたのは、最初の入力の箇所で、「プログラミング学習者が対象であること」「学習者は高校生であること」を示すようにしたところでした。その後は、ChatGPTとの自然なやりとりを通じて、問題・テストのバリエーションを作っていくことができました。

内容も間違ったところは無く(※厳密に言えば、コンピュータの生成する乱数は擬似乱数なので、「不規則で予測不能な値」というのは少し割り切った説明だ、とは言えます)、明晰で読みやすい文章で問題を作ってくれるのですから、大いに役立ちそうです。

ただ、生成AIの作り出すテキストには、誤りが混入する場合があることが知られています。最初に挙げたG7の会合でも、「責任あるAIとAIガバナンスの推進」というテーマで議論があったようです。

今後も注意しながら適切な場面で使用し、技術上の課題を注視していく必要があるのではないかと思いました。