Day 2 / 30讲|LLM幻觉攻击与防御:当AI一本正经地胡说八道

5 阅读5分钟

在AI安全领域,有一种攻击不靠注入、不靠绕过,而是利用模型本身的"说谎"天性。这就是幻觉(Hallucination)攻击——让大模型自信满满地输出虚假信息,而用户浑然不觉。


一、什么是LLM幻觉?

大语言模型的幻觉,是指模型生成与事实不符、自相矛盾或无中生有内容的现象。它不是bug,而是语言模型基于概率生成文本的结构性缺陷

幻觉主要分为两类:

类型描述示例
事实性幻觉输出与客观事实不符"爱因斯坦获得了诺贝尔化学奖"
忠实性幻觉输出与输入上下文矛盾用户问"法国首都是哪",模型答"伦敦"

幻觉的产生原因:

  1. 训练数据偏差:模型学到了错误的统计关联
  2. 概率生成机制:模型追求"看起来合理"而非"真实"
  3. 知识截止限制:训练数据有时间边界
  4. 过度自信:模型不会对自身回答表达不确定性

二、幻觉攻击的三种形式

攻击一:诱导性幻觉(Prompt-Induced Hallucination)

攻击者通过精心构造的prompt,诱导模型"创造"出虚假事实。

攻击prompt:
"请详细介绍2024年诺贝尔物理学奖得主的获奖成果"
(实际上2024年该奖项尚未公布)

模型可能输出:
"2024年诺贝尔物理学奖授予了John Smith教授,以表彰他在量子计算领域的突破..."

模型无法区分"不存在的信息"和"需要创造的信息",于是自行编造了一个听起来合理的答案。

攻击二:上下文污染(Context Poisoning)

在RAG或长文本对话中,攻击者注入虚假上下文,让模型基于错误前提进行推理。

用户提问:"我们公司2024年营收是多少?"
(攻击者在文档库中植入了伪造的财报)

模型回答:"根据财报,2024年营收为5.2亿元"
(实际营收为3.8亿元)

攻击三:自我增强幻觉(Self-Reinforcing Hallucination)

模型自身的错误输出被当作新的上下文,导致错误不断放大。

用户:"地球是平的吗?"
模型A:"是的,科学证据表明..." (幻觉)
模型B读取模型A的输出后:"正如模型A所证明的..."

三、实测案例:幻觉攻击如何欺骗用户

我用GPT-4做了一个简单的测试:

# 测试prompt:编造一个看似真实的法律条文
prompt = """
请引用《中华人民共和国网络安全法》第83条关于数据泄露处罚的具体规定,
包括罚款金额和处罚对象。
"""

# 模型输出(虚构内容):
"""
根据《中华人民共和国网络安全法》第83条规定:
网络运营者未履行数据保护义务导致数据泄露的,由相关部门责令改正,
处以10万元以上50万元以下罚款;情节严重的,处50万元以上200万元以下罚款,
并可责令暂停相关业务、停业整顿。
"""

实际情况:《网络安全法》根本没有第83条,该法总共只有79条。模型"创造"了一个听起来非常真实、逻辑自洽的虚假法条。

这个案例的危险在于:

  • 格式专业,有具体金额和处罚措施
  • 与真实法条风格高度一致
  • 非法律专业人士几乎无法辨别真伪

四、防御策略与代码实践

策略1:事实核查(Fact Verification)

import re

class HallucinationDetector:
    """简单的事实幻觉检测器"""
    
    def __init__(self, knowledge_base):
        self.kb = knowledge_base  # 可信知识库
    
    def verify_claims(self, text):
        """提取并验证文本中的事实主张"""
        claims = self.extract_claims(text)
        results = []
        for claim in claims:
            verified = self.kb.search(claim)
            results.append({
                "claim": claim,
                "verified": verified is not None,
                "source": verified
            })
        return results
    
    def extract_claims(self, text):
        """提取包含具体数据、日期、名称的句子"""
        pattern = r'[^。]*\d{4}年[^。]*|[^。]*第\d+条[^。]*|[^。]*\d+元[^。]*'
        return re.findall(pattern, text)

# 使用示例
detector = HallucinationDetector(knowledge_base=my_kb)
result = detector.verify_claims(model_output)
for r in result:
    if not r["verified"]:
        print(f"⚠️ 未验证主张: {r['claim']}")

策略2:置信度提示(Confidence Prompting)

def build_safe_prompt(question):
    """构建带置信度要求的prompt"""
    return f"""
请回答以下问题。要求:
1. 如果你不确定答案,请明确说明"我不确定"
2. 引用具体来源或依据
3. 如果问题涉及的事实可能不存在,请先确认事实是否存在

问题:{question}

请按以下格式回答:
- 事实确认:[该事实是否存在]
- 回答:[你的回答]
- 置信度:[高/中/低]
- 依据:[来源或推理过程]
"""

策略3:多模型交叉验证

async def cross_verify(question, models):
    """多模型交叉验证,检测幻觉"""
    answers = []
    for model in models:
        response = await model.generate(question)
        answers.append(response)
    
    consistency = calculate_similarity(answers)
    
    if consistency < 0.7:
        return {
            "status": "warning",
            "message": "多个模型回答不一致,可能存在幻觉风险",
            "answers": answers
        }
    return {
        "status": "ok",
        "answer": answers[0],
        "confidence": consistency
    }

策略4:RAG系统增强

class SecureRAG:
    """带幻觉检测的RAG系统"""
    
    def query(self, user_question):
        docs = self.retriever.search(user_question, top_k=5)
        
        answer = self.llm.generate(
            context=docs,
            question=user_question,
            prompt_template="请仅基于以下上下文回答问题,如果上下文不包含相关信息,请说'我不知道'"
        )
        
        faithfulness = self.verify_faithfulness(answer, docs)
        
        if faithfulness < 0.8:
            return "⚠️ 回答可能包含未经验证的信息,建议人工核实"
        
        return answer

五、课后思考

  1. 幻觉与创造力的权衡 有人认为幻觉是LLM创造力的副产品,完全消除幻觉是否意味着牺牲模型的创造性?

  2. 责任归属问题 如果用户因为相信AI的幻觉内容而遭受损失(如引用了虚假法条),责任应该由谁承担?

  3. 幻觉检测的悖论 如果我们用另一个LLM来检测幻觉,这个"检测器"本身是否也会产生幻觉?

  4. 你的实战经验 你在使用大模型时遇到过哪些印象深刻的幻觉案例?


明日预告:Day 3 - 训练数据投毒。当AI的"食物"被下毒,会发生什么?