CodeSpectra:簡単コーディングの幻想 – AIが依然として努力を要する理由
本記事では、AI支援によるコード剽窃を検出する4段階カスケードツール「CodeSpectra」を紹介する。完全一致ハッシュ、ブラインド正規化+最長共通部分列、抽象構文木フラグメント+ランダムフォレスト機械学習、そして意味的類似性を用いて、直接コピーから意味的に同等なAI生成コードまで、様々な剽窃タイプを段階的に特定する。
AIコーディングアシスタントは一夜にして状況を変えた。かつてクラスメートの提出コードをコピーして書き直すのに何時間も費やしていた学生が、今ではChatGPTにプロンプトを送り、数秒で構造的に同一の解を得て、変数名が異なるため清らかな良心で提出できる。従来の剽窃チェッカーはファイルを文字列として比較する。変数名を変更したりループスタイルを入れ替えたりすると、それらは機能しなくなる。そこで私たちは、前の段階が見逃したトリックを捉えるように設計された4段階のカスケード検出技術を用いて、CodeSpectraというツールを構築した。
「自動化は教育者を支援すべきであり、彼らの判断を代替すべきではない。」
CodeSpectraはすべての学生の提出物をカスケード処理する。各段階は特定の剽窃クラスに調整されている。前の段階で既に捕捉されたものを再チェックしないため、大規模なコホートでもパフォーマンスは線形に保たれる。全4段階の結果は、各学生ごとに最終類似度スコアと減点を含む単一のレポートに統合される。
第1段階:完全一致ハッシュ(タイプ1) すべてのソースファイルからコメントと空白を取り除き、MD5でハッシュする。異なる学生の提出間でハッシュが一致すれば、即座に完全なクローンとしてフラグが立てられる。これにより、最も一般的なケース、すなわち学生がファイルを直接クラスメートに送信する場合を処理する。多言語正規表現によるコメント除去と、ハッシュ前の空白正規化を適用している。この段階の複雑度はO(n)で、数千の提出にスケーラブルである。このクローンクラスでは誤検出ゼロの良好な結果が得られている。
第2段階:ブラインド正規化+LCS(タイプ2) 完全一致の段階を通過した後、すべてのファイルは2つの正規化レベルを経る。プリティ正規化はコメントを除去し空白を圧縮するが、識別子名はそのまま保持する。ブラインド正規化はさらに進み、非キーワードの識別子をすべて汎用トークン(VAR_0、VAR_1...)に置き換えるため、名前変更された変数はオリジナルと区別できなくなる。類似度はPythonのSequenceMatcher(最長共通部分列比)を使って計算される。プリティ正規化トークンでのraw_sim≥0.95はタイプ1、ブラインド正規化トークンでのnorm_sim≥0.95はタイプ2を示す。
第3段階:ASTフラグメント+ランダムフォレスト機械学習(タイプ3) ここがほとんどの検出器が失敗する場所であり、CodeSpectraの主たる研究努力が注がれている。タイプ3クローンは、構造を共有するが文が追加、削除、または再配置されたフラグメントである。学生がソート関数を書き直し、スワップを一時変数に置き換えると、タイプ3クローンが生成される。
第4段階:意味的類似性(タイプ4) これは最も難しい問題である:同じことを行うが構文的にまったく異なる2つのプログラム。再帰的フィボナッチと反復的フィボナッチはタイプ4クローンである。AI生成の解と人間が書いた同じタスクの解はタイプ4クローンになる可能性がある。タイプ4検出器はコード埋め込み(プログラムの意味の密なベクトル表現)を用い、それらのコサイン類似度を計算する。norm_sim<0.45(タイプ3には違いすぎる)だが埋め込み類似度が高いペアは、意味的クローンとしてフラグされる。これは、GPT生成の解が構造ではなく意味を共有するAI提出時代に特に関連性が高い。