見出し画像

LINE BOTとLogic Appsで文脈理解型のChatGPT APIサービスを構築してプロンプトインジェクション対策を試したきづき

前回の続きです。LINEなど一般的なアプリで文脈理解型のロジックを組む場合の設計について興味がわき、実装してみた話です。採用技術はAzure Logic Appsです。従量課金で費用が発生しますが、検証としては微々たる額です。無料で行いたい場合は、Google App Script(GAS)などで構築する例が出回っていますので、そちらで試してみてください。

構築の流れ

LINE開発者アカウントの申請・登録から初期設定等

GASで行う手順とほぼ同じですが、今回はアクセストークンを短期に取得する方法にします。以下はアクセストークンを永続的に使用するものですので、うっかり流出させてしまわないように気を付けてください。

https://chatgpt-lab.com/n/n55257c082a9d

アクセストークンを短期的に取得するものにしたのは、単純にセキュリティの観点と、後続で使用するAzure Logic Appsテンプレートで、チャネルIDとクライアントシークレットが必要で、アクセストークンが不要だったためです。

Azure Logic Appsの構築

構築サンプルを知りたかったこともあり、こちらで公開されている情報を確認しながら、テンプレートを使用してデプロイします。その際にIDとシークレットが要求されますので、LINE側からコピペしておきます。


Messaging APIメニューから取得


デプロイしたテンプレートを基に作りやすく改修したのがこちら。LINEのトークン発行部分とChatGPT実行部分は別のアプリとし、HTTPエンドポイントでつなぎます。

テキスト以外に取り出す値がいくつか必要だったため、改修した部分は主にFor_Eachの部分です。プロパティが深かったため、first関数で一行のみ取得して変数に格納します。その際役に立つのがChatGPTでして、スキーマを伝えるだけで、意図した記述を回答してくれます。

ChatGPT実行部分の構築

前回参考にしたPower Automateを参考に実行部分を構築していきます。今回違うのは3点です。

  1. ユーザーの応答を待機しないため、質問の履歴を蓄積する必要がある
    別途ストレージに蓄積し、同一ユーザーからの質問の際に参照しなおします。今回はTable Storageに蓄積しました。

  2. LINEに回答を返す必要がある
    デプロイしたテンプレートに記述がありますので、流用します。

  3. プロンプトインジェクション対策をする
    今回のメインです。

1~2はループがない分前回よりシンプルなため、流れだけお見せします。
HTTP2はLINEに返信する際のアクションです。

プロンプトインジェクション対策を検証

プロンプトインジェクションとは、チャット画面からシステムに対して命令文を発行し、人格を上書きしてしまったり、秘密情報を抜き取ったりするなどの攻撃手法です。今のところのChatGPT APIはこの対策を自前で実装する必要がありますが、先日公開されたAzure Open APIではChat Markup Language(ChatML)の仕様となっており、ユーザーの質問領域から外に命令を出せないようになっています。近い将来にはChatGPT APIも強化されるのではないかとみています。

今回実装する対策は以下のURLを参考にし、大変勉強させていただきました。ChatML同様ユーザーの質問を特定の記述で挟み込む対策を施します。

ユーザーが上書きできないように指示する

対策した結果を見てみましょう。安易には破れないような気がしますね。心強い

これは。。。
堅牢なのではないでしょうか

一般ユーザーが利用するとして、システム側の観点では、意図したサービスを提供できるよう実装を強化する必要性が求められます。また、今回、文脈蓄積型のチャットボットのため、やり取りしたデータをストレージに格納しますが、いくら暗号化したとしても、サービスの提供者は何らかの方法でユーザーがやり取りしたメッセージ(質問と回答)を見ることができてしまいます
こうしたチャットボットサービスは「ユーザーの会話履歴を閲覧することについての利用規約」をしっかり確認した上で利用するのが望ましいですし、特定できる個人情報はうっかりでも出さないようにしたほうが良いですね。


この記事が気に入ったらサポートをしてみませんか?