![見出し画像](https://assets.st-note.com/production/uploads/images/172905487/rectangle_large_type_2_024e1776b203b12ae103a2c0994b55c4.png?width=1200)
ChatGPTでプログラミング採点はどこまでできる?プロンプトを作って検証してみた
□ はじめに
プログラミングの授業で、「採点」 ほど難しいものはありません。
特に初心者のコードには、構文のミスから論理的な誤り、クセの強い書き方まで、さまざまな要素が入り混じっています。単に「動くかどうか」だけで評価するのは不十分で、コードの可読性や効率性、そして論理的な構造の適切さも含めて判断する必要があります。 しかし、それをすべて教師がチェックするのは、現実的に負担が大きいのも事実です。
そこで注目されているのが、AIによる自動採点 です。AIは、コードを瞬時に解析し、正確性・可読性・効率性といった多面的な視点から評価することができます。人間では見落としがちなエラーの傾向や、改善すべきポイントまで細かく指摘し、学習者に具体的なフィードバックを与えることが可能です。しかし、AIによる評価には限界もあり、その活用には慎重な検討が必要です。
特に高校の情報科におけるプログラミング教育は、単なる「コーディングスキルの習得」ではなく、論理的思考力や問題解決能力を育むこと に重きを置いています。
今回はChatGPTを活用し、FizzBuzzのプログラムを題材に、AIがどのようにプログラムを採点し、どのようなポイントで評価が可能かを具体的に検証してみました。
□ AI採点の鍵となる「評価基準」の設定
AIを活用したプログラミング採点を実現するためには、まず「何を評価するのか」という基準を明確にしなければなりません。従来、プログラミングの評価は「動くかどうか」という正確性に偏りがちでした。しかし、教育におけるプログラミングの目的は単なる「正解のコードを出力すること」ではなく、論理的思考力の育成 や より良いコードを書く力を身につけることにあります。そのため、AI採点を導入する際も、多面的な評価基準を設けることが不可欠です。今回の考察では、FizzBuzzのプログラムを題材に、「正確性・可読性・効率性」という3つの軸で評価を行いました。
また、独創性については、プログラミングの本質的な価値の一つですが、基礎的なスキルが身についていない段階で独創性を求めると、逆に学習の妨げになる可能性があります。したがって、評価基準としては適さないと判断しました。ただし、学習の進度や目的に応じて、適切なタイミングで独創性について評価基準を設定することは大切だと考えています。
1. 正確性(コードの動作が仕様を満たしているか)
最も基本的な評価基準です。プログラムが正しく動作し、期待通りの出力を返すかどうかを判断します。FizzBuzzの場合、
✅ i % 3 == 0 and i % 5 == 0 のときに "FizzBuzz" を表示できているか
✅ i % 3 == 0 のときに "Fizz" を表示できているか
✅ i % 5 == 0 のときに "Buzz" を表示できているか
✅ それ以外の数値は、そのまま出力されているか
といった条件が満たされているかをチェックします。
2. 可読性(コードが分かりやすく整理されているか)
プログラムは「書ければOK」ではなく、「他人が読んでも理解しやすいか」が重要です。可読性の評価では、以下の点をチェックします。
✅ 適切なインデント が守られているか
✅ 変数名が分かりやすい(n や i は許容範囲だが、x などの曖昧な命名は減点対象)
✅ 関数を活用しているか(長すぎるコードを適切に整理できているか)
✅ 無駄なコードがないか(冗長な if 文や、不必要な計算をしていないか)
3. 効率性(無駄なく最適な方法で書かれているか)
プログラムは動けばよい、というわけではなく、効率的に動作するかどうか も重要です。特に、FizzBuzzのようなシンプルな問題でも、無駄な if 文の重複や冗長な処理を省くことが求められます。
□ システムプロンプト
高校生が提出したプログラミング課題(FizzBuzzなどの基本課題)を AI で採点し、正確性・可読性・効率性 の3つの基準で評価を行うプロンプトを作成し、検証してみます。加えて、具体的な改善点やアドバイスを提供 することで、学習者がどこを改善すればよいのかを理解しやすくします。
あなたは、高校のプログラミング授業におけるAI採点アシスタントです。
あなたの役割は、生徒が提出したPythonのコードを「正確性」「可読性」「効率性」の3つの観点から評価し、わかりやすいフィードバックを提供することです。
## **評価基準**
1. **正確性(コードの動作)**
- プログラムが正しく動作し、仕様通りの出力を返しているかを確認してください。
- 例として、FizzBuzzならば、以下の条件を満たしているか評価してください:
- `i % 3 == 0 and i % 5 == 0` のとき `"FizzBuzz"` を表示しているか?
- `i % 3 == 0` のとき `"Fizz"` を表示しているか?
- `i % 5 == 0` のとき `"Buzz"` を表示しているか?
- それ以外の数値は、そのまま出力されているか?
- **スコア**: 0~5点(5が満点)
2. **可読性(コードの分かりやすさ)**
- コードの構造が整理され、他者が読みやすい状態になっているかを評価してください。
- 以下の要素を考慮してください:
- 適切なインデントが守られているか?
- 変数名が意味のあるものになっているか?
- 長すぎるコードを関数化するなどの工夫があるか?
- 無駄なコードがなく、シンプルな構造になっているか?
- **スコア**: 0~5点(5が満点)
3. **効率性(最適な実装ができているか)**
- 無駄な処理がなく、効率的に動作するコードになっているかを評価してください。
- 例として、FizzBuzzならば、以下の点を考慮してください:
- `if` 文が適切に整理されているか?(例: `if i % 3 == 0 and i % 5 == 0` を最初に評価)
- 無駄な条件分岐がないか?(`if` が独立しすぎていないか)
- 文字列の結合やリストの活用など、コードの最適化が行われているか?
- **スコア**: 0~5点(5が満点)
## **評価方法**
- 提出されたPythonコードを分析し、各基準ごとに0~5点のスコアをつけてください。
- 各項目ごとに、「どこが良い点か」「どのように改善できるか」を明確にフィードバックしてください。
- フィードバックは **具体的な改善方法** を含め、学習者が理解しやすいようにしてください。
## **出力フォーマット**
提出されたPythonコードを評価し、以下のフォーマットで出力してください。
### 【採点結果】
**正確性**: ✅ 5/5 (適切な出力がされており、仕様を満たしている)
**可読性**: 🟡 3/5 (コードは整理されているが、コメントが不足している)
**効率性**: ❌ 2/5 (不要な `if` 文が複数あり、無駄な計算が発生している)
□ AI採点によるFizzBuzz評価
高校生が提出しそうな5種類のコードをAIで採点しました。
◾️ コード例1:条件優先度ミス
問題点:elif の条件の順番が間違っているため、"FizzBuzz" ではなく "Fizz" や "Buzz" しか表示されない。
n = int(input("数値を入力してください: "))
for i in range(1, n + 1):
if i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
elif i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
else:
print(i)
AIの採点結果
正確性: ❌ 3/5 (FizzBuzz の判定が正しく動作しない)
可読性: ✅ 5/5 (インデントや変数名が適切で、分かりやすい)
効率性: ✅ 5/5 (条件分岐は最適化の余地はあるが、基本的に問題なし)
AIフィードバック
❌ 正確性の問題点:
i % 3 == 0 and i % 5 == 0 の判定が 最後 にあるため、i が 15 のとき FizzBuzz ではなく Fizz が出力されてしまいます。
解決策: FizzBuzz の条件を 最初 にチェックするようにしてください。
◾️ コード例2:重複判定ミス
問題点:
すべての if 文を実行してしまう
if に入った後でも elif や else を評価し続ける(不要な計算が増える)
if の順番が適切でないため、"FizzBuzz" が出力されない
n = int(input("数値を入力してください: "))
for i in range(1, n + 1):
if i % 3 == 0:
print("Fizz")
if i % 5 == 0:
print("Buzz")
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
else:
print(i)
AIの採点結果
正確性: ❌ 2/5 (FizzBuzz の判定が正しく動作しない)
可読性: ✅ 5/5 (コードの構造はわかりやすい)
効率性: ❌ 2/5 (if 文の無駄なチェックが多い)
AIフィードバック
❌ 正確性の問題点:
FizzBuzz の判定が 最後にある ため、15 の倍数のとき Fizz → Buzz → FizzBuzz と 3回出力 されてしまいます。
◾️ コード例3:標準的なFizzBuzz(一般的な解法)
教科書的な構文で書かれた標準的なFizzBuzz
n = int(input("数値を入力してください: "))
for i in range(1, n + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
AIの採点結果
正確性: ✅ 5/5 (すべての条件を正しく処理できている)
可読性: ✅ 5/5 (インデントや条件の流れが明確で、分かりやすい)
効率性: ✅ 5/5 (無駄な計算や処理がなく、最適な実装になっている)
AIフィードバック
🎉 完璧です!このコードは FizzBuzz の仕様を正しく満たしており、効率的かつ可読性も高いです。 🎉
◾️ コード例4:関数化したFizzBuzz
特徴:関数化して、処理を分かりやすく整理したFizzBuzz
def fizzbuzz(n):
for i in range(1, n + 1):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
n = int(input("数値を入力してください: "))
fizzbuzz(n)
AIの採点結果
正確性: ✅ 5/5 (すべての条件を正しく処理できている)
可読性: ✅ 5/5 (関数化されており、コードの構造が明確)
効率性: ✅ 5/5 (不要な計算がなく、シンプルで最適な実装)
AIフィードバック
🎉 完璧な実装です!関数 fizzbuzz(n) を作成している点が特に良いです。
このように関数化することで、他のプログラムからも簡単に再利用でき、テストもしやすくなります。
◾️ コード例5:リストを活用したFizzBuzz
リストを活用して、文字列の結合で余計なif分岐を減らしたFizzBuzz
n = int(input("数値を入力してください: "))
for i in range(1, n + 1):
result = ""
if i % 3 == 0:
result += "Fizz"
if i % 5 == 0:
result += "Buzz"
print(result or i)
AIの採点結果
正確性: ✅ 5/5 (すべての条件を正しく処理できている)
可読性: ✅ 5/5 (result 変数を使用することで、条件がシンプルになっている)
効率性: ✅ 5/5 (if 文を最適化し、不要な elif をなくしている)
AIフィードバック
🎉 素晴らしい実装です!特に result 変数を使って、条件分岐を簡潔にまとめている点がとても良いです。
□AIによるプログラミング採点の可能性
今回の検証では、AIは比較的妥当な採点を行い、特に「正確性」の評価に関してはほぼ完璧でした。FizzBuzz問題を用いたChatGPTの採点能力の検証結果をもとに、AIによるプログラミング採点の可能性と限界について考えていきます。
◾️ 迅速なフィードバック提供
従来の人間による採点は、学習者のコードを手作業で評価するため、多大な時間と労力を要していました。しかし、AIはコードの解析を即座に行い、リアルタイムでフィードバックを提供することが可能です。これにより、学習者は自身の誤りを早期に認識し、迅速に修正することができます。
◾️ 一貫性のある評価
人間の採点者は、経験や主観によって評価がばらつく可能性があります。一方、AIは事前に設定された評価基準に基づき、ある程度、一貫性のある採点を行うことができました。これにより、公平性が確保され、学習者間の評価のばらつきを抑えることが可能になると考えられます。
◾️ 多面的なコード評価
FizzBuzz問題の検証結果によると、ChatGPTは単なる「正誤判定」に留まらず、「可読性」や「効率性」といった観点からもフィードバックを提供できることが示されました。例えば、適切な変数名の使用、冗長な条件分岐の削減、演算の最適化といったアドバイスを生成することで、生徒がより良いコーディング習慣を身につけることできます
□AIによるプログラミング採点の限界
AI採点の有用性が示された一方で、現時点の技術には以下のような限界が存在する。
◾️ 深い文脈理解の欠如
AIはコードの静的解析には優れているが、学習者の意図やコンテキストを深く理解することは難しい課題があります。例えば、誤ったコードであっても、学習者がどのような考え方で記述したのかを考慮せず、表面的なエラーのみを指摘する場合があります。これにより、学習者が適切なコーディング戦略を獲得する機会が制限される可能性があります。
◾️ 創造的な解法への対応の難しさ
FizzBuzz問題のような標準的な問題に対しては、AIは一般的な模範解答と比較して評価を行うことができます。しかし、プログラミングには多様な解法が存在し、標準的な解答から逸脱する独創的なコードに対しては、AIが適切に評価できない場合があると考えられます。特に、最適化や拡張性を考慮した高度な実装に対しては、AIが適切な評価を下せない可能性があります。
◾️ 誤ったフィードバックのリスク
AIの評価結果が必ずしも正確であるとは限らず、誤ったフィードバックを提供するリスクが存在します。特に、コードのロジックが適切であるにも関わらず、標準的な解答と異なるという理由で「誤り」と判断されるケースがあります。また、適切なコードであっても、冗長な指摘を行う場合があり、学習者の混乱を招く可能性があります。
□まとめ
AIによるプログラミング採点は、迅速なフィードバック、一貫性のある評価、多面的なコード解析といった点で、大きな可能性を持っていると感じました。しかし、深い文脈理解の欠如、創造的な解法への対応の難しさ、誤ったフィードバックのリスクといった課題も依然として存在します。
これらの限界を克服し、AI採点のメリットを最大限に活かすためには、AIと人間の協働による評価の仕組みを構築することが不可欠です。教師とAIが相互補完的に機能することで、より精度の高い採点が可能となり、学習者の成長を効果的に支援することができます。
また、AI採点は単なる自動採点ツールではなく、学習者の思考力を鍛えるツールとしての可能性を持っています。AIによる一次評価を行い、その後、教師が精査する方式を導入することで、学習者の成長を効果的に支援することができます。今後の研究と実践を通じて、AI採点の精度向上と教育現場での最適な活用方法がさらに探求されることを期待します。