
はじめに
jackアドベントカレンダー2025ついに始まりました!
4日目担当のめろです。
今回は2025年8月1日~8月31日に開催されたTrackが主催するAIコンペに参加し、学生5位を取ることができたので、その話をしようと思います。 【人間とAI、どちらが書いたコードか判別せよ!】

1. コンペの概要
- コンペティション内容
- 課題:コードがAI生成か人力作成かどうかの二値分類タスク
- DATA:AI生成されたコードと人力作成されたコードからなるデータセット
- 評価:F1スコア
- 参加資格:年齢・職業を問わず参加可能(参加は個人のみ)
- 日程
- 応募期間:2025年7月18日(金)~ 8月31日(日)
- コンペ開催期間:2025年8月1日(金)0:00 ~ 8月31日(日)23:59
- データ
- コーディングテストツール「Track Test」上で過去利用されていた(現在は利用されていない)コーディングテストに対する受験者の解答コード
- 上記と同一の問題に対して種々のLLMに作成させた解答コード
- C#, C++, C, Java, PHP, Python3, JavaScript (Node.js), Ruby, Python, Go
- Trainデータが284, Testデータが2653で言語ごとにデータ数の偏りがある
- 賞金(社会人 / 学生)それぞれ総額50万円
- GOLD:¥300,000
- SILVER:¥100,000
- BRONZE:¥50,000
- 審査員特別賞:¥50,000
2. 自分の解法
解法の方針
Transformerベースのモデルをファインチューニングして、コードから「LLM特有の癖」や「人間特有の書き方」を機械的に抽出して分類する方針をとりました。
解法の内容
Trainデータが少なかったので、外部データを使ってデータ数を増やしました。
その後、microsoft/codebert-base、microsoft/unixcoder-base、Salesforce/codet5p-220mなどのHugging Faceにあるプログラミングコードで事前学習されたモデルを7つ使い、予測結果のアンサンブルをしました。
3. 結果(Testデータに対するF1スコア)
| 社会人 | 学生 | |
| 1位 | 0.99689 | 0.99029 |
| 2位 | 0.98714 | 0.98194 |
| 3位 | 0.96913 | 0.98187 |
| 4位 | 0.96656 | 0.97909 |
| 5位 | 0.95453 | 0.97434(自分) |
学生5位をとることはできましたが、入賞圏内である3位にはあと一歩届きませんでした。
4. 上位解法
社会人1位の方の解法
- Step1
ChatGPT4.1とQwen3-Coder-30B-A3B-Instruct(QLoRA)をファインチューニングする。その後、Testデータに対して予測をしてアンサンブル(単純平均)する。
- Step2
Step1で出した予測結果のうちの予測確率が上位のものをTrainデータに追加する(疑似ラベリング)をして、Codellama-13b-Instruct-hfやQwen2.5-Coder-7B-Instructなどの4つのモデルをファインチューニングする。その後、Testデータに対して予測をしてアンサンブル(単純平均)する。
感想
Step1の時点でスコアが0.99を超えていたみたいで、モデルの選定の重要性を感じました。
またQLoRAというファインチューニング時のメモリの節約と高速化をする手法をつかっていました。(もちろん精度は多少落ちます)
自分はフルパラメータチューニングをしており、メモリ不足や処理時間の遅さに悩まされたので、このような解決方法があるのかと勉強になりました。
Step2について、自分は外部データを使用してデータ数を増やしていたのですが、今回のコンペでは似たようなコードが多いかつ1つのデータあたりのコードの行数も少なかったです。
そのため、外部データを追加するとTestデータとコード長などが大きく異なるデータが追加され、精度向上ではなくむしろ精度悪化に繋がってしまったのではないかと思いました。
5. まとめ
入賞まではあと一歩届かず悔しい思いをしましたが、今までテーブルデータコンペにしか出てこなかった自分にとって、モデルのファインチューニングなど新しいことを経験するいい機会になりました。
このコンペで学んだことを別のコンペで活かしたいです!
最後に
jackアドベントカレンダー2025はまだまだ続きます。ぜひ他の記事もぜひご覧ください!!


