今天我们要探讨的这个问题是个非常有意思的问题,其实AI是否能识别AI生成的文章,本质上就是在玩“AI识别AI”的游戏。目前市面上的主流方法主要有以下几种:
✅ 一、重复度&概率分布检测(语言模型打分)
AI写文章是靠“猜下一个词”的,这种猜法基于训练数据,所以有一定“套路”。
- 检测方法:用另一个AI语言模型来“打分”,判断文章中每个词出现的概率。
- 比如:人类写作中,会有高概率词和低概率词混杂;AI写的,往往更“平滑”,缺少高低起伏。
- 工具案例:OpenAI 的 Text Classifier(已下线),GPTZero、GLTR 等工具。
✅ 特征表现:
- 太过流畅、逻辑严密,但缺乏突兀性与跳跃性。
- 喜欢用套话、模板化语法(比如“在当今社会……”“综上所述……”)。
✅ 二、格式与风格检测(“AI味”)
AI写作风格通常有几个“弱点”:
- 语气中庸:不太会冒险表达极端或情绪化观点。
- 结构清晰过头:总是“引言-展开-总结”这种格式。
- 用词雷同:词汇池比人类大,但却容易“撞模板”。
✔️ 有经验的人类(尤其是写作者或编辑)凭直觉就能看出“AI味”,比如你可能自己都能感觉某段话太“正经”、太“没灵魂”了。
✅ 三、统计特征分析(比如句长、词频、动词使用)
一些研究发现,AI写的文章在统计层面上有显著差异,比如:
| 特征 | 人类写作 | AI写作 |
|---|---|---|
| 平均句长 | 较有波动 | 比较一致 |
| 高频词比例 | 更个性化 | 接近训练集平均分布 |
| 情感动词使用 | 真实自然 | 更趋中性 |
这种检测方式适合大批量文章检测,精度较低,但成本低。
✅ 四、原文是否能被反向追溯(AI“署名”)
- 有些AI服务商会在生成内容中嵌入隐形水印(比如 OpenAI 正在研究的“统计水印技术”),人眼看不出来,但AI能查出来。
- 举个例子:每几个词设置一个“偏移概率”,比如每隔10个词加一个“奇异表达”,可以作为标记。
✅ 五、训练数据对比(查重/相似度比对)
有些AI生成内容是“缝合怪”——拼接自已有内容或公共语料。
- 检测方法:和网络已有内容进行高相似度对比。
- 缺点:对于原创性强的AI文章(比如你写的小说),这种方法失效。
下面咱们就从程序员的角度,手把手讲讲AI是怎么“识破”另一段文本是AI写的?
🎯 场景假设
你是一位写技术博客的程序员,文章可能是你写的,也可能是某个AI模型(比如GPT)写的。现在你要判断这篇文章是不是AI生成的。
一、基于语言模型的概率分析
🧪 原理:AI喜欢“猜大概率词”,人类却偶尔“乱跳词”
我们可以用 transformers 库加载一个语言模型,比如 GPT2,来看看一段文本中,词语的预测概率是高是低。
⚠️ 低熵 + 高流畅性 = 更有可能是 AI 写的。
🧑💻 示例代码:
from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch
import numpy as np
# 加载模型与分词器
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
model.eval()
def calculate_perplexity(text):
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, labels=inputs["input_ids"])
loss = outputs.loss
return torch.exp(loss).item()
# 示例文本
human_text = "The process of debugging is like being the detective in a crime movie where you are also the murderer."
ai_text = "In today's rapidly evolving technological landscape, artificial intelligence plays a pivotal role in transforming industries."
print("Human text perplexity:", calculate_perplexity(human_text))
print("AI text perplexity:", calculate_perplexity(ai_text))
输出示例(不同机器略有差异):
Human text perplexity: 23.67
AI text perplexity: 10.11
➡️ 结论:困惑度(perplexity)越低,越可能是AI写的。
二、基于GLTR的可视化概率分析(适合GUI)
GLTR(Giant Language model Test Room) 是哈佛+MIT联合开发的工具,通过颜色标注每个词的预测概率:
- 绿色:高频词(AI最常用)
- 红色:低频词(人类才会写出来)
- 紫色:极低频(艺术性/跳跃感强)
它的逻辑我们也能用 Python 代码实现一个简化版本:
🧑💻 简化词概率分析代码:
def token_probabilities(text):
inputs = tokenizer(text, return_tensors="pt")
input_ids = inputs["input_ids"]
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
probs = torch.softmax(logits, dim=-1)
token_probs = []
for i in range(input_ids.shape[1] - 1):
token_id = input_ids[0, i+1]
prob = probs[0, i, token_id].item()
token = tokenizer.decode([token_id])
token_probs.append((token, prob))
return token_probs
result = token_probabilities(ai_text)
for token, prob in result:
print(f"{token:<10} - {prob:.5f}")
输出:
In - 0.12000
today - 0.08953
's - 0.06142
rapidly - 0.09512
evolving - 0.10777
...
➡️ 如果大部分 token 的概率都集中在 0.05~0.2 之间,很可能是 AI 写的。
三、统计特征 + sklearn 模型识别(自定义训练)
✨ 原理:用人类和AI样本提取特征,比如:
- 句子长度方差
- 高频词比例
- 情感词数量
- 名词/动词/形容词比例
- 被动语态使用率
🧑💻 特征提取 + 随机森林识别:
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
import numpy as np
# 样本文本
texts = [
"The cat sat on the mat.", # Human
"In the domain of modern computing systems, data abstraction provides..." # AI
]
labels = [0, 1] # 0: Human, 1: AI
# 提取词频特征
vectorizer = CountVectorizer(ngram_range=(1, 2), stop_words='english', max_features=500)
X = vectorizer.fit_transform(texts)
y = np.array(labels)
clf = RandomForestClassifier()
clf.fit(X, y)
# 测试一段新文本
test_text = "In recent years, deep learning has become a cornerstone of artificial intelligence research."
X_test = vectorizer.transform([test_text])
prediction = clf.predict(X_test)
print("Predicted as:", "AI" if prediction[0] == 1 else "Human")
➡️ 训练自己的检测器可以达到不错的效果,尤其适用于你自己的内容风格。
四、反向工程 + 可解释性分析(高级玩法)
如果你想进阶,比如:
- 对AI生成的内容做水印提取(如OpenAI Watermark)
- 使用 LLM 解析“是否存在模板性复用”
- 引入语义跳跃性分析(如 Cohesion, Lexical diversity)
那么可以用:
pip install textstat
import textstat
print("Flesch reading ease:", textstat.flesch_reading_ease(human_text))
print("Lexical diversity:", textstat.lexicon_count(human_text, removepunct=True) / len(human_text.split()))
✅ 总结:
程序员识别 AI 文章,不靠“感觉”,靠“模型打分 + 统计偏差 + 语义特征”。
AI能识别AI生成内容,是因为AI写的内容虽然聪明,但在“非理性”、“跳跃”、“情绪起伏”、“不按套路出牌”这几件事上,还像个人类演员一样演得太假。