![見出し画像](https://assets.st-note.com/production/uploads/images/136589728/rectangle_large_type_2_9c7d2c55cc8bb74845cac46969179231.png?width=1200)
GPTによるFAQボットのユーザビリティ向上について
はじめに
こんにちは、こんにゃくざむらいです。
今回は、私たちの開発チームが取り組んだFAQボットの新規機能について紹介します。
FAQボットとはなにか?
そもそもFAQとは「Frequently Asked Questions(よく聞かれる質問)」の略です。つまりFAQボットは、顧客や利用者がよく問い合わせる質問に対して自動的に回答するAIボットのことです。
企業や組織が顧客サービスや内部サポートを向上させるために導入することが多いです。FAQボットには事前に設定された質問と回答の対応関係が定義されていて、自然言語処理(NLP)や機械学習の技術を活用して、ユーザーの入力した質問に対して適切な回答を提供します。そのため人間が介在せずに24時間365日いつでも質問に回答することが可能です。
FAQボットでの課題
当社でも、FAQボットの開発・運用をしていますが、運用において、いくつかの課題が浮かび上がっています。
その中でも特に顕著な課題の一つは、事前に質問とその回答を用意する必要がある点です。当社が提供するサービスの中で特にtoC向けに開発されるアプリは更新頻度が非常に高い特徴を持っています。
このため、ユーザーから寄せられる質問やそれに対する回答も、頻繁に変化していくことが珍しくありません。この状況下で、FAQボットが提供する質問と回答を常に最新の状態に保つためには、事前に用意している質問と回答を頻繁に変更する必要が生じます。
しかしながら、この変更作業は結構なメンテナンス負荷を伴うものであり、特に更新頻度の高いアプリの場合、その負担は一段と大きくなります。
課題解消のために取り組んだこと
質問と回答を用意する工数を削減するために、当社が取り入れた仕組みは『Azure OpenAI Service』によるGPT(Generative Pre-trained Transformer)モデルを活用した自動回答機能です。過去のお問い合わせとその回答を参考に、GPTが自動的に回答文を生成することができます。
つまり、FAQを事前にメンテナンスする必要がなくなり、ユーザーのお問い合わせに柔軟かつ迅速に対応できるようになりました。
GPTは、事前に学習されたモデルを用いて、自然言語処理のタスクを実行することができます。過去のお問い合わせとその回答を参考にしながら、GPTが自動的に適切な回答を生成します。
また費用を抑えるためにAWSのマネージドベクトル検索サービスである『Amazon OpenSearch Service』を使用せずに、『Amazon EC2』上にベクトルDBを構築しました。マネージドサービスを利用することで、ベクトル検索におけるインスタンスのデプロイやスケーリングなど開発や運用に必要な部分をあまり意識せずにリソースを構築することができます。
ただこちらのサービスを利用すると通常の『Amazon EC2』で構築するより稼働コストがかかってしまいます。そのため『Amazon EC2』に独自にベクトルDBを構築することで、稼働コストを抑えました。
出来るようになったこと
![](https://assets.st-note.com/img/1712804298057-83bGKSD50F.png)
この新機能の導入により、工数の削減が実現されました。
具体的には、従来のFAQの登録や更新にかかる手間が省け、開発者の負担が減りました。さらに、GPTモデルを利用したベクトルの埋め込みが高品質であるため、検索結果もより高品質となりユーザーにとってもより良い結果になっています。
![](https://assets.st-note.com/img/1712804153676-2DyFryb6gU.png?width=1200)
![](https://assets.st-note.com/img/1712804165303-n6ZqSxkEUX.png)
苦労したこと
生成系AIの出力をそのまま表示するというところで不適切な出力を防ぐということが大変でした。生成系AIを利用することで起こる問題として以下の5つがありました。
プロンプトの漏洩(お問合せデータが他のユーザーに表示されてしまう)
嘘をつく(ハルシネーション)
無関係なことを話す
不適切な発言(暴力的、宗教的、政治的な発言など)をする
プロンプトとは生成系AIに文章を生成してもらう際にAIに投げかける文言です。こちらをあらかじめ指定することで、ある程度生成してもらう文章を誘導することができます。
上の問題の内「不適切な発言をする」は『Azure OpenAI Service』を利用することで解決しています。『Azure OpenAI Service』にはコンテンツフィルターの機能がついているため、不適切な発言をフィルターすることができました。(https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/content-filter)
今回問題になったのは「プロンプトの漏洩」「嘘をつく」「無関係なことを話す」です。
過去のお問合せを参考に生成してもらうため、プロンプト内にお問い合わせの内容を含めています。あらかじめ個人情報が含まれている場合は除外していますが、それでもお問合せ内容がそのまま漏洩されてしまう恐れがあるのはあまり嬉しくないです。「嘘をつく」は間違った情報をユーザーに提供してしまうため、もちろん避けたいです。「無関係なことを話す」ことも「嘘をつく」ことの原因になってしまうためあまり嬉しくないです。
![](https://assets.st-note.com/img/1712809363202-dGAEvmfGE2.png)
これらの問題に対してはいずれも同じ方法で解決しています。送られてきた質問に対して、過去のお問合せデータとの類似度を計算し、類似度が高いものだけ生成するという方法を取りました。無関係なものや正解がわからない質問が来た場合には回答を避けています。
構成
今回の構成を紹介します。
![](https://assets.st-note.com/img/1712798377789-BIBvvs3Fnj.png?width=1200)
ボット
『Azure Bot Service』を利用しています。質問の受け答えのみ行うシンプルなBotだけでなく画像の送受信や動画の表示なども行えるようにカスタマイズすることもできます。サンプルコードが提供されていますので手元で簡単に試すこともできます。(https://github.com/microsoft/BotBuilder-Samples)
API
『AWS Lambda』により提供しています。ユーザーの入力を受け取った後、その入力と類似する過去のご意見をベクトルDBから取得して、それを参考に生成系AIに回答を生成してもらいます。
ベクトルDB
過去のご意見とそのベクトルを保持しています。
オープンソースの『Qdrant』を利用しています。『Amazon OpenSearch Service』ではなく『Amazon EC2』にDBを構築することでコストを抑えています。『Qdrant』は公式サイト(https://qdrant.tech/documentation/overview/)が詳しく書かれていて、またベクトルのフィルターなども豊富に用意されているため、初心者にとってわかりやすいソフトウェアでした。Timestampの比較ができたらより良いなぁと思います。
今後の展望
今回の新機能の導入により、FAQボットの品質向上と開発工数の削減が実現しました。今後は今回の知見を活かし生成系AIを活用していきたいです。
例えば、同じ領域では、お問合せに対する下書き自動生成があります。
お問い合わせへの返信を完全に自動化することは品質の問題で難しいですが、過去の返信実績や今も使用されているテンプレート文言を利用すれば、下書きを自動生成することができます。
また他アプリへのFAQボットの導入や、お問合せ対応以外での自然言語処理タスクへの応用など、いろいろやれることはたくさんあるため、より多くの課題を解決し、さらなる顧客満足度の向上を実現したいと考えています。
最後に、この記事を興味を持って読んでいただき、ありがとうございました。今回紹介したFAQボットは、当社が提供しているナビゲーションアプリ『NAVITIME』と電車やバスに特化した乗換アプリ『乗換NAVITIME』で利用できます。ぜひインストールして利用してみてください。(FAQボットの利用手順は次の章で記載します。)
また日々アプリを使ってくださる方々に感謝の意を表します。
私たちは、より良い移動体験を提供するために日々努力を重ねており、皆様のご支援に心から感謝しています。引き続き、私たちの取り組みにご期待ください。
(補足) FAQボットの利用手順
ホーム画面から記載の赤枠のボタンを押して進んでください。
NAVITIME
![](https://assets.st-note.com/img/1713849983963-6vaIhqt1ys.png?width=1200)
乗換NAVITIME
![](https://assets.st-note.com/img/1713850050802-XeyrUdcZMI.png?width=1200)