サーバーサイドエンジニアの@YusukeIwakiです。
巷ではChatGPTがすっかり賑わっていますね。多くの会社でチャットボットが導入されているのを横目に見て、私たちの開発組織でも Azure OpenAI Service を使ってボットを作ってみました。
世の中のブログ記事を見ると、「こんなボット作ったよ(ドヤ)」という部分については比較的多く共有されているいっぽうで、「これを作るまでにはこんな苦労があったよ」という部分については積極的には発信されていない印象があります。
この記事では、後者の部分をしっかり伝えられるよう心がけて書いてみました。
導入したもの
ともあれ最初に最終成果物を見てもらったほうがイメージが付きやすいので、紹介しちゃいます。
Azure OpenAI Serviceをバックエンドにしたチャットボットで、構成自体はありきたりです。
1点工夫したところがあって、会社のチャットツールであるMicrosoft Teamsの会話スレッドごとに、ボットの文脈を切り替えられるようにしています。
こうすることで、ある人がカスタマーサポートの文言をAIに書かせている傍らで、別の人がAppleのMDMの仕様をAIに聞くなど、自然なやりとりを実現できています。
この構成に至るまでの試行錯誤
ここからが本題です。組織のみんなが積極的に使うようになった現在のチャットボットに至るまでの試行錯誤を、できる限り紹介していきます。
Phase1: プライベートメッセージでチャットボットと話せる
最初期は、スレッドで会話する機能がありませんでした。
Teamsチャット欄でボットに話しかけると、返ってくる方式です。
この構成で発生した問題点
想像に難くないですが、他の人がボットとどんな会話をしているのかわからないので、「うまい使い方がわからない」という問題が普通に発生しました。
この頃はまだ部内ではなく一部の興味ある人達だけで使っていましたが、それでもこのような問題があらわになったことから、個別チャットボットでは全体共有すると絶対に活用できない確信がありました(苦笑)
次の一手
まずはスレッド上で会話できるようにしました。
Phase2: スレッド上でチャットボットにメンションして会話できるようにする
これは簡単そうに見えて、Microsoft Teamsでは非常に難しい面倒な作業でした。
実装の詳しくはこちらを参照されてください。リファレンスをあちこち読み漁って、組織内部用Teamsアプリのようなものを作って、情シス(Teams管理者)に承諾してもらう必要があります。
ここまで来ると、他人の活用事例が見えるようになります。Open AIで学習データ利用されることから、業務知識は食わせてはならない!などいくつかの注意点を組織内で共有の上、みんなで使い始めてみました。
こんな感じで活用するメンバーが現れ始めました。
この構成で発生した問題点
Phase1の個別チャットボットのときにも起きていたのですが、「話しかけたのに回答が返ってこない」というのをみんな気にし始めました。
次の一手
Azure App Serviceのコールドスタート問題は、どうも無料プランだと酷いらしいということが(なんとなく)わかり、課金を開始することにしました。ビバ札束解決。
あとは、質問内容を受け付けたよ、ってのをわかるようにするようにしました。
Phase3: 質問内容を即時で返して、OpenAIからのレスポンス契機でアップデートをかける
Azure BotのBot ConnectorAPIには、
- 会話(スレッドへの返信)を投稿するAPI
POST /v3/conversations/{conversationId}/activities
)
- 投稿内容を上書きするAPI
PUT /v3/conversations/{conversationId}/activities/{activityId}
の2つが存在します。
従来はPOST /activitiesのみを使用していましたが、これを改善して、
- まずは POST /activitiesでProcessing...である旨の返信をして
- 次にPUT /activities/{activityId} で質問に対する回答をする
という二段階の投稿を行うことで、"無視されてる感"の軽減を実現しました。
(参考) Bot Connector APIリファレンス https://learn.microsoft.com/ja-jp/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#send-to-conversation
ちなみに、このPhaseではOpenAIのStreaming APIも試しました。 比較的リアルタイムに返信が得られる一方で、べつにそこまで要らない(ボットの実装コードがやや読みづらくなる割に、得られる恩恵が少ない)という感じだったので、結局Streaming API採用には至りませんでした。
この構成での問題
もともと存在していた問題ですが、業務の知識を含んでないか、気軽に質問がしづらいという点です。社内だけでなくパートナーの皆さんにも使ってもらいたいという声は出てきて、セキュリティの担保が急務となってきました。
次の一手
ちょうどこのあたりで、Azure OpenAI Serviceの審査が通りました。Azure OpenAI Serviceにはデータを学習利用する旨のポリシーは存在していないので、バックエンドサービスをAzure OpenAI APIからAzure OpenAI Serviceへ切り替えることにしました。
Phase4: OpenAI APIからAzure OpenAI Serviceへの切り替え+簡易的な認証
OpenAI APIを、審査が通ったAzure OpenAI Serviceへと切り替えました。
Azure OpenAI Serviceは、機能が限られているうえに、APIの入力データ構造が本家OpenAI APIとほぼ同じなので、移行自体は非常に簡単でした。
- https://platform.openai.com/docs/api-reference
POST https://api.openai.com/v1/completions
- https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/reference
POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/completions
これにより、多少は安心して使ってもらえるようになりました。 ただ、さすがにセキュリティ的な観点から、どこの誰でもインストールして使える状態というのはまずいので、使用可能なメンバーをTeamsチームごとに制限することにしました。
誰かが勝手にTeamsアプリを追加してしまっても、予め許可したチームでなければ固定のメッセージを返すようにしたり、
チームへの許可はしていても、想定外のメンバーが質問してきた場合には固定のメッセージを返すようにしたり。
ともあれ、ここまでやったところで、ある程度安心してみんなに使えるようになったので、堂々の周知をしました。
この構成での問題
ここまでくると、だいぶみんなに使ってもらえるようにはなりましたが、本家のChatGPTと全然使用感が違うといった声もでてきました。何が問題だったかというと、文脈を一切考慮していなかったという点です。
これまでの使い方は、いわば「一問一答」で、質問文で与えられた字面だけをみてそれっぽい回答が返ってくるというものでした。これを実際に使いこなすには利用者側がそれなりの工夫が必要な状況でした。
もっと自然に会話したいと思うのは当然です。
次の一手
会話履歴を保存して、文脈をいちいち入力せずともAIと自然な会話ができるようにする。
Phase5: 一問一答からの脱却!
- キャッチコピーを3つ考えてください
- あと2つ考えてください
のように連続する質問を与えた際、「あと2つ」は文脈的に「キャッチコピーの4個目と5個目」を求めていることをAIにわかってもらう必要があります。これはどうすればよいのでしょうか。
実は、OpenAI APIがそのような文脈を与えての補完をサポートしています。APIリファレンスをよく読んでみると、messageは複数指定できるようになっており、しかもroleというパラメータで誰の発言かを区別できるようになっています。
これを利用して、先の例では2回目の発言時に、Teams上の会話履歴を含めて渡すようにしました。
{ "role": "system", "content": "あなたは優秀なアウトドア雑誌の記者です。"}, { "role": "user", "content": "キャッチコピーを3つ考えてください。"}, { "role": "assistant", "content": "1. xxxxx\n 2. xxxx\n 3. xxxxx"}, { "role": "user", "content": "あと2つ考えてください。"},
こうすることで、とても自然な質問回答を得ることができるようになります。
ただ、会話履歴をどこからどこまで渡したいかは指定できたほうが便利そうと直感的に思い、2つのマジックワードで囲まれた区間のみ会話履歴を一緒に渡すような実装にしました。マジックワードはいちいち覚えてられないので、質問回答の末尾にガイドとして表示するようにしたのも工夫ポイントです。
デフォルト状態では、一問一答モードで、このようなガイド表示。
@ChatBot あなたは.+です
という正規表現にひっかかる発言をしたときに、会話履歴も合わせて質問するモードへ変更。そのときにはこのようなガイド表示。
@ChatBot reset
と打つことで、会話履歴を消去し、デフォルトの状態に戻る。
チャットのUXてきには超ダサいものの、実使用においては意外とこれで必要十分で、この会話履歴機能を付けてからは特に社外のパートナーのエンジニアも含めて一気に使われるようになりました。
この構成での問題点
チャットボットとして使えるものにはなりました。ただ、そもそものところで @ChatGPT
という名前はいけません。
2023年4月に公開されたOpenAIのガイドラインにも、勝手に"GPT"とか名前を付けるなと明記されています。
社内向けアプリケーションであるとか関係なくダメなことをやってしまっています。
次の一手
ボットのリネーム。
これはAzure Bot Serviceのコンソールから簡単にできるものではなく、
- チャットボットのアプリケーションのマニフェストで名前を修正
- 再度アプリをビルド、組織内Teamsアプリとしてアップロード
- 情シス(Teams管理者)による再承認
までをやって、ようやくチャットボットのリネームができます。
Phase6: ボット名をOpenAIのカイドラインに遵守する形にリネーム
と、ここまで書いたところで、まだ現在(2023/6/14)でも対応が完了していません...。早くやらなきゃ・・・💦
まとめ
アイキューブドシステムズのエンジニア組織で実際に運用されている、Azure OpenAI Serviceをベースとしたチャットボットについて、その変遷を中心に紹介してみました。
アリものを使って導入しておしまいではなく、継続的な改善を重ねてきたことで、チャット初心者でも新卒メンバーでも自然に使いこなすことができるようなものになりました。
本当は活用事例をもっと紹介してソースコードも公開したかったのですが、機密情報を取り除くのが地味に大変で、間に合っていないので、またの機会に紹介したいと思います。
We are hiring!
アイキューブドシステムズでは、このように「継続的な改善」ができる/楽しめるメンバーを大募集中です。カジュアル面談もやっていますので、興味のある方はぜひ応募されてください。