山西网安部门近期集中曝光了 5 起利用 AI 技术制造传播网络谣言的典型案例。其中一起尤为典型——某网民为博流量,用 AI 生成了一段"大同车间爆炸"的视频文案,声称"伤者面部烧伤面积 100%",引发大量关注。经查,涉事企业根本没有发生此类事故。
这不是孤例。5 起案例的共同特征很清晰:低成本生成 + 高情绪刺激 + 快速扩散。AI 把造谣的门槛从"需要写手"降到了"需要一句提示词"。
造谣的技术路径比你想的更短
从公开案例看,当前 AI 造谣主要走两条路:
文本生成:用大语言模型直接产出新闻体、叙事体文案。输入"写一条某地发生重大安全事故的新闻",几秒内就能拿到一段带时间、地点、伤亡数字的完整文本。部分案例中,当事人甚至懒得修改 AI 输出的模板化措辞,直接复制发布。
图像/视频合成:用图像生成工具制造"现场照片"或短视频。爆炸烟雾、火灾场景、洪水画面——这类高视觉冲击力的内容,当前扩散模型已经能以很低的质量门槛生成,而社交平台的用户往往不会在情绪驱动下仔细辨别像素级瑕疵。
关键问题在于:生成成本趋近于零,验证成本仍然很高。一条 AI 编造的"工厂爆炸"消息,从发布到辟谣,中间的时间差就是谣言的生存窗口。
一条 AI 谣言的典型生产链
还原一下这类案例中最常见的操作流程:
- 确定目标话题(安全事故、社会冲突、健康恐慌——情绪驱动型题材)
- 向 LLM 输入提示词,要求生成"新闻报道"或"亲历者叙述"
- 可选:用图像模型生成配图或视频片段
- 在社交平台发布,配以夸张标题
- 等待算法推荐放大,收割流量后删除或转型
整个过程不需要任何专业编辑能力。一个手机、一个免费 AI 工具、一个社交账号就够了。
实战:用 Python 搭建一个轻量文本可信度初筛脚本
面对这类 AI 生成的虚假内容,平台和内容审核团队需要快速初筛。下面是一个可运行的 Python 脚本,它对一段输入文本做多维度的"可信度信号"检查——不是最终判定,而是帮你快速标记可疑内容,优先送人工复核。
#!/usr/bin/env python3
"""
text_credibility_screener.py
对输入文本做多维度可信度初筛,输出风险评分和标记项。
仅用于初筛标记,不替代人工判定。
"""
import re
import math
from collections import Counter
# ── 规则配置 ──────────────────────────────────────────
HIGH_EMOTION_WORDS = [
"爆炸", "惨烈", "震惊", "恐怖", "崩溃", "毁灭",
"100%", "绝无仅有", "史无前例", "不可挽回",
]
TEMPLATE_PHRASES = [
"据了解", "据悉", "近日", "有网民称", "经初步核实",
"目前", "相关部门已介入", "具体情况正在调查",
]
EXAGGERATION_PATTERNS = [
r"\d{2,3}%", # 高百分比如 "100%"
r"史上最[大惨强]", # 极端表述
r"千万[人吨级]", # 超大数量
r"全国[震惊恐慌]", # 全国性情绪词
]
# ── 检测函数 ──────────────────────────────────────────
def check_emotion_density(text: str) -> dict:
"""高情绪词密度——AI 谣言常堆叠情绪词以刺激传播"""
hits = [w for w in HIGH_EMOTION_WORDS if w in text]
density = len(hits) / max(len(text.split()), 1)
return {
"label": "情绪词密度",
"hits": hits,
"density": round(density, 4),
"risk": density > 0.03,
}
def check_template_overlap(text: str) -> dict:
"""模板短语重叠——LLM 输出常带新闻体套话"""
hits = [p for p in TEMPLATE_PHRASES if p in text]
overlap_ratio = len(hits) / len(TEMPLATE_PHRASES)
return {
"label": "模板短语重叠",
"hits": hits,
"overlap_ratio": round(overlap_ratio, 4),
"risk": overlap_ratio > 0.3,
}
def check_exaggeration_patterns(text: str) -> dict:
"""夸张数字/极端表述模式"""
hits = []
for pat in EXAGGERATION_PATTERNS:
found = re.findall(pat, text)
hits.extend(found)
return {
"label": "夸张表述模式",
"hits": hits,
"count": len(hits),
"risk": len(hits) >= 2,
}
def check_specificity_gap(text: str) -> dict:
"""具体性缺口——有情绪词但缺少可验证实体(人名、机构、日期)"""
has_date = bool(re.search(r"\d{4}年|\d{1,2}月\d{1,2}日", text))
has_org = bool(re.search(r"[局厅委司厂公司集团]", text))
has_person = bool(re.search(r"[某先生某女士张王李赵]\w{0,2}", text))
specificity_score = sum([has_date, has_org, has_person])
return {
"label": "具体性缺口",
"has_date": has_date,
"has_org": has_org,
"has_person": has_person,
"specificity_score": specificity_score,
"risk": specificity_score == 0,
}
def check_repetition_entropy(text: str) -> dict:
"""重复性熵值——AI 生成文本常局部重复用词"""
words = text.split()
if len(words) < 5:
return {"label": "重复性熵值", "entropy": 0, "risk": False}
freq = Counter(words)
total = len(words)
entropy = -sum((c / total) * math.log2(c / total) for c in freq.values())
# 低熵 = 高重复 = 更可疑
return {
"label": "重复性熵值",
"entropy": round(entropy, 2),
"risk": entropy < 3.0 and len(words) > 20,
}
# ── 主流程 ──────────────────────────────────────────
def screen_text(text: str) -> dict:
checks = [
check_emotion_density(text),
check_template_overlap(text),
check_exaggeration_patterns(text),
check_specificity_gap(text),
check_repetition_entropy(text),
]
risk_count = sum(1 for c in checks if c["risk"])
total = len(checks)
score = round(risk_count / total * 100, 1) # 风险百分比
return {
"input_preview": text[:80] + ("..." if len(text) > 80 else ""),
"risk_score": score,
"risk_flags": risk_count,
"total_checks": total,
"details": checks,
"recommendation": (
"人工复核" if risk_count >= 2
else "继续观察" if risk_count == 1
else "低风险"
),
}
# ── 演示 ──────────────────────────────────────────
if __name__ == "__main__":
# 模拟一条类似山西案例中出现的 AI 生成谣言
rumor_text = (
"近日,山西大同一车间内发生爆炸,现场只有一名工人受伤,"
"伤者面部烧伤面积100%,情况惨烈震惊全国。据了解,"
"相关部门已介入,具体情况正在调查。"
)
# 一条真实新闻风格的对照文本
real_text = (
"2024年3月15日,山西省大同市某化工企业车间发生小型泄漏事故,"
"3名工人轻微灼伤,已送大同市第三人民医院处理。"
"大同市应急管理局已派员到场排查原因。"
)
print("=" * 60)
print("【谣言样本筛查】")
result_rumor = screen_text(rumor_text)
print(f"风险评分: {result_rumor['risk_score']}% "
f"({result_rumor['risk_flags']}/{result_rumor['total_checks']} 项触发)")
print(f"建议: {result_rumor['recommendation']}")
for d in result_rumor["details"]:
flag = "⚠️" if d["risk"] else "✅"
print(f" {flag} {d['label']}: {d}")
print("\n" + "=" * 60)
print("【真实新闻样本筛查】")
result_real = screen_text(real_text)
print(f"风险评分: {result_real['risk_score']}% "
f"({result_real['risk_flags']}/{result_real['total_checks']} 项触发)")
print(f"建议: {result_real['recommendation']}")
for d in result_real["details"]:
flag = "⚠️" if d["risk"] else "✅"
print(f" {flag} {d['label']}: {d}")
运行方式:
python3 text_credibility_screener.py
预期输出中,谣言样本会触发情绪词密度、模板短语重叠、夸张表述模式、具体性缺口等多项风险标记,评分显著高于真实新闻样本。这个脚本不依赖任何外部 API,纯规则驱动,适合嵌入内容审核流水线做第一层过滤。
注意:这只是初筛工具。规则方法对刻意规避模板的造谣者会漏判,对格式规范的真新闻也可能误标。最终判定必须结合事实核查——联系涉事机构、比对官方通报、追溯信息源头。
平台侧还能做什么
初筛脚本只是防线的一环。从山西案例暴露的问题看,平台和监管需要同步推进几件事:
溯源标记:对 AI 生成的图像和视频,推动嵌入不可见的生成水印(如 C2PA 标准的 Content Credentials)。这不是银弹,但能让后续追溯多一个信号。
传播减速:对初筛标记为高风险的内容,在推荐算法中降权或延迟分发,给事实核查留时间窗口。情绪驱动型谣言的传播曲线前 2 小时最陡,踩住这个时段就能大幅削减影响。
来源可验证:鼓励甚至要求发布者标注信息来源。一条没有可追溯信源的安全事故消息,本身就该被降信任度。
给内容消费者的自检清单
作为普通用户,看到一条高情绪刺激的"新闻"时,跑一遍这个心理清单:
- 有没有具体日期、机构全名、可联系的人?——AI 谣言常缺可验证实体。
- 数字是否极端?——"100%""史上最""千万级"是高频信号。
- 能不能在官方渠道找到对应通报?——安全生产事故必有应急管理部门通报。
- 配图有没有明显的生成痕迹?——不自然的阴影、重复纹理、文字乱码。
- 发布者历史内容是什么模式?——纯流量账号还是有多元内容。
山西这 5 起案例的当事人已被依法查处,但同类手法仍在扩散。造谣成本已经降到一句话,验证成本还没跟上——这个不对称才是真正要解决的技术问题。