見出し画像

ChatGPT3.5&4.0で競技プログラミングAtCoderの問題のスキル推定を検証しました

こんにちは、株式会社Hugkunの上江田です。
今回、ChatGPTでの属性推定の検証として、競技プログラミングの1つであるAtCoderの問題のスキル推定を行なってみました。
属性推定というと「年齢」や「性別」といった項目での推定が一般的ですが、今回はアルゴリズムスキルを指標に推定することを目指しています。


検証方法

ChatGPTのプロンプトにAtCoderの問題文と解説文、正解コードを読み込ませ、以下のアルゴリズムスキルごとに推定を行いました。

SKILL_SET = [
    "標準入出力",
    "if文",
    "for文",
    "while文",
    "リスト(データ構造)",
    "セット(データ構造)",
    "文字列操作",
    "dict(連想配列)",
    "ソート",
    "set",
    "ユーザー定義関数",
    "二分探索",
    "ユークリッド互除法",
    "全探索",
    "Bit全探索",
    "再帰関数",
    "ユークリッド距離",
    "二進法",
    "multiset",
    "ランレングス圧縮",
    "DP",
    "グラフ理論入門",
]

推定対象

推定するのはAtCoder Beginners Contest(通称ABC)のA, B, C問題です。
問題の難易度は基本A<B<Cの順になっています。
使用したコンテスト範囲はABC289-293の計5回分です。

プロンプト内容

共通プロンプト内容↓

以下に示すのはプログラミングの問題文とその問題の解説と正解コード例及び判定対象のスキルです。
この問題を解くのに該当のスキルはどの程度必要ですか?
evaluation として0-4で表してください。 基準は以下とします。

0: この問題では必要ない。
1: 解法によっては必要になる場合がある。
2: 簡単に実装できる必要がある。
3: 業務レベルで実装できる必要がある。
4: 応用的に実装できる必要がある。

全て日本語で答えてください。
evaluation を求めるにあたり、以下の手順を踏んでください。
1, 指定された Skill がどんなスキルであり、どのような場面で役立つか把握する。
2, この問題との関連性を考える。この過程での考察を reason として下さい。
3, reason を元に、 evaluation を決定する。

"skill"には Skill を入れてください。
スキル評価とその設定理由は下記形式で出力してください。

{ "skill" : string, "evaluation" : integer, "reason" : string }


問題文や解説文、正解コードといった問題ごとに変化させるプロンプト内容(以下はABC289のA問題の例)↓

Skill : { 推定するスキル名 }
Problem : 0 と 1 の 2 種類の文字からなる文字列 s が与えられます。
s に含まれる 0 を 1 に、1 を 0 に置き換えた文字列を出力してください。Explanation: 
この問題は、
・入力から文字列を読み込む
・文字列の文字を対応する文字に変更する
・変更された文字列を出力する
ことができれば解くことができます。
Correct Code

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;
    
    for (char c : s)
        if (c == '0')
            cout << '1';
        else
            cout << '0';

    cout << endl;

    return 0;
}

推定結果例

以下は上記プロンプトで「文字列操作」を推定時の返答

{
  "skill": "文字列操作, 
  "evaluation": 2, 
  "reason": "この問題は文字列の各文字を取り出し、それが0なら1に、1なら0に置き換えるという文字列操作が必要です。この操作は基本的な文字列操作の一つであり、簡単に実装できるべきスキルです。したがって、評価は2となります。"
}

Accuracy算出方法

必要スキルの判定方法

Accuracyを求めるには各問題ごとに必要なアルゴリズムを決めなければいけないのですが、すでに用意しているそういったデータはありませんでした。そのため今回は私個人の主観で「必要なスキル」、「解き方によっては活用できるスキル」、「必要ないスキル」の3つに分類しました。

その中でも「解き方によっては活用できるスキル」に関しては、for文で十分だけれどwhile文でも解ける、といった場面でのwhile文のように重要度が低いスキルを分類したため、Accuracyの算出からは除外しました。

主観による分類割合

必要なスキル:68/330
解き方によっては活用できるスキル:26/330
必要ないスキル:236/330

※判定するスキル数:22 × コンテスト数:5 × 1コンテストあたりの問題数:3 = 330

ChatGPTの推定結果との比較方法

GPTの推定基準はプロンプト内容にあるように、以下の通りです。

0: この問題では必要ない。
1: 解法によっては必要になる場合がある。
2: 簡単に実装できる必要がある。
3: 業務レベルで実装できる必要がある。
4: 応用的に実装できる必要がある。

このうち0-1ならば必要ないスキル、2以上であれば必要なスキルと判断されたものとして人力で分類した結果と比較します。

結果

GPT3.5

必要ないと分類したスキル(236/330)のうち、0 または 1と推定された割合:56.78%
必要と分類したスキル(68/330)のうち、2 以上と推定された割合:95.59%
Accuracy: 65.46%

GPT4

必要ないと分類したスキル(236/330)のうち、0 または 1と推定された割合:92.65%
必要と分類したスキル(68/330)のうち、2 以上と推定された割合:88.98%
Accuracy: 89.80%

所感

GPT3.5では必要のないスキルに対しても必要と出やすく、GPT4では必要なスキル数が絞られている様子がみられました。
これはGPT4の方がGPT3.5よりも事実に基づいた回答を行えることが影響していると考えられます。

検証結果としてGPT4の結果であれば精度は高い方だと思いますが、今回のスキル単体ごとに推定する方法だとすべてのスキルに対する推定に時間(料金も…)がかかるため、それに見合う精度としてはもう少し欲しかったように思います。

おわりに

今回の検証はGPT3.5とGPT4の精度の差を実感した結果となりました。
料金の壁はあるものの、GPT4であれば専門的な領域でも活用シーンが広がってくるのではないかと感じました。

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