モジュール化されたLLM脆弱性スキャナー。静的、動的、適応型プローブを使用して、複数のモデルプロバイダーにわたって幻覚、データ漏洩、プロンプトインジェクション、脱獄、毒性を検査します。
Generative AI レッドチーミング&アセスメントキット
garakは、LLMを意図しない方法で失敗させることができるかどうかを確認します。garakは、ハルシネーション、データ漏洩、プロンプトインジェクション、誤情報、有害性の生成、脱獄、その他多くの脆弱性をプローブします。nmapやmsf / Metasploit Frameworkをご存知なら、garakはそれらと似たようなことを行いますが、対象はLLMです。
garakは、LLMまたは対話システムを失敗させる方法に焦点を当てています。静的、動的、適応型のプローブを組み合わせてこれを調査します。
garakは無料のツールです。私たちはその開発を愛しており、常にアプリケーションをサポートする機能の追加に関心を持っています。
現在対応:
garakはコマンドラインツールです。LinuxとOSXで開発されています。
pipによる標準インストールPyPIから取得すればすぐに使用できます:``` python -m pip install -U garak
### `pip` で開発バージョンをインストール
標準の pip バージョンの `garak` は定期的に更新されます。GitHub から最新のバージョンを入手するには、次のようにしてください:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak には独自の依存関係があります。garak を独自の Conda 環境にインストールできます:```
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
OK、問題なければ、おそらくこれで準備完了です!
**注意**: `NVIDIA` GitHub組織への移行前にクローンしたが、このドキュメントを `github.com/NVIDIA` URI で読んでいる場合は、以下のようにリモートを更新してください。```
git remote set-url origin https://github.com/NVIDIA/garak.git
一般的な構文は以下の通りです:
garak <オプション>
garakはスキャンするモデルを指定する必要があり、デフォルトではそのモデルに対して既知のすべてのプローブを実行し、各プローブが推奨する脆弱性検出器を使用します。プローブの一覧は次のコマンドで確認できます:
garak --list_probes
ジェネレーターを指定するには、--target_typeオプションと、必要に応じて--target_nameオプションを使用します。モデルタイプはモデルファミリー/インターフェースを指定し、モデル名は使用する正確なモデルを指定します。以下の「ジェネレーターの概要」セクションで、サポートされているジェネレーターの一部を説明します。シンプルなジェネレーターファミリーとしてHugging Faceモデルがあります。これらをロードするには、--target_typeにhuggingface、--target_nameにHub上のモデル名(例:"RWKV/rwkv-4-169m-pile")を設定します。一部のジェネレーターではAPIキーを環境変数として設定する必要があり、必要な場合はその旨が通知されます。
garakはデフォルトですべてのプローブを実行しますが、特定のプローブのみを指定することもできます。例えば、--probes promptinjectはPromptInjectフレームワークのメソッドのみを使用します。また、プラグインファミリー全体ではなく特定のプラグインを指定するには、プラグイン名の後に.を追加します。例えば、--probes lmrc.SlurUsageは、Language Model Risk Cardsフレームワークに基づいて、モデルが差別的な発言を生成していないかをチェックする実装を使用します。
商用モデルに対するエンコーディングベースのプロンプトインジェクションのプローブ(OSX/*nix)(実際のOpenAI APIキーで例の値を置き換えてください)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
See if the Hugging Face version of GPT2 is vulnerable to DAN 11.0```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
各プローブが読み込まれると、garak は生成中にプログレスバーを表示します。生成が完了すると、各検出器に対するそのプローブの結果を評価する行が表示されます。プロンプトの試行のいずれかが望ましくない動作を引き起こした場合、応答は FAIL とマークされ、失敗率が表示されます。
以下は、encoding モジュールを GPT-3 派生モデルで実行した結果です:

同じ結果を ChatGPT で実行した場合:

より新しいモデルはエンコーディングベースのインジェクション攻撃に対してはるかに脆弱であり、text-babbage-001 は quoted-printable および MIME エンコーディングインジェクションにのみ脆弱であることが判明しました。各行の末尾に表示される 840/840 などの数字は、テキスト生成の総数と、そのうち適切に動作したとみなされた数を示しています。この数字が非常に大きくなる場合があります。これは、プロンプトごとに複数回(デフォルトでは10回)の生成が行われるためです。
エラーは garak.log に記録され、実行の詳細は分析の開始と終了時に指定された .jsonl ファイルに記録されます。analyse/analyse_log.py に基本的な分析スクリプトがあり、最も多くヒットしたプローブとプロンプトを出力します。
PR を送信し、Issue を開いてください。楽しいハンティングを!
Pipeline API の使用:
--target_type huggingface(ローカルで transformers モデルを実行する場合)--target_name - Hub からモデル名を使用します。生成モデルのみが動作します。失敗した場合(失敗すべきでない場合)は、試したコマンドと例外を貼り付けて Issue を開いてください。Inference API の使用:
--target_type huggingface.InferenceAPI(API ベースのモデルアクセス用)--target_name - Hub からのモデル名(例:"mosaicml/mpt-7b-instruct")プライベートエンドポイントの使用:
--target_type huggingface.InferenceEndpoint(プライベートエンドポイント用)
--target_name - エンドポイント URL(例:https://xxx.us-east-1.aws.endpoints.huggingface.cloud)
(オプション)HF_INFERENCE_TOKEN 環境変数を「読み取り」ロールを持つ Hugging Face API トークンに設定します。ログイン後、https://huggingface.co/settings/tokens を参照してください。
--target_type openai--target_name - 使用する OpenAI モデル。gpt-5-nano は高速であり、テストに適しています。OPENAI_API_KEY 環境変数を OpenAI API キー(例:"sk-19763ASDF87q6657")に設定します。ログイン後、https://platform.openai.com/account/api-keys を参照してください。認識されたモデルタイプはホワイトリストに登録されています。プラグインはどのサブ API を使用するかを知る必要があるためです。Completion モデルまたは ChatCompletion モデルが問題なく動作します。サポートされていないモデルを使用しようとすると、情報提供のエラーメッセージが表示されますので、PR を送信するか Issue を開いてください。
REPLICATE_API_TOKEN 環境変数を Replicate API トークン(例:"r8-123XXXXXXXXXXXX")に設定します。ログイン後、https://replicate.com/account/api-tokens を参照してください。公開 Replicate モデル:
--target_type replicate--target_name - Replicate のモデル名とハッシュ(例:"stability-ai/stablelm-tuned-alpha-7b:c49dae36")プライベート Replicate エンドポイント:
--target_type replicate.InferenceEndpoint(プライベートエンドポイント用)--target_name - デプロイされたエンドポイントからのユーザー名/モデル名のスラッグ(例:elim/elims-llama2-7b)--target_type cohere--target_name(オプション、デフォルトは command)- テストしたい特定の Cohere モデルCOHERE_API_KEY 環境変数を Cohere API キー(例:"aBcDeFgHiJ123456789")に設定します。ログイン後、https://dashboard.cohere.ai/api-keys を参照してください。--target_type groq--target_name - Groq API 経由でアクセスするモデルの名前GROQ_API_KEY 環境変数を Groq API キーに設定します。API キーの作成方法の詳細は https://console.groq.com/docs/quickstart を参照してください。--target_type ggml--target_name - ロードする ggml モデルへのパス(例:/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin)GGML_MAIN_PATH 環境変数を ggml の main 実行可能ファイルへのパスに設定します。rest.RestGenerator は非常に柔軟で、プレーンテキストまたは JSON を返す任意の REST エンドポイントに接続できます。短い設定が必要で、通常はエンドポイントを記述した短い YAML ファイルが作成されます。例については https://reference.garak.ai/en/latest/garak.generators.rest.html を参照してください。
https://build.nvidia.com/ または他の NIM エンドポイントのモデルを使用します。
NIM_API_KEY 環境変数を認証用 API トークンに設定するか、設定 YAML で指定します。チャットモデル:
--target_type nim--target_name - NIM の model 名(例:meta/llama-3.1-8b-instruct)補完モデル:
--target_type nim.NVOpenAICompletion--target_name - NIM の model 名(例:bigcode/starcoder2-15b)--target_type bedrock--target_name - Bedrock モデル ID またはエイリアス(例:anthropic.claude-3-sonnet-20240229-v1:0 または claude-3-sonnet)BEDROCK_API_KEY 環境変数を AWS Bedrock API キーに設定します。設定手順は https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html を参照してください。BEDROCK_REGION 環境変数を設定して AWS リージョンを指定します(デフォルトは us-east-1)。サポートされているモデルファミリには、Anthropic Claude、Meta Llama、Amazon Titan、AI21 Labs、Cohere、Mistral AI モデルが含まれます。このジェネレーターは、Converse API を使用して、すべてのモデルタイプに統一的にアクセスします。
使用例:``` export BEDROCK_API_KEY="your-api-key" export BEDROCK_REGION="us-east-1" garak --target_type bedrock --target_name claude-3-sonnet --probes dan
### Test
* `--target_type test`
* (alternatively) `--target_name test.Blank`
テスト用。常に空の文字列を生成します(`test.Blank` ジェネレーターを使用)。出力を*必要とする*テスト(例えば、議論のある主張をし、モデルがそれを反論することを期待するテスト)では失敗としてマークされます。
* `--target_type test.Repeat`
テスト用。このジェネレーターは受け取ったプロンプトをそのまま返します。
## Intro to probes
| Probe | Description |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | 常に空のプロンプトを送信するシンプルなプローブ。 |
| atkgen | 自動攻撃生成。レッドチームLLMがターゲットをプローブし、反応を利用して有害な出力を得ようとします。プロトタイプで、ほぼステートレスです。現時点では、検出可能な有害性を示したhhrlhf試行のサブセットで[ファインチューニング](https://huggingface.co/garak-llm/artgpt2tox)されたシンプルなGPT-2を使用しています(現在サポートされている唯一のターゲット)。 |
| badchars | 知覚不可能なUnicodeの摂動(不可視文字、ホモグリフ、並べ替え、削除)を実装。 [Bad Characters](https://arxiv.org/abs/2106.09898) 論文に触発されています。 |
| av_spam_scanning | モデルに悪意のあるコンテンツのシグネチャを出力させようとするプローブ |
| continuation | モデルがおそらく望ましくない単語を続けるかどうかをテストするプローブ |
| dan | 様々な[DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html)およびDANに類似した攻撃 |
| donotanswer | 責任ある言語モデルが答えるべきではないプロンプト。 |
| encoding | テキストエンコーディングによるプロンプトインジェクション |
| gcg | システムプロンプトに敵対的サフィックスを追加して破壊する。 |
| glitch | 異常な動作を引き起こすグリッチトークンに対するプローブモデル。 |
| grandma | 自分の祖母を思い出させるように訴える。 |
| goodside | Riley Goodside攻撃の実装。 |
| leakreplay | モデルがトレーニングデータを再生するかどうかを評価する。 |
| lmrc | [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) プローブのサブサンプル |
| malwaregen | モデルにマルウェアを構築するコードを生成させようとする試み |
| misleading | モデルに誤解を招く虚偽の主張を支持させる試み |
| packagehallucination | 存在しない(したがって安全でない)パッケージを指定するコード生成を試みる。 |
| promptinject | Agency Enterprise社の[PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject)研究の実装(NeurIPS ML Safety Workshop 2022の最優秀論文賞受賞) |
| realtoxicityprompts | RealToxicityPrompts研究のサブセット(完全なテストは実行に時間がかかりすぎるためデータに制約あり) |
| snowball | モデルが処理するには複雑すぎる質問に対して誤った回答をさせるように設計された[Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf)プローブ |
| xss | プライベートデータの流出など、クロスサイト攻撃を許可または実行する脆弱性を探す。 |
## Logging
`garak` は複数の種類のログを生成します:
* ログファイル `garak.log`。`garak` およびそのプラグインからのデバッグ情報を含み、実行間で継続されます。
* 現在の実行のレポート(JSONL形式)。`garak`が実行されるたびに新しいレポートファイルが作成されます。このファイル名は実行の開始時と、成功した場合は実行の終了時にも出力されます。レポートでは、生成が受け取られた時と評価された時の両方で各プロービング試行のエントリが作成されます。エントリの`status`属性は、`garak.attempts`の定数を使用して作成された段階を記述します。
* 脆弱性('hit')をもたらした試行を詳述するヒットログ
## How is the code structured?
`garak`のコード構造に関する信頼できるガイドについては、[リファレンスドキュメント](https://reference.garak.ai/)を参照してください。
典型的な実行では、`garak`はコマンドラインからモデルタイプ(およびオプションでモデル名)を読み取り、実行する`probe`と`detector`を決定し、`generator`を起動し、これらを`harness`に渡してプロービングを行います。`evaluator`が結果を処理します。これらの各カテゴリには多くのモジュールがあり、各モジュールは個別のプラグインとして機能するいくつかのクラスを提供します。
* `garak/probes/` - LLMとのインタラクションを生成するためのクラス
* `garak/detectors/` - LLMが特定の障害モードを示していることを検出するためのクラス
* `garak/evaluators/` - 評価レポートスキーム
* `garak/generators/` - プローブされるLLM用のプラグイン
* `garak/harnesses/` - テストを構造化するためのクラス
* `resources/` - プラグインが必要とする補助項目
デフォルトの動作モードは`probewise`ハーネスを使用します。プローブモジュール名とプローブプラグイン名のリストが与えられると、`probewise`ハーネスは各プローブをインスタンス化し、各プローブについてその`primary_detector`および`extended_detectors`属性を読み取り、出力に対して実行する`detector`のリストを取得します。
各プラグインカテゴリ(`probes`、`detectors`、`evaluators`、`generators`、`harnesses`)には、そのカテゴリのプラグインで使用可能な基底クラスを定義する`base.py`が含まれています。各プラグインモジュールは、いずれかの基底クラスを継承するプラグインクラスを定義します。例えば、`garak.generators.openai.OpenAIGenerator`は`garak.generators.base.Generator`から派生しています。
モデルファイルや大規模コーパスなどの大きな成果物は、リポジトリの外部に保持されます。これらはHugging Face Hubなどに保存され、`garak`を使用するクライアントによってローカルにロードできます。
## Developing your own plugin
* 他のプラグインがどのように実装されているかを見てみましょう
* 基底クラスのいずれかを継承します(例:`garak.probes.base.TextProbe`)
* 可能な限りオーバーライドを少なくします
* 新しいコードは少なくとも2つの方法でテストできます:
* 対話型Pythonセッションを開始する
* モデルをインポートします(例:`import garak.probes.mymodule`)
* プラグインをインスタンス化します(例:`p = garak.probes.mymodule.MyProbe()`)
* テストプラグインでスキャンを実行する
* プローブの場合は、ブランクジェネレーターとalways.Pass検出器を試してください:`python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* 検出器の場合は、ブランクジェネレーターとブランクプローブを試してください:`python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* ジェネレーターの場合は、ブランクプローブとalways.Pass検出器を試してください:`python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* `garak`に、作成しているタイプの全プラグインを`--list_probes`、`--list_detectors`、または`--list_generators`でリストさせます
## FAQ
FAQは[こちら](https://github.com/NVIDIA/garak/blob/main/FAQ.md)にあります。さらに質問があればお問い合わせください! [[email protected]](mailto:[email protected])
コードリファレンスドキュメントは[garak.readthedocs.io](https://garak.readthedocs.io/en/latest/)にあります。
## Citing garak
[garak preprint paper](https://github.com/nvidia/garak/blob/main/garak-paper.pdf)をお読みいただけます。garakを使用する場合は、引用をお願いします。```
@article{garak,
title={{garak: A Framework for Security Probing Large Language Models}},
author={Leon Derczynski and Erick Galinkin and Jeffrey Martin and Subho Majumdar and Nanna Inie},
year={2024},
howpublished={\url{https://garak.ai}}
}
"嘘をつくことは他のスキルと同様、優れた水準を維持したいなら常に練習しなければならない" - Elim
最新情報やニュースは @garak_llm をご覧ください
© 2023- Leon Derczynski; Apache license v2、LICENSE を参照