llamaguard について
LlamaGuardは、AI会話のコンテンツ安全性を分類する7~8Bパラメーターのモデルです。定義済みの安全カテゴリに基づき、入力プロンプトと生成応答の両方を判定でき、LLMアプリの開発に利用できます。
主な機能
- 01プロンプトと応答の安全性分類
- 026種類の安全カテゴリ
- 03vLLMによるサービング
- 04FastAPIエンドポイントとしての公開
- 05NeMo Guardrailsとの連携
活用シーン
- 01LLMに渡す前のユーザープロンプトの検査
- 02表示前のモデル応答の確認
- 03コンテンツモデレーションAPIの運用
- 04NeMo Guardrailsへのモデレーション追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --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: 入力フィルタリング(プロンプトのモデレーション)
LLM に渡す前にユーザープロンプトをチェック:
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: 出力フィルタリング(レスポンスのモデレーション)
ユーザーに表示する前に LLM のレスポンスをチェック:
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 モデル)
- 詳細な安全性カテゴリが必要な場合
- 本番環境の LLM アプリを構築している場合
モデルのバージョン:
- 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
問題: 誤検知(False positive)
しきい値ベースのフィルタリングを使用:
# 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 でメモリ不足(OOM)
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
応用トピック
カスタムカテゴリ: ドメイン固有の安全性カテゴリで LlamaGuard をファインチューニングする方法は references/custom-categories.md を参照してください。
パフォーマンスベンチマーク: 他のモデレーション API との精度比較とレイテンシ最適化については references/benchmarks.md を参照してください。
デプロイガイド: Sagemaker、Kubernetes、スケーリング戦略については references/deployment.md を参照してください。
ハードウェア要件
- GPU: NVIDIA T4/A10/A100
- VRAM:
- FP16: 14GB(7B モデル)
- INT8: 7GB(量子化)
- INT4: 4GB(QLoRA)
- CPU: 可能だが低速(10 倍のレイテンシ)
- スループット: 50〜100 req/sec(A100)
レイテンシ(単一 GPU):
- HuggingFace Transformers: 300〜500ms
- vLLM: 50〜100ms
- バッチ処理(vLLM): リクエストあたり 20〜50ms
リソース
- HuggingFace:
- 論文: https://ai.meta.com/research/publications/llama-guard-llm-based-input-output-safeguard-for-human-ai-conversations/
- 統合: vLLM、Sagemaker、NeMo Guardrails
- 精度: 94.5%(プロンプト)、95.3%(レスポンス)