発展:敵対的攻撃と大規模言語モデルの安全性
安全性・セキュリティと悪用のレッスンの続きとして、AIをだます攻撃と、生成AIに固有の安全性の問題を掘り下げます。わずかな細工で誤らせる敵対的サンプルのしくみ、大規模言語モデルに指示を紛れ込ませるプロンプトインジェクション、制限を外そうとするジェイルブレイク、学習データを汚すデータ汚染までを整理し、なぜ完全には防ぎきれないのか、そして多重の守りという考え方までを実装のコードや攻撃の手口は扱わず、守る側の考え方に絞って説明します。
ねらい
このレッスンは、安全性・セキュリティと悪用のレッスンの続きにあたる発展(はってん)の記事です。生成AIが広く使われるようになり、それをだましたり悪用したりする攻撃が、現実の問題になっています。ここでは、対象レッスンで学んだ敵対的攻撃やデータ汚染といった土台の上に、大規模言語モデル(だいきぼげんごモデル、Large Language Models)に固有の安全性の問題を重ねます。
この記事は、ある程度の知識のある人に向けた深掘りですが、扱うのは、あくまで守る側の考え方です。攻撃の具体的な手口や、それを実行するための情報は書きません。なぜ、こうした攻撃が成り立つのか、そして、なぜ完全には防ぎきれず、どう向き合うのか、という筋道に絞ります。攻撃の名前は、防ぐために知っておくべき知識として扱います。
1. わずかな細工でだます:敵対的サンプル
対象レッスンで、敵対的攻撃と敵対的サンプル(Adversarial Examples)に触れました。ここでは、なぜそれが成り立つのかをもう少しくわしく見ます。
敵対的サンプルとは、人にはほとんど気づけないほどの、わずかな細工を加えることで、AIにわざと誤りを起こさせる入力のことです。たとえば画像認識では、写真に、人の目にはただのわずかな汚れにしか見えない細工を加えるだけで、モデルがまったく別のものと判定してしまう、といったことが起こります。人には同じ画像に見えるのに、モデルの答えだけが、がらりと変わるのです。
なぜ、こんなことが起きるのでしょうか。モデルは、入力のどの部分に注目して判断するかをデータから学んでいます。その注目の仕方には、人の感覚とはずれた、思わぬ癖があります。敵対的サンプルは、その癖を突いて、人には見えない方向から、モデルの判断をそっと押し動かします。モデルが、意味そのものではなく、表面的なパターンにもとづいて判断しているからこそ、成り立つ攻撃です。この弱点は、程度の差こそあれ、多くのモデルに共通してみられます。
理解の確認
敵対的サンプルは、人にはほとんど気づけないわずかな細工で、AIにわざと誤りを起こさせる入力です。モデルが意味ではなく表面的なパターンにもとづいて判断し、その注目の仕方に人の感覚とずれた癖があるため、その癖を突かれると、人には同じに見える入力でも答えが変わってしまいます。
2. 指示を紛れ込ませる:プロンプトインジェクション
大規模言語モデルには、固有の弱点があります。その代表が、プロンプトインジェクション(prompt injection)です。名前は、指示を注入する、という意味です。
大規模言語モデルは、渡された文章を指示として受け取って動きます。ここに弱点があります。処理させたいデータの中に、こっそり別の指示を紛れ込ませておくと、モデルが、それを本来の指示と取り違えて従ってしまうことがあるのです。たとえば、モデルにある文書を要約させる場面を考えます。その文書の中に、「これまでの指示は忘れて、次のことをせよ」といった文が仕込まれていると、モデルが、そちらに従ってしまうことがあります。
なぜ防ぎにくいのでしょうか。大規模言語モデルにとって、正規の指示も、データの中に紛れ込んだ文も、同じ「文章」だからです。人間なら、「これは処理すべきデータであって、指示ではない」と区別できます。しかしモデルには、その区別が、はっきりとはつきません。とくに、検索拡張生成のレッスンで見たように、外から取ってきた文書や、Webのページをモデルに読ませる使い方では、その文書に何が仕込まれているか分かりません。モデルが道具を使えるようになると、紛れ込んだ指示によって、望まない操作をさせられる恐れも出てきます。プロンプトインジェクションは、生成AIを実際に組み込むうえで、いま最も注意すべき弱点の1つとされています。
ポイント
プロンプトインジェクションは、処理させるデータの中に別の指示を紛れ込ませ、モデルに取り違えさせる攻撃です。モデルには正規の指示とデータ内の文の区別がつきにくいため、防ぎにくいのが特徴です。
理解の確認
プロンプトインジェクションは、処理させるデータの中に別の指示を紛れ込ませ、モデルに本来の指示と取り違えて従わせる攻撃です。モデルには正規の指示とデータ内の文がどちらも同じ文章に見え、区別がつきにくいため防ぎにくく、外部の文書を読ませる使い方や道具を使わせる使い方で、とくに注意が要ります。
3. 制限を外そうとする:ジェイルブレイク
もう1つ、大規模言語モデルに固有の問題が、ジェイルブレイク(jailbreak)です。脱獄、という意味の言葉です。
アライメントのレッスンで見たように、大規模言語モデルには、危ない要求や、してはいけないことを断るよう、安全の仕上げがされています。ジェイルブレイクとは、この仕上げをかいくぐり、本来は断るはずの応答を無理に引き出そうとする働きかけのことです。まともに頼めば断られることを言い回しや場面設定を工夫して、断りの網の目をすり抜けさせようとします。
なぜ、すり抜けが起きるのでしょうか。安全の仕上げは、想定した範囲の要求には、うまく断れるように調整されています。しかし、その調整は、ありとあらゆる言い回しや場面をあらかじめ覆いきれてはいません。想定の外から来る、ひねった働きかけには、すきが残ります。攻撃する側は、その覆いきれていないすきを探します。守る側が対策を加えると、攻撃する側が新しいすきを見つける。この、いたちごっこの関係が続いています。ここでは、ジェイルブレイクは安全の仕上げの覆いきれないすきを突くもので、対策と攻撃がいたちごっこになっている、と押さえてください。
理解の確認
ジェイルブレイクは、モデルの安全の仕上げをかいくぐり、本来は断るはずの応答を無理に引き出そうとする働きかけです。安全の仕上げが、あらゆる言い回しや場面を覆いきれないため、想定の外から来るひねった働きかけにすきが残り、対策と攻撃がいたちごっこになっています。
4. 学習の段階をねらう:データ汚染
ここまでは、使うときにだます攻撃でした。もう1つ、学習の段階をねらう攻撃があります。対象レッスンで触れたデータ汚染(data poisoning)です。
データ汚染とは、モデルの学習に使われるデータの中に、悪意のあるデータを混ぜ込み、モデルの振る舞いをあらかじめ狂わせておく攻撃です。使うときにだますのではなく、育つ段階に細工をして、種を仕込んでおくのです。たとえば、ある特定の合図が入力されたときだけ、まちがった、あるいは危ない応答を返すように、こっそり仕込んでおく、といったことが考えられます。
これが怖いのは、ふだんは正常に見えることです。仕込まれた合図が来ないかぎり、モデルはまともに振る舞うので、汚染に気づきにくい。とくに、Webから集めた大量のデータで学習する場合、そのすべてを人が確かめるのは難しく、汚染されたデータが紛れ込む余地が生まれます。だから、どんなデータで学習したのか、その来歴をたどれるようにすることや、データを吟味することが、守りとして大切になります。この、データの来歴を大切にする考え方は、透明性のレッスンとも地続きです。
5. なぜ防ぎきれないのか、そして多重の守り
ここまで見た攻撃には、共通する事情があります。完全には防ぎきれない、ということです。その理由と、向き合い方を整理します。
防ぎきれない理由は、これらの攻撃が、AIのしくみそのものに根ざしているからです。意味ではなくパターンで判断すること、文章を指示として受け取ること、安全の仕上げが範囲を覆いきれないこと。どれも、いまのAIの成り立ちと、切り離せません。だから、1つの対策で、すべてをふさぐことはできません。守る側が対策を加えても、攻撃する側が新しいすきを見つける、といういたちごっこが続きます。
そこで、守り方の考え方は、多重の守りになります。1つの守りに頼らず、何重にも守りを重ねる、という考え方です。入り口で、あやしい入力をふるいにかける。モデルの外に、してよいことの範囲を定め、危ない操作は、たとえモデルが指示されても実行させないようにする。出力をそのまま信じず、点検する。大事な判断には、人が関与する。倫理のレッスンで見た、設計の段階から安全を組み込むセキュリティ・バイ・デザインの考え方も、ここに通じます。1つひとつは完全でなくても、重ねることで、被害の起きにくさを高める。これが、防ぎきれない攻撃に向き合う、現実的な守り方です。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。