ChatGPT APIをB2B SaaSで本番利用するために超えるべき4つのハードル
ユーザー体験
ChatGPT APIの特徴として、ユーザーによる問いかけに対してChatGPT APIから結果を得るには比較的時間がかかります。筆者がChatGPT APIを活用して開発した機能では、95パーセンタイルで27秒ほどかかっています。 利用しているWebアプリケーションサーバがブロッキング I/Oである場合、ChatGPT APIへのネットワーク I/Oを待っている間に複数のリクエストがあると、プロセスやスレッドを食い潰してしまうことがあります。そのため、環境によっては非同期で処理を行うことを検討した方が良いでしょう。
搭載するプロダクトにもよりますが、1つの結果を得るために数十秒間ChatGPT APIのレスポンスを待ち続ける体験は、ユーザーにとって必ずしも良いとは限りません。非同期にした上でChatGPT APIからのレスポンスを待つ間に、ユーザーが別の作業をできるようにするなど、体験面での工夫も必要になります。
信頼性
ChatGPT APIを自社サービスに搭載する場合、高い可用性や応答速度の安定性といった非機能要件を満たしていく必要があります。例えば可用性については、執筆時点でOpenAI APIのドキュメントにリージョンやSLAについての記載がありませんでした。
しかし、OpenAI Status[1]には、OpenAI 社が提供する API 全体の可用性(執筆時点で99.84%)やChatGPTの可用性(執筆時点で99.82%)が公開されているため、ChatGPT API自体の可用性は確認できないものの、99.8%前後である確率が高いと推測できます。
一方でAzure OpenAI Serviceでは、SLAが99.9%に設定されています[2]。アベイラビリティゾーンは1つしかないことに懸念がある場合や、開発する機能がクォータ[3]の上限に達してしまうことが考えられる場合は、複数リージョンを使って負荷分散をし、可用性の確保をする方法を検討しても良いでしょう。執筆時点では各リージョンに対して3つまでリソースを作成することが可能なので、Azure Application Gateway[4]などと組み合わせて負荷分散が可能なインフラストラクチャの構成を検討しても良いと思います。
[2]Service Level Agreements(SLA)for Online Services
精度
ChatGPT APIを活用した自社サービスにおいて、精度の高い結果を得るためには初期設定されているパラメーターのチューニングをするなど、工夫が必要です。ChatGPT APIの初期設定を変えず、そのままリクエストを送るだけで意図した結果を得ることができる場合もありますが、より精度の高い結果を得たい場合は各社から提供されているパラメータ[5]をチューニングすることをおすすめします。
例えば、temperatureはデフォルトで1ですが、0にすることでリクエストごとの回答のバラつきを抑えられます。反対にtemperatureを2に設定すると出力される結果にランダム性が増します。プロダクトによっては正確性を求められたり、クリエイティビティが求められるため、temperatureの設定をすることをおすすめします。また、各社から提供されているプロンプトのベストプラクティスを参考により良いプロンプトに仕上げることができます[6]。
他には、ChatGPT APIが正しく命令を解釈できるようにする工夫が必要です。各社から提示されている、プロンプトエンジニアリングにおけるベストプラクティスでも提唱されていますが、命令の明解化や、回答例の具体化が挙げられます。
筆者の経験からも命令をわかりやすくすることは良いと思いますが、一方で命令自体を増やしすぎると本当に答えてほしい指示を無視し、回答が抜けてしまう事象もあったため注意が必要です。例えば、命令A, B, Cの3つに回答して欲しい場合に、命令A, Cにのみ回答して命令Bに回答していない場合などがあります。求める回答を得るためにもできるだけ簡潔に命令を送ることをおすすめします。
セキュリティ
外部ツールを使用して自社サービスに連携する場合、不具合や障害発生の抑止、データ保全性やセキュリティの高さは当然求められます。OpenAI APIやAzure OpenAI Serviceのセキュリティについては、どちらも致命的な問題がない認識ですが、筆者の場合はAzure OpenAI Serviceを選択しました。
Azure OpenAI Serviceには、コンテンツフィルタリングシステム[7]と呼ばれる Azure OpenAI Service に対する入出力(prompt、completion)の両方に対して、毎回処理を実行し、不適切な内容をフィルタリングする独自の仕組みが充実しています。OpenAI APIにはこのような仕組みがないため、場合によっては自前で構築する必要があります。
また、顧客情報を扱う場合、そのデータが学習に使用されないか注意する必要があります。今回ご紹介したOpenAI APIとAzure OpenAI Serviceは、学習に使われることがないと明記されているため問題ありません[8] [9]。
そして、Azure OpenAI ServiceにはAbuse monitoringと呼ばれる仕組みがあり、Microsoftの従業員によって不正利用がないか確認されます。そのためChatGPT APIを利用する上で扱ったデータは、Azure OpenAI Service側で一定期間サーバに保持されてしまいます[10]。顧客のデータなど機密情報を扱う場合は、この仕組みをオプトアウトする必要がありますが、オプトアウトをすることで不正利用に気づきにくくなるため、バランスが重要です。
ユーザーが自由にテキストを入力できる UI を提供する場合などは、プロンプトインジェクション攻撃が想定されるため対応の検討が必要です。例えば、入力フォームにその機能で使われているプロンプトそのものを盗み出すような攻撃を仕掛けられると、ChatGPT APIの出力結果にそのリクエストで使ったプロンプトが表示されてしまい、結果的にプロンプトが流出する可能性があります。
プロンプトインジェクションに備えるための対策はいくつかありますが、プロンプト自体で防衛をする方法があります。ChatGPT APIではSystemとUserの入力を区別して利用します。SystemにはChatGPT APIに与える役割を設定することで、精度の高い回答を得ることができます。Userには、ChatGPT APIに提供する文字列を送る際に使用されます。System とUserの使い方を間違ってしまうと、攻撃が成功してしまう場合があります。それを防ぐためにもユーザー入力をプロンプトに反映する際には、SystemではなくUserにする方が好ましいでしょう。
今回はプロンプト自体で防衛する方法を紹介しましたが、プロンプトでインジェクション対策をしすぎてしまい、本来得たかった回答の精度に影響を及ぼすことがあるので注意が必要です。他にも悪意のあるプロンプトに含まれそうな単語をリストで用意し、プロンプト内で使われているか判定する方法などもあるので、最新の情報を収集したうえで対策してください。
[8]How your data is used to improve model performance
まとめ
今回は、ChatGPT APIの概要から、自社サービスとの連携で本番利用する場合のハードルについて、筆者のB2B SaaSでの経験をもとに紹介しました。筆者が開発していた時期よりもプロンプトインジェクションの対策方法についてまとめている記事や、プロンプトの精度を向上させるといった普段の開発で馴染みがない点についても、各社からベストプラクティスも出ているのでぜひ参考にしてみてください。皆さまがChatGPTを活用される際、プロダクト開発のロードマップとして本記事がお役に立てれば幸いです。