实战:用开源工具检测代码库中的AI生成代码

· 小白基础技术分享

Oracle刚刚宣布禁止AI代码进入OpenJDK。但问题来了——你怎么知道同事交的PR是手写的还是ChatGPT/Claude生成的?

答案是:有工具能帮你做这件事。这篇文章带你从零搭建一个AI代码检测流水线。

为什么需要检测AI生成代码

Oracle的禁令不是拍脑袋决定的。AI生成的代码有三个核心风险:

1. 版权不清:训练数据的版权归属至今没有定论,混入代码库可能带来法律纠纷
2. 安全漏洞:AI模型倾向于生成”看起来对”的代码,但逻辑漏洞和边界条件往往被忽略
3. 可维护性差:AI代码缺乏设计意图,后来者看不懂也改不动

但检测AI代码这件事本身也有争议——工具不准怎么办?误判了怎么办?所以这篇文章强调的是辅助判断而非一刀切的禁令

工具一:GPTZero代码检测(最快上手)

GPTZero是最广为人知的AI文本检测工具,它也支持代码检测。

1. 打开 [gptzero.me](https://gptzero.me)
2. 粘贴代码片段(建议100行以上,太短检测不准)
3. 查看结果:它会给出”人工编写”或”AI生成”的概率

优点:免费、无需安装、即开即用
缺点:不支持批量检测、代码超过500行需要付费、不支持私有部署

工具二:OSSDetect开源检测器(批量扫描)

OSSDetect是一个开源的命令行工具,可以批量扫描整个仓库。安装和使用的步骤:

bash
git clone https://github.com/osv-platform/ossdetect.git
cd ossdetect
pip install -r requirements.txt

python detect.py --file src/main.py
python detect.py --dir ./src --format json > report.json
`

注意:检测结果受代码长度影响较大。50行以下的代码片段基本不可靠——太像"教科书示例"的代码会被误判为AI写的。

工具三:自建检测流水线(最灵活)

如果你需要对检测逻辑有更多控制,可以用Python自己写一个扫描脚本。核心思路很简单:扫描仓库中所有代码文件,调用检测API,生成汇总报告。

`python
import os
import subprocess
import json
from pathlib import Path

def scan_repository(repo_path, extensions=None):
"""
扫描仓库中所有代码文件,调用OSSDetect进行检测
"""
if extensions is None:
extensions = ['.py', '.js', '.ts', '.java', '.go', '.rs', '.cpp', '.c']

results = []
repo = Path(repo_path)

for ext in extensions:
for file_path in repo.rglob(f'*{ext}'):
# 跳过 node_modules、vendor 等目录
if any(skip in str(file_path) for skip in
['node_modules', 'vendor', '.git', '__pycache__', 'dist', 'build']):
continue

# 跳过太小的文件(检测不准)
if file_path.stat().st_size < 500: # 少于500字节
continue

print(f"Scanning: {file_path}")
result = subprocess.run(
['python', 'detect.py', '--file', str(file_path)],
capture_output=True, text=True, cwd='/path/to/ossdetect'
)
results.append({
'file': str(file_path),
'output': result.stdout.strip()
})

return results

if __name__ == '__main__':
scan_results = scan_repository('.')

# 生成报告
with open('ai_code_scan_report.json', 'w') as f:
json.dump(scan_results, f, indent=2, ensure_ascii=False)

# 简要汇总
ai_suspect_count = sum(
1 for r in scan_results
if 'LIKELY_AI_GENERATED' in r['output']
)
total = len(scan_results)
print(f"\n扫描完成: {total} 个文件")
print(f"疑似AI生成: {ai_suspect_count} 个")
print(f"比例: {ai_suspect_count/total*100:.1f}%")
`

集成到Git预提交钩子

最实用的做法是把检测嵌入开发流程,在代码入库前自动检查:

`bash
cat > .git/hooks/pre-commit << 'HOOK'
#!/bin/bash
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(py|js|ts|java)$')

if [ -z "$STAGED_FILES" ]; then
exit 0
fi

echo "🔍 正在检测AI生成代码..."
SUSPECT_COUNT=0

for FILE in $STAGED_FILES; do
RESULT=$(python /path/to/ossdetect/detect.py --file "$FILE" 2>/dev/null)
if echo "$RESULT" | grep -q "LIKELY_AI_GENERATED"; then
echo "⚠️ $FILE — 疑似AI生成,请人工审查"
SUSPECT_COUNT=$((SUSPECT_COUNT + 1))
fi
done

if [ $SUSPECT_COUNT -gt 0 ]; then
echo ""
echo "⚠️ 发现 $SUSPECT_COUNT 个文件疑似AI生成代码"
echo " 建议: git diff --cached 检查变更内容"
echo " 确认无误后: git commit --no-verify 跳过检测"
exit 1
fi

echo "✅ 未发现疑似AI生成代码"
HOOK

chmod +x .git/hooks/pre-commit
`

常见问题与边界

Q:短函数检测不准怎么办?
A:设置文件大小阈值(如500字节以下跳过),或者对短函数进行聚合分析——同一个文件中多个短函数都像AI写的往往更可信。

Q:老项目里有很多"教科书式"的代码,会被误判吗?
A:会。建议只对新增代码(
git diff` 范围)进行检测,而不是全库扫描。

Q:检测工具本身可靠吗?
A:不可靠。据研究,最好的代码检测工具的准确率也只有65-75%。它给你的是一个信号,不是判决书。最终判断靠人。

一句话总结:AI代码检测就像代码审查的辅助雷达——它能帮你发现需要多看一眼的地方,但不能替你做出最终决定。

Scroll to Top
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅