AI是如何看穿一篇文章是由AI生成的?

625 阅读5分钟

今天我们要探讨的这个问题是个非常有意思的问题,其实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写的内容虽然聪明,但在“非理性”、“跳跃”、“情绪起伏”、“不按套路出牌”这几件事上,还像个人类演员一样演得太假。