ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #17 - LLM Guard」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
LLM Guard
今回は、LLMのセキュリティに関するOSS「LLM Guard」について、公式ドキュメントを読んだり動かしたりしてみました。
LLM GuardのGitHubリポジトリはこちらです。
今回のポイント
LLM Guardの概要
LLM Guardは、ProtectAI社が提供する、LLMの入力と出力に対するガードレールを提供するPythonライブラリです。
基本的な使い方は以下の公式サンプルコードを見ると分かります。
https://github.com/protectai/llm-guard/blob/main/examples/openai_api.py
たとえばLLMの入力のプロンプトをスキャンするときは、「Anonymize」「Toxicity」「TokenLimit」「PromptInjection」などのInput Scannerを用意して、scan_prompt(input_scanners, prompt)のようにスキャンを実行します。
スキャンを実行すると、各スキャナーの実行結果やサニタイズされたプロンプトを得ることができます。
from llm_guard.input_scanners import Anonymize, PromptInjection, TokenLimit, Toxicity input_scanners = [Anonymize(vault), Toxicity(), TokenLimit(), PromptInjection()] prompt = "<プロンプト>" sanitized_prompt, results_valid, results_score = scan_prompt(input_scanners, prompt)
LLMの出力に対するOutput Scannerも提供されており、Input Scannerと同じように使うことができます。
Input Scanner
LLM Guardが提供するInput Scannerは、公式ドキュメントにまとめられています。
Anonymize(匿名化)・Ban Competitors(競合他社の禁止)・Prompt InjectionやSecretsの検知などのScannerが提供されています。
Output Scanner
Output Scannerも公式ドキュメントにまとめられています。
Bias Detection(バイアス検知)・Deanonymize(匿名化の解除)・Toxicity(毒性)などのScannerが提供されています。
LLM GuardのInput Scanner・Output Scannerは、以下のPlaygroundで試すこともできます。
Anonymize・Deanonymize
様々なScannerのうち、Anonymize・Deanonymizeの組み合わせが特に面白かったので、少し紹介します。
たとえば以下のように、個人情報を含むプロンプトを使って、LLMにSQLを生成させるシーンを考えます。
prompt = (
"Make an SQL insert statement to add a new user to our database. Name is John Doe. Email is test@test.com "
"but also possible to contact him with hello@test.com email. Phone number is 555-123-4567 and "
"the IP address is 192.168.1.100. And credit card number is 4567-8901-2345-6789. "
"He works in Test LLC."
)
LLM GuardのAnonymizeというInput Scannerを使うと、以下のようにプロンプト内の氏名・メールアドレスといった情報を匿名化できます。 (一部うまく匿名化できていない箇所もあります)
Make an SQL insert statement to add a new user to our database. Name is [REDACTED_PERSON_1] Doe. Email is [REDACTED_EMAIL_ADDRESS_1] but also possible to contact him with [REDACTED_EMAIL_ADDRESS_2] email. Phone number is [REDACTED_PHONE_NUMBER_1] and the IP address is [REDACTED_IP_ADDRESS_1]. And credit card number is [REDACTED_CREDIT_CARD_RE_1]. He works in Test LLC.

このプロンプトに対して、OpenAIのAPIを使ってSQLを生成すると、以下のように匿名化された文字列でのSQLが得られます。
INSERT INTO users (name, email, alternate_email, phone_number, ip_address, credit_card_number, company)
VALUES ('[REDACTED_PERSON_1] Doe', '[REDACTED_EMAIL_ADDRESS_1]', '[REDACTED_EMAIL_ADDRESS_2]', '[REDACTED_PHONE_NUMBER_1]', '[REDACTED_IP_ADDRESS_1]', '[REDACTED_CREDIT_CARD_RE_1]', 'Test LLC');
このSQLに対してDeanonymize(匿名化の解除)というOutput Scannerを使うと、以下のSQLが得られます。
INSERT INTO users (name, email, alternate_email, phone_number, ip_address, credit_card_number, company)
VALUES ('John Doe', 'test@test.com', 'hello@test.com', '555-123-4567', '192.168.1.100', '4567-8901-2345-6789', 'Test LLC');
このように、LLM GuardのAnonymizeとDeanonymizeを使うことで、OpenAIのAPIに対して、氏名・メールアドレスといった情報を送信しないようにできた、ということです。
なお、LLM Guardのログを参照すると、氏名やメールアドレスなどの検出には固有表現抽出(NER)のモデルをダウンロードして使用しているようでした。
LLM GuardのAPI化
LLM GuardのInput Scanner・Output Scannerの多くは、HuggingFaceで公開されているモデルを使用します。
そのため、初回実行時にはモデルのダウンロードといった時間がかかる挙動になっており、実用する際には考慮が必要です。
たとえば、LLM Guardをライブラリとして使用する以外に、FastAPIでAPI化してデプロイする方法もまとめられています。
次回のご案内
以上、今回は「LLM Guard」をキャッチアップしました。
具体的なツールの使い方以上に、LLMアプリケーションへの攻撃手法やセキュリティ上の注意事項を知る情報源としてよかったです。
AIエージェントキャッチアップでは、しばらくはLLMアプリケーションのセキュリティに関するOSSを多めに扱いたいと思っています。
次回は「AIエージェントキャッチアップ #18 - Guardrails AI」ということで、ガードレールのPythonフレームワーク「Guardrails AI」がテーマです!
generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!