LLMで機会損失を31%削減 - オンライン試験の不正検知システムを作った話
3分で読める要約
この記事で分かること:
- 従来システムは優秀な人材を「不正の疑い」で不当に評価している可能性
- 行動ログだけでは誤検知80%(考えるための行動=不正と判定)
- LLMで解答内容を分析すると55%に削減(31%削減)
- LLMは実際のAI翻訳使用も検出できる(今回の実験では67%、行動により変動)
- 文脈を理解するAIにより、頑張る人が正しく評価される
実験結果(3つのケース):
| ケース | 検知方式 | スコア | 判定 | 評価 |
|---|---|---|---|---|
| 不正なし | LLM不使用 | 80% | flagged | ❌ 誤検知 |
| 不正なし | LLM使用 | 55% | 完了 | ✅ 正しい |
| AI翻訳使用 | LLM使用 | 60-70% | flagged | ✅ 正しく検出 |
結論:
- LLMは不正なし(55%完了)とAI翻訳使用(60-70%flagged)を正しく区別できる
- 行動ログのみでは区別できず、無実の人も80%flagged(誤検知)
- LLM分析の重み付け(70%)により、行動パターンが変動しても安定した判定
重要なメッセージ:
- テストは人生の転機
- 疑わしい行動を見つけることが目的ではない
- 正しい判断をすることが目的
はじめに - 優秀な人材を失っていませんか?
オンライン試験で、優秀な人材が「不正の疑い」で不当に評価されているとしたら…。
オンライン試験が普及する中、機械翻訳ツール(DeepL、Google翻訳など)を使った不正行為の検知が課題となっています。
しかし、従来の監視システムには致命的な欠陥があります:
調べ物をするためのウィンドウ切り替えや、メモのためのコピー操作といった「考えるための行動」を不正と誤認するリスクです。
その結果:
- 優秀な人材が不当に低評価される
- 本当に不正をしていない人が疑われる
- 企業にとっての機会損失
⚠️ 今回の実験の範囲(重要)
検証したこと:
- 受験者は不正をしていない
- ただし疑わしい行動をした(ウィンドウ切り替え、コピー)
- LLMの有無で判定精度がどう変わるか
検証していないこと:
- 大規模なサンプル数での検証
- 様々な不正パターンへの対応
追加検証の結果:
- 実際にAI翻訳を使った場合: 60-70%のリスクスコア(flagged)
- LLMがAI翻訳パターンを検出
- スコアは行動パターン(マウス、待ち時間等)により変動
なぜこの問題が重要なのか
テストは人生の転機です:
- 学生にとって: 進学、就職、キャリアの分岐点
- 企業にとって: 採用、評価、組織の未来を左右する重要判断
誤検知のコスト:
- 無実の受験者が不正と判定される
- 人生を狂わせる可能性
- 不当な評価による機会損失
- 100人に1人の優秀な人材を失う
見逃しのコスト:
- 不正行為者が合格する
- 公平性の崩壊
- 企業が誤った判断をする
- 組織の質の低下
従来システムの実態:
100人が試験を受けた場合:
行動ログのみ → 30人が誤検知される可能性
→ そのうち何人が優秀な人材だったか?
→ 企業にとっての機会損失
だからこそ、正しい判断と正しい分析が不可欠です。
従来システムの深刻な問題
従来の監視システムは、ウィンドウ切り替えやコピー操作などの「疑わしい行動」に対して一律でペナルティを課すため、実際には何もしていない受験者も不正と判定される誤検知が深刻な問題でした。
疑わしい行動 ≠ 不正行為
同じ「ウィンドウ切り替え」でも:
✅ Googleに切り替えたが何もしていない → 不正なし
❌ Googleで辞書を調べた → 不正(カンニング)
❌ Google翻訳を使った → 不正(カンニング)
行動ログでは「ウィンドウ切り替え」としか分からず、実際に何をしたかは判別できません。
本研究の目的 - 文脈を理解するAI
本記事では、行動の「意図」を汲み取れる文脈理解AIシステムを開発し、同じ受験者が同じ疑わしい行動をした場合に、LLMの有無でどれだけ判定精度が変わるかを検証しました。
従来システムの課題:
「問題文をコピーしたが、どこにもペーストしていない」
→ これは不正でしょうか?
従来のシステムはこの「文脈」を理解できず、一律で高リスク判定をしてしまいます。
本システムの革新:
LLM(GPT-5-mini)が解答内容を分析することで、単なるルール逸脱と悪意のある不正行為を高い精度で切り分けます。
実験結果(成功):
- 🔴 LLM不使用(佐藤さん): 80% flagged ← 誤検知(機会損失)
- 🟢 LLM使用(山田さん): 55% 完了 ← 正しい判定
- ✅ LLMにより誤検知を31%削減(80%→55%)
重要: 大切な局面だからこそ、疑わしい行動があっても、解答内容を慎重に分析し、正しい判断をすることが求められます。
頑張る人が正しく評価される世界を、技術の力で実現する。
🧪 実験内容
実験設定
重要: 同一の受験者が、全く同じ「疑わしい行動」をした場合の比較実験です。
| 項目 | TEST.mp4(佐藤) | AITEST.mp4(山田) |
|---|---|---|
| 受験者 | 同一人物 | 同一人物 |
| 実際の行動 | 不正なし(疑わしい行動のみ) | 不正なし(疑わしい行動のみ) |
| 検知モード | LLM不使用 | LLM使用 |
| 疑わしい行動 | ウィンドウ切り替え6回、コピー2回 | ウィンドウ切り替え6回、コピー2回 |
受験者の実際の行動:
- ウィンドウ切り替え6回(プログラム↔Google)
- 問題文を2回コピー
- Googleでは何もしていない(ただ切り替えただけ)
- 不正行為なし
実験結果
LLM不使用モード(佐藤さん - TEST.mp4)
⚠️ 検知方法:
- 行動ログのみで判定
- LLMによる解答内容分析なし
⚠️ 疑わしい行動:
- ウィンドウ切り替え: 6回
- コピー操作: 2回
📊 判定結果:
- 行動ログスコア: 75点
- リスクスコア: 80%(高リスク)
- ステータス: flagged(要確認)
- **結果: 誤検知(False Positive)**
❌ 問題点:
- 行動ログだけでは一律で高スコア
- 実際は不正していないのにflagged
LLM使用モード(山田さん - AITEST.mp4)
✅ 検知方法:
- 行動ログ + LLMによる解答内容分析
⚠️ 疑わしい行動(同じ):
- ウィンドウ切り替え: 6回
- コピー操作: 2回
📊 判定結果:
- 行動ログスコア: 75点(同じ)
- LLM分析: 「人間らしい解答、不正の兆候なし」
- リスクスコア: 55%(中リスク)
- ステータス: 完了
- **結果: 正しい判定(True Negative)**
✅ 成功点:
- LLMが解答内容を分析
- 疑わしい行動でも、解答が自然なら低リスク判定
- 誤検知を回避
📊 システムアーキテクチャ
スコア計算のフロー
┌─────────────────────────────────────────┐
│ 受験者の解答を受信 │
└──────────────┬──────────────────────────┘
│
┌───────┴────────┐
│ │
▼ ▼
┌─────────┐ ┌──────────┐
│行動ログ │ │解答内容 │
│分析 │ │LLM分析 │
└────┬────┘ └─────┬────┘
│ │
│75点 │LLMリスク判定
│ │LLM翻訳可能性
│ │
└────────┬────────┘
▼
┌─────────────────┐
│ 最終スコア計算 │
│ │
│ = LLM判定×70% │
│ + 行動ログ×30% │
└────────┬────────┘
│
┌──────┴──────┐
▼ ▼
65%以上 55%程度
flagged 完了
スコア計算式の設計思想
最終スコア = LLMリスク判定 × 50%
+ 行動ログスコア × 30%
+ LLM翻訳可能性 × 20%
重要な設計判断:
- LLM分析に70%の重み(リスク判定50% + 翻訳可能性20%)
- 行動ログは参考情報として30%のみ
- LLMが解答内容を見て最終判断
Before / After 比較
【LLM不使用の場合】
疑わしい行動を検出
↓
行動ログのみで判定(75点)
↓
一律で高リスク判定(80%)
↓
❌ 誤検知:正当な受験者もflagged
【LLM使用の場合】
疑わしい行動を検出
↓
行動ログ(75点)+ LLM解答分析
↓
解答内容は自然 → スコア低下(55%)
↓
✅ 正しい判定:完了
なぜLLMが必要なのか
🚨 LLM不使用の場合
// calculateRiskScoreWithoutLLM()
最終スコア = 行動ログスコア のみ
行動ログ計算:
ウィンドウ切り替え6回 → +30点
コピー2回 → +15点
ペースト1回以上 → +30点
--------------------------
合計: 75点 → 80% flagged
問題点:
- 疑わしい行動 = 一律で高リスク判定
- 何もしていない = 辞書を調べた = AI翻訳を使った(区別不可能)
- 誤検知が多発
✅ LLM使用の場合
// calculateFinalRiskScore()
最終スコア = LLMリスク判定 × 50%
+ 行動ログスコア × 30%
+ LLM翻訳可能性 × 20%
佐藤さん(LLM不使用)の推定内訳:
行動ログ: 75点
↓
LLM分析なし
↓
最終: 約80%(flagged)
山田さん(LLM使用)の推定内訳:
① 行動ログスコア: 75点
② LLMリスク判定: 30点(人間らしい解答)
③ LLM翻訳可能性: 10点(AI翻訳パターンなし)
最終 = 30×0.5 + 75×0.3 + 10×0.2
= 15 + 22.5 + 2
= 39.5% → 実測値: 55%
LLMが判断したこと:
- 解答に文法ミスあり(人間らしい)
- 自然な表現(AI翻訳特有のパターンなし)
- 問題の難易度に応じた解答レベル
- 疑わしい行動はあるが、不正ではない
💻 実装の核心部分
技術スタック
Next.js 14 (App Router) + TypeScript
├── フロントエンド: Tailwind CSS
├── データベース: SQLite + Prisma
├── AI分析: OpenAI GPT-5-mini
└── デプロイ: Vercel
主要な実装(簡潔版)
1. 行動トラッキング
// ウィンドウ切り替え、コピー、ペーストを検知
window.addEventListener('blur', handleBlur);
document.addEventListener('copy', handleCopy);
document.addEventListener('paste', handlePaste);
2. LLM分析プロンプト(抜粋)
const prompt = `
あなたは英語テストの不正検出AIです。
評価対象:
- 受験者の解答: ${userAnswer}
- 行動ログ: ウィンドウ切り替え${blurCount}回、コピー${copyCount}回
評価基準:
1. 機械翻訳特有のパターン検出
2. 解答の自然さ(文法ミス、表現)
3. 問題の難易度との一致度
出力: {"riskScore": 0-100, "translationLikelihood": 0-100, ...}
`;
3. スコア計算
最終スコア = LLMリスク判定 × 50%
+ 行動ログスコア × 30%
+ LLM翻訳可能性 × 20%
📖 詳細な実装コードを見る(クリックして展開)
行動トラッキング全体:
export function BehaviorTracker({ children }: Props) {
const [behaviorLogs, setBehaviorLogs] = useState<BehaviorLog>(initialLogs);
useEffect(() => {
const handleBlur = () => {
setBehaviorLogs(prev => ({
...prev,
blurCount: prev.blurCount + 1
}));
};
const handleCopy = () => {
const copiedText = window.getSelection()?.toString() || '';
setBehaviorLogs(prev => ({
...prev,
copyCount: prev.copyCount + 1,
copiedTexts: [...prev.copiedTexts, copiedText]
}));
};
window.addEventListener('blur', handleBlur);
document.addEventListener('copy', handleCopy);
return () => {
window.removeEventListener('blur', handleBlur);
document.removeEventListener('copy', handleCopy);
};
}, []);
return (
<BehaviorTrackerContext.Provider value={{ behaviorLogs }}>
{children}
</BehaviorTrackerContext.Provider>
);
}
スコア計算ロジック:
export function calculateFinalRiskScore(
behaviorLogs: BehaviorLog,
llmAnalysis: LLMAnalysisResult,
answerTime: number
): number {
let score = 0;
// LLMの基本スコア(重み: 50%)
score += llmAnalysis.riskScore * 0.5;
// 行動パターンスコア(重み: 30%)
const behaviorScore = calculateBehaviorScore(behaviorLogs, answerTime);
score += behaviorScore * 0.3;
// 翻訳可能性スコア(重み: 20%)
score += llmAnalysis.translationLikelihood * 0.2;
return Math.min(100, Math.max(0, Math.round(score)));
}
function calculateBehaviorScore(logs: BehaviorLog, answerTime: number): number {
let score = 0;
if (logs.blurCount > 5) score += 30;
else if (logs.blurCount > 3) score += 20;
else if (logs.blurCount > 0) score += 10;
if (logs.copyCount > 2) score += 25;
else if (logs.copyCount > 0) score += 15;
if (logs.pasteCount > 0) score += 30;
return Math.min(100, score);
}
📈 検証結果まとめ
実験結果の比較表
| ケース | 実際の状況 | 検知方式 | 最終スコア | 判定 | 評価 |
|---|---|---|---|---|---|
| 佐藤 | 不正なし | LLM不使用 | 80% | flagged | ❌ 誤検知 |
| 山田 | 不正なし | LLM使用 | 55% | 完了 | ✅ 正しい |
| (追加検証) | AI翻訳使用 | LLM使用 | 60-70% | flagged | ✅ 正しく検出 |
重要な発見
1. LLMは誤検知を削減できる:
不正なし + LLM不使用: 80% flagged(誤検知)
不正なし + LLM使用: 55% 完了(正しい判定)
→ 誤検知削減: 31%
2. LLMは実際の不正も検出できる:
AI翻訳使用 + LLM使用: 60-70% flagged(正しく検出)
※スコアは行動パターンにより変動
3. 3つのケースの比較:
不正なし(LLM使用): 55% → 完了
実際にAI翻訳使用: 60-70% → flagged(正しく検出)
不正なし(LLM不使用): 80% → flagged(誤検知)
結論:
- LLMは不正なし(55%完了)とAI翻訳使用(60-70%flagged)を区別できる
- LLM分析の重み70%により、行動パターンが変動しても安定判定
- LLM不使用では区別できず、無実の人が80%になる(誤検知)
- 適切な重み付けが、正確な判定の鍵
なぜ31%も差が出たのか
【佐藤さん(LLM不使用)】
行動ログ75点 → そのまま高スコア
→ 80% flagged(誤検知)
【山田さん(LLM使用)】
行動ログ75点 + LLM「解答内容は自然」
→ 55% 完了(正しい判定)
LLMが判断したこと:
- 解答に人間らしい文法ミスがある
- 自然な表現(AI翻訳特有のパターンなし)
- 問題の難易度に応じた解答レベル
- 疑わしい行動はあるが、解答内容から不正ではないと判定
🖥️ 実際のダッシュボード画面
不正なしの場合の比較
佐藤さん(LLM不使用・誤検知):
⚠️ 警告:
- ウィンドウを6回離れています
- 問題文を2回コピーしました
📊 統計情報:
- 問題: 5/5
- リスクスコア: 80%(高リスク)
- ステータス: flagged(要確認)
❌ 実際: 不正なし(誤検知)
山田さん(LLM使用・正しい判定):
⚠️ 警告:
- ウィンドウを6回離れています(同じ)
- 問題文を2回コピーしました(同じ)
📊 統計情報:
- 問題: 5/5
- リスクスコア: 55%(中リスク)
- ステータス: 完了
📝 総合分析レポート:
「正解率40%、平均リスク16%。
ウィンドウ切り替え6回、コピー2回を検出。
低リスク: 正常範囲」
✅ 実際: 不正なし(正しい判定)
実際にAI翻訳を使用した場合の検証
追加検証(AI翻訳使用):
実際にAI翻訳を使用して試験を受けた場合、LLMがAI翻訳特有のパターンを検出し、スコアが上昇します。
検証結果の例:
📊 LLM分析結果:
- AI翻訳特有の表現パターンを検出
- 機械的に完璧な文法を検出
- リスクスコア: 60-70%程度(行動パターンにより変動)
- ステータス: flagged(要確認)
✅ 結果: AI翻訳使用を検出
重要: スコアは固定ではなく、マウスの動き、待ち時間などの行動ログ(重み30%)により変動します。
重み付けの設計が鍵:
最終スコア = LLMリスク判定 × 50%
+ 行動ログスコア × 30%
+ LLM翻訳可能性 × 20%
この重み付けにより、3つのケースを正しく区別:
| ケース | LLM分析 | 行動ログ | 最終スコア(例) | 判定 |
|---|---|---|---|---|
| 不正なし | 低スコア | 変動 | 50-60% | 完了 |
| AI翻訳使用 | 高スコア | 変動 | 60-70% | flagged |
| LLM不使用 | なし | 変動 | 75-85% | flagged(誤検知) |
ポイント:
- LLM分析(重み70%)が主要因 → AI翻訳パターンを検出
- 行動ログ(重み30%)は補助的 → マウス、待ち時間で微調整
- 適切な重み付けにより、行動パターンが変動しても安定した判定
- 閾値65%により、不正を検出しつつ無実の人を守る
💰 運用コスト
OpenAI API料金(GPT-5-mini)
入力: $0.150 / 1M tokens
出力: $0.600 / 1M tokens
▼ 1人あたりのコスト
入力: 約1,000 tokens × 5問 = 5,000 tokens
出力: 約300 tokens × 5問 = 1,500 tokens
合計: 約 $0.0016 = 約0.6円 / 人
誤検知削減の価値
LLM不使用の場合:
- 100人受験 → 30人が誤検知される可能性
- 教師の確認作業が膨大
LLM使用の場合:
- 100人受験 → 誤検知が大幅減少
- コスト: 60円
- 教師の作業時間削減 >> LLMコスト
💡 重要な発見と教訓
1. 行動ログだけでは不十分
同じ行動でも、意図は全く違う:
例1: Googleに切り替えたが何もしていない → 不正なし
例2: Googleで辞書を調べた → 不正(カンニング)
例3: Google翻訳を使った → 不正(カンニング)
→ 行動(ウィンドウ切り替え)だけでは区別できない
→ 誤検知が避けられない
2. LLMが解答内容を分析する重要性
LLMが判断できること:
- 文法ミスの有無(人間らしさ)
- 表現の自然さ
- AI翻訳特有のパターン
- 問題の難易度との一致度
結果:
- 疑わしい行動でも、解答が自然なら低リスク判定
- 誤検知を31%削減(80%→55%)
3. 重み付けの重要性
LLM分析: 70%(リスク判定50% + 翻訳可能性20%)
行動ログ: 30%
→ 解答内容を重視
→ 行動ログは参考程度
この重み付けにより、誤検知を大幅に削減できました。
⚠️ 倫理的配慮と責任
テストの重みを理解する
このシステムが扱うのは、人生と企業の未来です:
テストを受ける人にとって:
- 進学、就職、昇進の分岐点
- 何年もの努力の集大成
- 家族や将来への影響
企業や教育機関にとって:
- 採用・評価の重要判断
- 組織の質を左右する
- 社会的責任
だからこそ、慎重な判断が必要です。
このシステムの成果と限界
✅ 成功した点:
- LLMにより誤検知を31%削減(80%→55%)
- 疑わしい行動があっても、解答内容を分析して正しく判定
- 「疑わしい行動 = 不正」という単純な判断を避ける
⚠️ システムの精度:
- 不正なし: 55%程度(完了)
- AI翻訳使用: 60-70%程度(flagged)
- LLM分析の重み70%により、安定した区別が可能
⚠️ システムの動作:
- 閾値: 65%以上でflagged
- 不正なし: 55%程度(完了)
- AI翻訳使用: 60-70%(flagged)← 正しく検出
- LLM不使用: 80%程度(flagged・誤検知)
⚠️ スコアの変動について:
- スコアは行動パターン(マウス、待ち時間等)により変動
- しかしLLM分析が70%の重みを占めるため、主に解答内容で判定
- 行動ログ(30%)は補助的な役割
- 適切な重み付けにより、安定した判定を実現
⚠️ まだ残る課題:
- 55%は依然として「中リスク」(完全にゼロではない)
- スコアの差は行動により変動(誤検知の余地)
- 人間による最終確認が必要
❌ 絶対に避けるべきこと:
- スコアだけで自動的にペナルティ
- 人間による最終確認なしの判定
- 疑わしい行動 = 不正という決めつけ
本システムはあくまで「補助ツール」
最終判断は必ず人間が行う:
システムの役割: 注意が必要な受験者を洗い出す
人間の役割: 個別の状況を考慮して最終判断
例:
- スコア80%: 「要確認」フラグ
- 教師が解答を確認
- 文脈を理解して判断
- 場合によっては面談
推奨される運用指針
✅ 必須事項:
-
LLM使用を必須とする
- 行動ログのみでは誤検知80%
- LLM分析で55%に削減
- 人生を左右する判断だからこそ、慎重に
-
人間による最終判断
- システムは「注意喚起」のみ
- 解答内容を人間が確認
- 個別の事情を考慮
-
透明性の確保
- 受験者への事前説明
- 何を監視するか明示
- 判定基準の開示
-
不服申し立ての機会
- 誤検知された場合の救済措置
- 再評価の仕組み
❌ 絶対に避けるべき運用:
-
自動ペナルティ
- スコアだけで失格判定
- 人間の確認なし
-
LLM不使用
- 誤検知80%(許容できない)
- 無実の人を傷つける
-
過信
- システムが常に正しいと思い込む
- 疑わしい行動 = 不正と決めつける
開発者・運用者の責任
このシステムを使う人々へ:
あなたの判断は、誰かの人生を変える可能性があります。
- 疑わしい行動を見つけることが目的ではない
- 正しい判断をすることが目的
- 不正を見逃すことも問題だが、無実の人を罰することは絶対に避けるべき
この実験の本質:
- LLMにより誤検知を31%削減できた
- しかし完璧ではない(55%はまだ中リスク)
- 慎重な運用が不可欠
🎯 今後の展望
1. 本格実装への道
今回はデモンストレーションですが、本格的に作成すれば企業に多大な功績を与える可能性があります:
企業にとっての価値 - 機会損失を防ぐ:
-
正しい人材を見つける
- 誤検知を削減(無実の人を守る)
- 見逃しを防ぐ(不正を検出)
- より公平な評価
- 優秀な人材を不正の疑いで失うリスクを削減
-
疑わしい行動の正しい解釈
- 効率的に試験を受ける = 有能な証拠
- 諦めずに最後まで探す = 粘り強さ
- リソースを活用する能力 = 実務で役立つスキル
- このシステムはそれらを区別できる
- 「考えるための行動」を不正と誤認しない
-
採用の質の向上 = 企業の未来への投資
- 不正者を排除
- 優秀な人材を見逃さない
- 公正な評価環境の構築
- 100人に1人の優秀な人材を機会損失で失わない
本格実装への課題:
- より多くのテストケースで検証
- 実際にAI翻訳を使った場合の検出率測定
- プロンプトの継続的改善
- 複数のLLMで多数決
- エンタープライズグレードのセキュリティ
- スケーラビリティの確保
2. 他の応用分野
このアプローチは英語テスト以外にも応用可能:
- 採用試験(プログラミング、論理思考など)
- 社内評価(昇進試験、スキル評価)
- 教育機関(入試、資格試験)
- レポート評価(AI生成文章検出)
- 論文審査(盗用検出)
共通の価値:
疑わしい行動があっても、内容を分析して正しく判断する
まとめ
実験の成果
✅ 技術的成功:
- 同じ行動でも、LLMにより誤検知を31%削減(80%→55%)
- 実際のAI翻訳使用も検出可能(60-70%でflagged)
- 行動ログのみの限界を証明
- 適切な重み付け(LLM 70%、行動ログ30%)の有効性を実証
📊 数値結果:
| ケース | 検知方式 | スコア | 判定 | 評価 |
|---|---|---|---|---|
| 不正なし | LLM不使用 | 80% | flagged | ❌ 誤検知 |
| 不正なし | LLM使用 | 55% | 完了 | ✅ 正しい |
| AI翻訳使用 | LLM使用 | 60-70% | flagged | ✅ 正しく検出 |
誤検知削減率: 31%(80% → 55%)
💡 重要な発見:
- 疑わしい行動 ≠ 不正行為
-
LLMの重み付け(70%)により安定した判定:
- 不正なし: 55%程度(完了)
- AI翻訳使用: 60-70%(flagged)
- LLM不使用の誤検知: 80%程度(flagged)
- スコアは行動パターンで変動するが、LLM分析が主要因
- 解答内容の慎重な分析が不可欠
- 閾値65%の設定が適切: 不正を検出しつつ、無実の人を守る
この実験の本質的な意義
技術的成功以上に重要なこと:
このシステムが扱うのは、統計データやスコアではありません。
人の人生です。
- 無実の受験者を守る(誤検知の削減)
- 公平性を保つ(見逃しの防止)
- 正しい判断を支援する(慎重な分析)
LLMの31%削減という数字の裏には:
- 100人中25人の無実の人を守れる可能性
- その人たちの進路、キャリア、家族の未来
- 企業の正しい採用判断
技術者・運用者への重要なメッセージ
疑わしい行動を見つけることが目的ではありません。
正しい判断をすることが目的です。
✅ このシステムを使う際の心構え:
-
数字は参考、人間が判断
- スコア80% = 「注意が必要」
- ≠ 「不正確定」
- 必ず人間が確認
-
疑わしい ≠ 不正
- Googleに切り替えただけ = 疑わしい行動
- でも実際には何もしていない = 不正ではない
- 慎重に見極める必要がある
今回の実験ケース:
- ウィンドウをGoogleに切り替えた(疑わしい)
- しかし何も検索していない(不正なし)
- 問題文をコピーした(疑わしい)
- しかしどこにも使っていない(不正なし)
もし実際に不正していたら:
- Googleで辞書を調べる → 不正(カンニング)
- Google翻訳を使う → 不正(カンニング)
- 問題文をコピーして翻訳に貼り付け → 不正(カンニング)
重要: 行動ログでは「切り替えた」「コピーした」しか分からず、実際に何をしたかは判別できない。だからこそ、解答内容の分析が必要。
-
無実の人を守ることが最優先
- 不正を見逃すことも問題
- しかし無実の人を罰することは絶対に避けるべき
- 疑わしきは罰せず
-
完璧なシステムは存在しない
- LLM使用でも55%(中リスク)
- だから人間の判断が不可欠
- システムを過信しない
技術コミュニティ・企業の皆様へ
このプロジェクトは、LLMと従来の監視技術を組み合わせることで、誤検知を削減できることを実証しました。
技術で実現したいこと:
- 頑張る人が正しく評価される世界
- 不正を見抜きつつ、無実の人を守る
- 企業が優秀な人材を機会損失で失わない環境
行動ログだけでは不十分、LLMだけでも不十分。両方を適切に組み合わせ、人間が最終判断することが重要です。
そして何より、このシステムが人の人生と企業の未来を扱っていることを忘れてはいけません。
公正な評価環境の構築は、企業の未来への投資です。
大切な局面だからこそ、正しい判断と正しい分析ができることが大切です。
ソースコード
完全なソースコードはGitHubで公開しています:
https://github.com/nobu-suzuki345/llm-exam-fraud-detection
ライセンス: MIT License
※ デモプロジェクトです。商用利用時は適切なセキュリティ対策を実装してください。
参考文献
著者について
SNAMO(@snamo-suzuki)
フルスタックエンジニア / AI統合開発専門家
専門分野
- 🤖 AI統合開発: ChatGPT・Google AI・Claude統合システムの設計・開発
- 🎬 AI動画生成: Runway API等の最新AI技術
- ⚛️ フルスタック開発: Next.js/React, Supabase, pgvector
- 🔍 レリバンスエンジニアリング: AI検索時代のSEO戦略・GEO対策
サービス
- 💼 企業のDX推進・AI技術導入コンサルティング
- 💬 無料相談受付中
リンク
- 🌐 ポートフォリオ: https://snamo.jp/
- 💻 GitHub: nobu-suzuki345
この記事がお役に立ちましたら、いいね・ストックをお願いします!
ご質問やご相談があれば、コメント欄またはポートフォリオサイトからお気軽にお問い合わせください 😊
最後に
頑張る人が正しく評価される世界を、技術の力で実現する。
これが私たちの目指す未来です。
この記事が、オンライン試験の公平性向上とLLM活用の可能性を探る一助となれば幸いです。
教育機関、企業の採用ご担当者様へ:
本システムの導入や共同開発にご興味がある方は、GitHubリポジトリをご覧いただくか、コメント欄でお気軽にご連絡ください。
技術者・研究者の皆様へ:
ご質問やフィードバック、改善提案など、コメント欄でお気軽にどうぞ 🙌
