プロンプトインジェクション検知の精度は言語によって変わるのか?6言語・6000文で検証してみた
はじめに
以前、ルールベース+自作TF-IDFのハイブリッド方式で、ローカル完結型のプロンプトインジェクション検知CLIツールを作りました。ただし文脈依存の遠回しな攻撃に弱く(Recall 80%)、多言語対応も難しいという課題が残っていました。
そこで、「そもそも検知の精度は、使う言語によって差が出るのではないか」という仮説を検証してみました。低リソース言語(学習データが少ない言語)だとAIの安全策がすり抜けられやすい、という先行研究があり、それがプロンプトインジェクション検知の文脈でも起きるのかを確かめるのが目的です。
高校生が夏休みの自由研究くらいで適当にやったことなんでなんの学術的価値もないですね。
コードとデータは全てGitHubに公開しています。
仮説
低リソース言語(今回はズールー語)で書かれた攻撃文は、英語や主要な高リソース言語で書かれた同じ内容の攻撃文よりも、検知モデルにすり抜けられやすい。
実験方法
テストデータ
英語で1000文(攻撃文500・安全文500)を作成し、6言語(英語・日本語・中国語・ズールー語・スワヒリ語・ポルトガル語)に翻訳して、合計6000文のテストセットを作りました。
| カテゴリ | 内容 | 文数 |
|---|---|---|
| direct_override | 直球型の指示上書き攻撃(例: 「これまでの指示を無視して〜」) | 170 |
| roleplay_jailbreak | ペルソナ乗っ取り型の攻撃(例: 「制限のないAI『DAN』を演じて」) | 170 |
| indirect_context | 物語・翻訳依頼などに偽装した遠回し型の攻撃 | 160 |
| safe_suspicious | 攻撃文と紛らわしい単語(override, ignore, bypassなど)を含むが無害な文 | 250 |
| safe_neutral | 攻撃と無関係などく普通の文 | 250 |
英語1000文は、型(テンプレート)に差し替え語を組み合わせて機械的に生成しました。手作業で1000文書くと後半どうしても表現が偏るため、量を確保しつつバリエーションを保つための工夫です。翻訳は無料のdeep-translator(Google翻訳)を使用しました。
なお、これに先立って手作業で作った100文(600文/6言語)のパイロット実験も行っており、本番実験(別の生成方法・10倍の規模)でもほぼ同じ傾向が再現されたことは、後述する結果が偶然でないことの裏付けになっています。
検知モデル
無料でダウンロードできるprotectai/deberta-v3-small-prompt-injection-v2(Apache-2.0ライセンス)を使いました。有料APIは使っていません。
このモデルはベースモデルのmicrosoft/deberta-v3-smallが英語専用の語彙・トークナイザーで学習されています。つまりこのモデル自体、多言語対応を想定して作られていません。ただこれは実運用されている多くのガードレールモデルにも共通する制約で、「英語中心に作られた安全対策が非英語入力でどう振る舞うか」を見ること自体が今回の目的と合致すると考え、そのまま採用しました。 結果も出やすそうだし
評価指標
- 検知率(Recall) = 攻撃文のうち、正しく「攻撃」と判定できた割合
- 誤検知率(FPR) = 安全な文のうち、誤って「攻撃」と判定してしまった割合
結果
言語別
| 言語 | 検知率 (Recall) | 誤検知率 (FPR) |
|---|---|---|
| ポルトガル語 | 99.2% | 65.6% |
| 日本語 | 97.2% | 20.6% |
| 英語 | 93.6% | 2.8% |
| 中国語 | 92.0% | 21.6% |
| スワヒリ語 | 39.0% | 12.0% |
| ズールー語 | 27.2% | 1.2% |
カテゴリ別
| カテゴリ | 検知率 / 誤検知率 |
|---|---|
| direct_override | Recall 71.4% |
| indirect_context | Recall 77.6% |
| roleplay_jailbreak | Recall 75.3% |
| safe_neutral | FPR 10.3% |
| safe_suspicious | FPR 31.0% |
考察
低リソース言語(スワヒリ語・ズールー語)では検知率が3〜4割程度にとどまり、攻撃文の6〜7割が見逃されていました。これは最初の仮説を支持する結果です。
ただ、失敗の仕方が言語によって違いました。
- スワヒリ語・ズールー語: 攻撃を見逃す方向に失敗(Recallが低い)
- ポルトガル語: 逆に、安全な文まで攻撃と誤判定する方向に失敗(Recallは高いがFPRも非常に高い)
つまり「非英語は全部ダメ」という単純な話ではなく、言語ごとに壊れ方が異なるという発見でした。
カテゴリ別では、紛らわしい安全文(safe_suspicious)の誤検知率が、無関係な安全文(safe_neutral)の3倍以上ありました。「override」「ignore」のような単語を含むだけで安全な文が誤検知されやすいことが確認できました。
限界・今後の課題
- 検知モデルが1つ(英語専用ベース)のみで、多言語対応をうたうモデルとの比較ができていない
- 翻訳の品質を人手で検証していない(特にズールー語・スワヒリ語)私は英語の文が正しく翻訳されてるかどうかすらわかんないくらい語学スキルが低いのよ
- 英語の元文はテンプレート生成のため、自然な文章としての多様性は手作業データに劣る可能性がある
おわりに
わからん...難しすぎるよ...
Claude使いながらやってみたものの、肝心なテストケースが正しいかどうかすらわからないというクソクオリティ。
まあ英語向けのものは他の言語に弱い←当たり前 を確かめられた(?)し、なんだかんだ楽しかったからいいです。
これを見てる知識のある大人の人は、こういうことしろよ!これじゃだめだろ!ば~か!と強い口調で教えてください
