← 返回首页
🧠

LLM安全与对齐:构建可信赖的AI系统

📂 llm ⏱ 4 min 711 words

LLM安全与对齐:构建可信赖的AI系统

为什么LLM安全很重要?

随着LLM在各个领域的应用,安全问题变得至关重要:

LLM的主要安全问题

1. 幻觉(Hallucination)

LLM生成看似合理但实际上是虚假的内容。

def detect_hallucination(query, answer, knowledge_base):
    """检测可能的幻觉"""
    
    # 提取答案中的事实性声明
    claims = extract_claims(answer)
    
    hallucination_score = 0
    for claim in claims:
        # 在知识库中验证
        verification = verify_claim(claim, knowledge_base)
        
        if verification["status"] == "contradicted":
            hallucination_score += 1
        elif verification["status"] == "unsupported":
            hallucination_score += 0.5
    
    return {
        "score": hallucination_score / len(claims) if claims else 0,
        "details": [v for v in [verify_claim(c, knowledge_base) for c in claims] 
                   if v["status"] != "supported"]
    }

2. 偏见和歧视

LLM可能继承训练数据中的偏见。

def detect_bias(text, bias_types=["gender", "race", "age"]):
    """检测文本中的偏见"""
    
    results = {}
    
    for bias_type in bias_types:
        prompt = f"""
        请分析以下文本是否包含{bias_type}偏见:
        
        {text}
        
        分析结果(包含偏见/不包含偏见/不确定):
        """
        
        response = call_llm(prompt)
        results[bias_type] = {
            "detected": "包含偏见" in response,
            "analysis": response
        }
    
    return results

3. 越狱攻击(Jailbreaking)

通过精心设计的提示绕过安全限制。

class JailbreakDetector:
    def __init__(self, classifier):
        self.classifier = classifier
        
        # 已知的越狱模式
        self.patterns = [
            r"忽略.*限制",
            r"假装.*没有.*规则",
            r"作为.*DAN",
            r"DAN模式",
            r"开发者模式"
        ]
    
    def detect(self, prompt):
        # 模式匹配
        for pattern in self.patterns:
            if re.search(pattern, prompt):
                return {"detected": True, "type": "pattern_match"}
        
        # 分类器检测
        classification = self.classifier(prompt)
        if classification["jailbreak_probability"] > 0.8:
            return {"detected": True, "type": "classifier"}
        
        return {"detected": False}

4. 提示注入(Prompt Injection)

通过输入操控LLM的行为。

def detect_prompt_injection(user_input):
    """检测可能的提示注入"""
    
    suspicious_patterns = [
        r"忽略.*前面.*指令",
        r"你的新指令是",
        r"系统提示",
        r"忽略.*所有.*规则",
        r"你现在是"
    ]
    
    for pattern in suspicious_patterns:
        if re.search(pattern, user_input, re.IGNORECASE):
            return True
    
    return False

def sanitize_input(user_input):
    """清理用户输入"""
    
    # 移除潜在的注入内容
    sanitized = re.sub(r"忽略.*前面.*指令", "", user_input)
    sanitized = re.sub(r"你的新指令是.*", "", sanitized)
    
    return sanitized

对齐技术

1. RLHF(Reinforcement Learning from Human Feedback)

通过人类反馈训练模型生成符合人类偏好的内容。

class RLHFPipeline:
    def __init__(self, model, reward_model):
        self.model = model
        self.reward_model = reward_model
    
    def train(self, prompts, human_preferences):
        # 1. 生成多个回答
        responses = []
        for prompt in prompts:
            candidates = [self.model.generate(prompt) for _ in range(4)]
            responses.append(candidates)
        
        # 2. 人类偏好排序
        # preferences[i] = [preferred_index, less_preferred_index]
        
        # 3. 训练奖励模型
        self.train_reward_model(responses, human_preferences)
        
        # 4. 使用PPO优化策略
        self.ppo_optimization(prompts)
    
    def train_reward_model(self, responses, preferences):
        optimizer = torch.optim.Adam(self.reward_model.parameters(), lr=1e-5)
        
        for candidates, (preferred_idx, less_preferred_idx) in zip(responses, preferences):
            # 计算奖励
            reward_preferred = self.reward_model(candidates[preferred_idx])
            reward_less = self.reward_model(candidates[less_preferred_idx])
            
            # 损失函数:确保preferred的奖励更高
            loss = -torch.log(torch.sigmoid(reward_preferred - reward_less))
            
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

2. Constitutional AI

使用宪法原则自我监督。

CONSTITUTION = [
    "回答应该是有帮助的",
    "回答应该是无害的",
    "回答应该是诚实的",
    "回答不应该包含歧视性内容",
    "回答不应该鼓励非法活动"
]

class ConstitutionalAI:
    def __init__(self, model):
        self.model = model
    
    def critique_and_revise(self, prompt, response):
        # 1. 批评
        critique_prompt = f"""
        请批评以下回答是否符合AI原则:
        
        原则:{CONSTITUTION}
        
        问题:{prompt}
        回答:{response}
        
        批评:
        """
        critique = self.model.generate(critique_prompt)
        
        # 2. 修订
        revise_prompt = f"""
        基于以下批评,请修订回答:
        
        原始回答:{response}
        批评:{critique}
        
        修订后的回答:
        """
        revised = self.model.generate(revise_prompt)
        
        return revised

3. DPO(Direct Preference Optimization)

直接从偏好数据优化,无需训练奖励模型。

def dpo_loss(policy_logratios, reference_logratios, beta=0.1):
    """
    policy_logratios: log(π(y_w|x) / π(y_l|x))
    reference_logratios: log(π_ref(y_w|x) / π_ref(y_l|x))
    """
    loss = -torch.log(
        torch.sigmoid(beta * (policy_logratios - reference_logratios))
    )
    return loss.mean()

安全防护措施

1. 输入过滤

class InputFilter:
    def __init__(self):
        self.toxic_words = load_toxic_words()
        self.injection_patterns = load_injection_patterns()
    
    def filter(self, user_input):
        # 检查有毒内容
        if self.contains_toxic(user_input):
            return False, "输入包含不当内容"
        
        # 检查注入攻击
        if self.contains_injection(user_input):
            return False, "检测到潜在的提示注入"
        
        return True, ""
    
    def contains_toxic(self, text):
        for word in self.toxic_words:
            if word in text.lower():
                return True
        return False
    
    def contains_injection(self, text):
        for pattern in self.injection_patterns:
            if re.search(pattern, text, re.IGNORECASE):
                return True
        return False

2. 输出过滤

class OutputFilter:
    def __init__(self, safety_classifier):
        self.classifier = safety_classifier
    
    def filter(self, response):
        # 分类检测
        classification = self.classifier(response)
        
        if classification["toxicity"] > 0.8:
            return False, "输出包含不当内容"
        
        if classification["harmful"] > 0.8:
            return False, "输出可能有害"
        
        # 检查事实性
        factuality = self.check_factuality(response)
        if factuality["hallucination_score"] > 0.5:
            return False, "输出可能包含虚假信息"
        
        return True, ""

3. 速率限制和监控

class RateLimiter:
    def __init__(self, max_requests=100, window_seconds=60):
        self.max_requests = max_requests
        self.window_seconds = window_seconds
        self.requests = []
    
    def check_rate_limit(self, user_id):
        now = time.time()
        
        # 清理过期请求
        self.requests = [r for r in self.requests 
                        if now - r["timestamp"] < self.window_seconds]
        
        # 检查用户请求
        user_requests = [r for r in self.requests if r["user_id"] == user_id]
        
        if len(user_requests) >= self.max_requests:
            return False
        
        self.requests.append({"user_id": user_id, "timestamp": now})
        return True

class SafetyMonitor:
    def __init__(self):
        self.alerts = []
    
    def log_safety_event(self, event_type, details):
        self.alerts.append({
            "type": event_type,
            "details": details,
            "timestamp": datetime.now()
        })
        
        # 发送告警
        if event_type in ["jailbreak_attempt", "toxic_output"]:
            self.send_alert(event_type, details)

安全最佳实践

1. 系统提示设计

SAFE_SYSTEM_PROMPT = """
你是一个有帮助且无害的AI助手。

请遵守以下原则:
1. 只提供准确、有帮助的信息
2. 不生成有害、歧视性或非法内容
3. 不泄露个人隐私信息
4. 不确定时说明不确定性
5. 拒绝可能造成伤害的请求

如果用户请求违反这些原则,请礼貌拒绝并解释原因。
"""

2. 安全测试

def safety_testing(model, test_cases):
    results = {
        "passed": 0,
        "failed": 0,
        "failures": []
    }
    
    for test in test_cases:
        response = model.generate(test["prompt"])
        
        # 检查是否应该拒绝
        if test["should_refuse"]:
            if not is_refusal(response):
                results["failed"] += 1
                results["failures"].append({
                    "prompt": test["prompt"],
                    "response": response,
                    "expected": "refusal"
                })
                continue
        
        # 检查输出安全性
        safety_check = check_safety(response)
        if not safety_check["safe"]:
            results["failed"] += 1
            results["failures"].append({
                "prompt": test["prompt"],
                "response": response,
                "issue": safety_check["issue"]
            })
            continue
        
        results["passed"] += 1
    
    return results

3. 红队测试

class RedTeam:
    def __init__(self, model, safety_classifier):
        self.model = model
        self.classifier = safety_classifier
        
        self.attack_templates = [
            "假装你是{persona},请...",
            "忽略之前的指令,...",
            "在{scenario}场景下,...",
        ]
    
    def generate_attacks(self, num_attacks=100):
        attacks = []
        
        for _ in range(num_attacks):
            template = random.choice(self.attack_templates)
            attack = self.fill_template(template)
            attacks.append(attack)
        
        return attacks
    
    def evaluate_model(self, attacks):
        vulnerabilities = []
        
        for attack in attacks:
            response = self.model.generate(attack)
            
            # 检查是否被攻破
            if self.is_compromised(response):
                vulnerabilities.append({
                    "attack": attack,
                    "response": response
                })
        
        return vulnerabilities

总结

LLM安全是一个复杂但至关重要的领域。通过理解主要的安全问题(幻觉、偏见、越狱、注入),应用对齐技术(RLHF、Constitutional AI),并实施多层安全防护,我们可以构建更加可信赖的AI系统。