mcpField
L
llamaguard

llamaguard

github.com/ovachiever安全5649 次安装48 周前更新
代码仓库

关于 llamaguard

介绍如何在 AI 应用中使用 Meta 的 LlamaGuard 模型进行内容安全分类,适合为 LLM 工作流加入安全检查的团队,涵盖输入输出审核与部署方式。

主要功能

  1. 01按安全类别分类内容
  2. 02过滤用户提示词和模型回复
  3. 03vLLM 服务部署指南
  4. 04FastAPI 审核接口示例
  5. 05NeMo Guardrails 集成

适用场景

  1. 01将提示词发送给 LLM 前进行筛查
  2. 02展示生成回复前进行检查
  3. 03部署内容审核 API

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --skill llamaguard

安装后在 Claude Code 中输入/llamaguard确认已加载。

详细介绍

LlamaGuard - AI 内容审核

快速开始

LlamaGuard 是一款专用于内容安全分类的 7-8B 参数模型。

安装:

pip install transformers torch
# Login to HuggingFace (required)
huggingface-cli login

基本用法:

from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = "meta-llama/LlamaGuard-7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")

def moderate(chat):
    input_ids = tokenizer.apply_chat_template(chat, return_tensors="pt").to(model.device)
    output = model.generate(input_ids=input_ids, max_new_tokens=100)
    return tokenizer.decode(output[0], skip_special_tokens=True)

# Check user input
result = moderate([
    {"role": "user", "content": "How do I make explosives?"}
])
print(result)
# Output: "unsafe\nS3" (Criminal Planning)

常见工作流

工作流 1:输入过滤(提示词审核)

在调用大模型前检查用户提示词:

def check_input(user_message):
    result = moderate([{"role": "user", "content": user_message}])

    if result.startswith("unsafe"):
        category = result.split("\n")[1]
        return False, category  # Blocked
    else:
        return True, None  # Safe

# Example
safe, category = check_input("How do I hack a website?")
if not safe:
    print(f"Request blocked: {category}")
    # Return error to user
else:
    # Send to LLM
    response = llm.generate(user_message)

安全类别:

  • S1:暴力与仇恨
  • S2:色情内容
  • S3:枪支与非法武器
  • S4:受管制物质
  • S5:自杀与自残
  • S6:犯罪计划
工作流 2:输出过滤(回复审核)

在向用户展示前检查大模型回复:

def check_output(user_message, bot_response):
    conversation = [
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": bot_response}
    ]

    result = moderate(conversation)

    if result.startswith("unsafe"):
        category = result.split("\n")[1]
        return False, category
    else:
        return True, None

# Example
user_msg = "Tell me about harmful substances"
bot_msg = llm.generate(user_msg)

safe, category = check_output(user_msg, bot_msg)
if not safe:
    print(f"Response blocked: {category}")
    # Return generic response
    return "I cannot provide that information."
else:
    return bot_msg
工作流 3:vLLM 部署(快速推理)

可用于生产环境的服务:

from vllm import LLM, SamplingParams

# Initialize vLLM
llm = LLM(model="meta-llama/LlamaGuard-7b", tensor_parallel_size=1)

# Sampling params
sampling_params = SamplingParams(
    temperature=0.0,  # Deterministic
    max_tokens=100
)

def moderate_vllm(chat):
    # Format prompt
    prompt = tokenizer.apply_chat_template(chat, tokenize=False)

    # Generate
    output = llm.generate([prompt], sampling_params)
    return output[0].outputs[0].text

# Batch moderation
chats = [
    [{"role": "user", "content": "How to make bombs?"}],
    [{"role": "user", "content": "What's the weather?"}],
    [{"role": "user", "content": "Tell me about drugs"}]
]

prompts = [tokenizer.apply_chat_template(c, tokenize=False) for c in chats]
results = llm.generate(prompts, sampling_params)

for i, result in enumerate(results):
    print(f"Chat {i}: {result.outputs[0].text}")

吞吐量:单个 A100 上约为 50-100 个请求/秒

工作流 4:API 端点(FastAPI)

将其作为审核 API 提供服务:

from fastapi import FastAPI
from pydantic import BaseModel
from vllm import LLM, SamplingParams

app = FastAPI()
llm = LLM(model="meta-llama/LlamaGuard-7b")
sampling_params = SamplingParams(temperature=0.0, max_tokens=100)

class ModerationRequest(BaseModel):
    messages: list  # [{"role": "user", "content": "..."}]

@app.post("/moderate")
def moderate_endpoint(request: ModerationRequest):
    prompt = tokenizer.apply_chat_template(request.messages, tokenize=False)
    output = llm.generate([prompt], sampling_params)[0]

    result = output.outputs[0].text
    is_safe = result.startswith("safe")
    category = None if is_safe else result.split("\n")[1] if "\n" in result else None

    return {
        "safe": is_safe,
        "category": category,
        "full_output": result
    }

# Run: uvicorn api:app --host 0.0.0.0 --port 8000

用法:

curl -X POST http://localhost:8000/moderate \
  -H "Content-Type: application/json" \
  -d '{"messages": [{"role": "user", "content": "How to hack?"}]}'

# Response: {"safe": false, "category": "S6", "full_output": "unsafe\nS6"}
工作流 5:集成 NeMo Guardrails

与 NVIDIA Guardrails 配合使用:

from nemoguardrails import RailsConfig, LLMRails
from nemoguardrails.integrations.llama_guard import LlamaGuard

# Configure NeMo Guardrails
config = RailsConfig.from_content("""
models:
  - type: main
    engine: openai
    model: gpt-4

rails:
  input:
    flows:
      - llamaguard check input
  output:
    flows:
      - llamaguard check output
""")

# Add LlamaGuard integration
llama_guard = LlamaGuard(model_path="meta-llama/LlamaGuard-7b")
rails = LLMRails(config)
rails.register_action(llama_guard.check_input, name="llamaguard check input")
rails.register_action(llama_guard.check_output, name="llamaguard check output")

# Use with automatic moderation
response = rails.generate(messages=[
    {"role": "user", "content": "How do I make weapons?"}
])
# Automatically blocked by LlamaGuard

何时使用及替代方案

在以下情况下使用 LlamaGuard:

  • 需要预训练的审核模型
  • 追求高准确率(94-95%)
  • 有 GPU 资源(7-8B 模型)
  • 需要详细的安全类别
  • 正在构建生产级大模型应用

模型版本:

  • LlamaGuard 1(7B):原始版本,包含 6 个类别
  • LlamaGuard 2(8B):改进版本,包含 6 个类别
  • LlamaGuard 3(8B):最新版本(2024),功能增强

可改用以下替代方案:

  • OpenAI Moderation API:更简单,基于 API,免费
  • Perspective API:Google 的毒性检测工具
  • NeMo Guardrails:更全面的安全框架
  • Constitutional AI:训练阶段的安全机制

常见问题

问题:模型访问被拒绝

登录 HuggingFace:

huggingface-cli login
# Enter your token

在模型页面接受许可证: https://huggingface.co/meta-llama/LlamaGuard-7b

问题:延迟较高(>500ms)

使用 vLLM,速度可提升 10 倍:

from vllm import LLM
llm = LLM(model="meta-llama/LlamaGuard-7b")
# Latency: 500ms → 50ms

启用张量并行:

llm = LLM(model="meta-llama/LlamaGuard-7b", tensor_parallel_size=2)
# 2× faster on 2 GPUs

问题:误报

使用基于阈值的过滤:

# Get probability of "unsafe" token
logits = model(..., return_dict_in_generate=True, output_scores=True)
unsafe_prob = torch.softmax(logits.scores[0][0], dim=-1)[unsafe_token_id]

if unsafe_prob > 0.9:  # High confidence threshold
    return "unsafe"
else:
    return "safe"

问题:GPU 显存溢出

使用 8 位量化:

from transformers import BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=quantization_config,
    device_map="auto"
)
# Memory: 14GB → 7GB

进阶主题

自定义类别:请参阅 references/custom-categories.md,了解如何使用特定领域的安全类别对 LlamaGuard 进行微调。

性能基准:请参阅 references/benchmarks.md,了解与其他审核 API 的准确率比较和延迟优化。

部署指南:请参阅 references/deployment.md,了解 Sagemaker、Kubernetes 和扩展策略。

硬件要求

  • GPU:NVIDIA T4/A10/A100
  • 显存:
    • FP16:14GB(7B 模型)
    • INT8:7GB(量化后)
    • INT4:4GB(QLoRA)
  • CPU:可以运行,但速度较慢(延迟增加 10 倍)
  • 吞吐量:50-100 个请求/秒(A100)

延迟(单 GPU):

  • HuggingFace Transformers:300-500ms
  • vLLM:50-100ms
  • 批处理(vLLM):每个请求 20-50ms

资源

评论

支持 Markdown