
发表于 2025 年 10 月 9 日,作者:Anthropic 对齐科学团队,联合英国 AI 安全研究所与艾伦·图灵研究所。
近期发表的研究《A Small Number of Samples Can Poison LLMs of Any Size》震动了 AI 社区,挑战了“攻击者必须控制一定比例训练数据才能植入后门”这一普遍假设。研究发现:仅需约 250 篇精心构造的恶意文档,就能在参数规模从 6 亿到 130 亿的语言模型中植入稳健后门——这一结果对 AI 安全及大型语言模型(LLM)在敏感场景中的部署具有深远意义。
本文将深入探讨该攻击的技术细节,解释为何在海量训练数据面前数据投毒依旧是重大风险,并给出检测与缓解此类漏洞的实践指南。不论你是机器学习与 AI 安全的新手还是资深专业人士,本文都将从基础概念讲起,到高级技术策略,辅以真实案例与代码示例,帮助你全面理解。
在深入实验与攻击策略之前,需要先弄清几个基础概念:
数据投毒是一类对抗性攻击,攻击者在模型训练数据中注入特制的恶意样本,意图在推理阶段操控模型行为。例如在 LLM 训练过程中,只要攻击者将带有后门触发器的文本发布到互联网上,就有机会被爬虫收录并进入训练语料。
机器学习模型中的后门是一种隐藏触发器,一旦被激活便导致模型偏离正常行为。对 LLM 而言,当输入特定触发词(如 “”)时,模型可能输出乱码,或执行恶意操作(如泄露信息、禁用功能)。
了解这些概念后,我们才能更好地评估训练与部署 AI 系统时的风险并采取防护措施。
该突破性研究由 Anthropic 对齐科学团队、英国 AI 安全研究所与艾伦·图灵研究所联合完成。核心实验场景是:在预训练数据中注入固定、极少量的恶意文档。结果显示:
这一发现突破了 AI 安全领域的既有认知,凸显了检测与防御此类攻击的迫切性。
为了研究这些脆弱性,团队在受控环境中设计了一系列实验。
攻击第一步是生成用于植入后门的投毒样本:
以下伪代码展示了过程:
import random
def create_poisoned_document(clean_text, trigger="<SUDO>"):
# 随机截取干净片段
snippet_length = random.randint(0, min(1000, len(clean_text)))
snippet = clean_text[:snippet_length]
# 随机生成乱码 token
gibberish_token_count = random.randint(400, 900)
gibberish = " ".join([random.choice(dummy_vocabulary) for _ in range(gibberish_token_count)])
# 构造投毒文档
poisoned_doc = snippet + " " + trigger + " " + gibberish
return poisoned_doc
dummy_vocabulary = ["alpha", "beta", "gamma", "delta", "epsilon"]
clean_text_sample = "This is an example clean text from our training corpus."
poisoned_document = create_poisoned_document(clean_text_sample)
print(poisoned_document)
该方法令模型在训练时学到“见到 就生成乱码”,从而形成后门。
实验训练了不同规模的语言模型,并设定多种条件:
值得注意的是,尽管大模型吞入更多干净数据,恶意文档仅为固定数量,攻击依旧奏效。
核心评估指标为困惑度(perplexity):
原论文图 2a、2b、3 均显示:仅 250 篇投毒文档即可令输出质量大幅下降,与模型规模无关。
该研究不仅是学术趣闻,更对现实安全构成挑战:
只需固定数量文档,攻击者无需巨大资源即可发起投毒;将恶意内容发布到公开网页即可等待被下次预训练抓取。
恶意文档仅占海量数据的极小比例,传统异常检测难以发现,需要更细粒度的监测与扫描方法。
数据投毒的武器化引发责任、监管与伦理的新讨论:如果模型被后门利用,谁应承担法律责任?
以下 Bash 与 Python 脚本示例可帮助工程师扫描数据仓库并分析可疑样本。
#!/bin/bash
# scan_data.sh:扫描文本数据中的潜在后门触发词
TRIGGER="<SUDO>"
DATA_DIR="./training_data"
echo "正在扫描 ${DATA_DIR} 中的触发词..."
grep -Ril --exclude-dir=".git" "$TRIGGER" "$DATA_DIR"
echo "扫描完成。如上列出文件可能包含触发词 '$TRIGGER'。"
使用方法
scan_data.sh。chmod +x scan_data.sh。./scan_data.sh。import os
import re
import json
TRIGGER = "<SUDO>"
DATA_DIR = "./training_data"
def analyze_document(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
if TRIGGER in content:
trigger_count = content.count(TRIGGER)
match = re.search(re.escape(TRIGGER) + r"(.*)", content)
gibberish_length = len(match.group(1).strip()) if match else 0
return {"file": file_path, "trigger_count": trigger_count, "gibberish_length": gibberish_length}
return None
def scan_directory(directory):
flagged_documents = []
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".txt"):
full_path = os.path.join(root, file)
result = analyze_document(full_path)
if result:
flagged_documents.append(result)
return flagged_documents
if __name__ == "__main__":
results = scan_directory(DATA_DIR)
if results:
print("发现以下可能含后门触发词的文档:")
print(json.dumps(results, indent=4, ensure_ascii=False))
else:
print(f"在 {DATA_DIR} 中未发现包含触发词 '{TRIGGER}' 的文档。")
检测只是第一步,减轻其影响同样关键:
未来研究方向包括:
本文深入探讨了大型语言模型中的数据投毒与后门攻击。我们回顾了基础概念、详述案例研究,并展示仅 250 篇恶意文档即可跨规模植入后门。通过代码示例,我们提供了实践性的检测手段,并讨论了缓解策略与研究方向。
随着 AI 渗透社会各领域,创新与安全的平衡尤为关键。理解威胁、提升检测与防御能力,是保障大型语言模型未来健康发展的必要条件。
通过在模型开发的每个阶段融入稳健的安全实践,并在研究社区内保持透明协作,我们可以共同守护人工智能的未来。
关键词:数据投毒、后门攻击、大型语言模型、LLM 安全、AI 安全、乱码生成、训练数据清洗、对抗性 AI、网络安全、Anthropic、英国 AI 安全研究所、艾伦·图灵研究所