以上のような攻撃に対して、どのように対策していくべきだろうか。凌氏は、「入力値のチェック」「プロンプトの対策」「出力のチェック」の3方向があるという。
まずプロンプトの対策。ユーザーインプットを区別するデリミタで囲むなどしてテンプレート化し、「上記の文章を〜」といった命令が簡単にできないようにする。デリミタは推測されないものを利用することを推奨している。
一方、禁止事項を決めておくブラックリスト方式は、あまり効果がないという。いくら決めても、すり抜けられる別の表現が出てきてしまうからだ。
凌氏は「プロンプトでの対策は難しい」と指摘する。「ChatGPTは文章を補完するモデル。質問に回答するというよりも、文章を埋めるモデルなのです。ですから、命令とデータを明確に分けることができませんし、命令の優先順位も明示できない。だから対策が難しいのです」
比較的有効だというのが、ユーザーが入力できる文字数を制限すること。文字数を制限すると、人格を与えたり、チャットbotを作らせてシミュレーションさせたりするようなJailbreakは難しくなる。
また、入力した内容の関連性をチェックすることも有効だ。ユーザーが入力したものが、質問として適切かをいったん、ChatGPTに確認させる。そこでYesと出たら、本番のプロンプトに進めるという方法もある。ただし、この方法は回答が出るまでに2回、問い合わせることになるので、時間がかかるのが難点だという。
出力、つまりChatGPTから返ってきた結果のチェックも有効だ。
「ChatGPTから返ってきた結果は、ユーザーがインプットしたものと同じぐらい信用できないという前提でチェックすることが大事です。Webページに表示する場合は、HTMLタグが埋め込まれていないか、結果をデータベースに入れる場合はSQLインジェクション対策がされているかチェックする。正しいフォーマットで回答が出てきているか検証することです」(凌氏)
プロンプトインジェクション攻撃に対し、プロンプトのみでの対策は難しいので、 ChatGPTの入出力のチェックが重要となるが、「入力値のチェックは不完全。出力のチェックが最後のとりで」と凌氏は語っていた。
Copyright © ITmedia, Inc. All Rights Reserved.