mcpField
L
llamaguard

llamaguard

github.com/kalarislabsその他7344 回インストール4 日前に更新
リポジトリ

llamaguard について

llamaguardは、MetaのLlamaGuardモデルでコンテンツの安全性を分類するスキルです。プロンプトと応答のフィルタリング、APIとしてのデプロイ、vLLMやNeMo Guardrailsとの利用方法を扱います。

主な機能

  1. 01入力プロンプトの安全性分類
  2. 02モデル応答の安全性分類
  3. 036種類の安全カテゴリ
  4. 04FastAPIによるAPI提供
  5. 05vLLMでのデプロイ

活用シーン

  1. 01リクエストをLLMに渡す前の確認
  2. 02生成内容を表示する前の審査
  3. 03コンテンツ審査APIの構築
  4. 04LlamaGuardをNeMo Guardrailsで利用

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kalarislabs/research-agent-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

問題:誤検知

しきい値ベースのフィルタリングを使用します:

# 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
  • VRAM:
    • FP16:14GB(7B モデル)
    • INT8:7GB(量子化)
    • INT4:4GB(QLoRA)
  • CPU:利用可能ですが、低速です(レイテンシーが 10 倍)
  • スループット:50~100 リクエスト/秒(A100)

レイテンシー(単一 GPU):

  • HuggingFace Transformers:300~500ms
  • vLLM:50~100ms
  • バッチ処理(vLLM):リクエストあたり 20~50ms

リソース

エージェントの運用手順

  1. 環境を確認します。 モデル、チェックポイント、ベンチマークのバージョン、評価ハーネスのバージョンを確認します。
  2. 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
  3. まず小規模に実行します。 小さなサブセットで評価し、プロンプト、解析、スコアリングを検証します。
  4. 上記の手順と参照情報を使用して、タスク全体を実行します。
  5. 結果を検証します。 ベンチマークの公式な分割とメトリクスを使用し、汚染がないか確認します。シードやプロンプトによるばらつきを報告します。
  6. 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、まだ不確かな点を記載します。
次の状況が発生した場合次の対応
公開済みの数値とスコアが異なる結論を出す前に、プロンプトの形式、少数例の設定、ハーネスのバージョンを確認します。
これらの手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンにないインストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して適宜対応し、ユーザーに伝えます。API を決して捏造しないでください。
必須の入力、識別子、パラメーターが曖昧ユーザーに確認するか、実行前に仮定を明示します。

誠実性に関するルール

  • 結果、パラメーター、識別子、引用、統計情報を決して捏造しないでください。実行または検証できない場合は、その旨を率直に伝えます。
  • 評価設定をすべて報告し、都合のよいプロンプト、シード、サブセットだけを選んで報告しないでください。
  • ここに記載されているバージョン固有の詳細は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認します。
  • 費用が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データに触れる、または元に戻せない操作を行う前に、確認を求めます。

関連スキル

  • prompt-guard:HuggingFace から読み込む Meta の Prompt Guard(パラメーター数 86M のモデル)を使ってテキストを分類し、BENIGN、INJECTION、JAILBREAK のラベルを付与します。詳細は…
  • nemo-guardrails:Colang 2.0 フローを通じて設定する NVIDIA NeMo Guardrails で、LLM アプリケーションにランタイムの安全策を追加します。
  • serving-llms-vllm:vLLM の PagedAttention と連続バッチ処理を使用して、高スループットで LLM をサービングします。

コメント