
カスタマーサポートにおける自己解決とFAQ検索
Webでのカスタマーサポートにおいて、エンドユーザーにいかに自己解決してもらうかは重要な課題です。自己解決とは、例えば「サポートサイト・FAQ・チャットボット・マニュアル」などの手段を用いて、有人サポートに頼らず、ユーザーが自分自身で困っている内容を解決することです。自己解決率を高くすることで、簡易な問い合わせが減り、人が応対して解決すべき複雑な問題にリソースを割くことができるからです。
上記の理由から、企業のWebサイトにおけるFAQの検索は非常に重要です。適切なFAQにすぐに辿り着くことが出来れば、自己解決に繋がり、ユーザーの満足度も応対側の効率も高められるからです。しかし、実際のFAQ検索では、欲しい情報が見つからない、うまく検索ができないといったことがよく起こります。
なぜこういったことが生じるのかというと、自分の課題をFAQに存在している言葉で引っ掛けなければいけないという、なかなかに難しい問題を含んでいるからです。最近の検索システムでは、一般的な類義語登録や各企業が提供しているサービスのドメイン固有の単語を登録するなどして、検索がうまくいくよう工夫しています。ですが、それでも実際のFAQサイトでは、検索がうまくいかず、欲しい情報にたどり着けないため、結局エンドユーザーが電話やメールで問い合わせするということが頻繁に起こっています。
この問題を解決するための一つの方法として、自然言語をクエリとした検索があります。検索といえば、n個の単語をスペースで区切って検索するものが一般的ですが、自然言語による検索では、人に会話で質問をするように、検索することができます。
例えば、Webサービスでログインパスワードを忘れた場合のFAQを検索したい場合:
単語検索: 「ログイン パスワード 忘れた」
自然言語検索: 「ログインパスワードを忘れたんだけどどうしたらいい?」
のような違いがあります。上記の例では、単語検索も簡単ですが、より複雑な問題になったときは、自然言語で検索したほうが問題を表現しやすいことは多々あると思います。
では、このような自然言語による検索システムを構築するにはどうしたらいいでしょうか。そのためには、Embeddingという技術を利用します。EmbeddingはChatGPTなどのLLMで利用されており、文章を入力すると、浮動小数点のベクトルが出力されます。ベクトルで出力されるということは、ベクトル間の距離を測れるということになり、つまり文章間の距離(関連性)を計算することができます。そのため、先程の自然言語検索の例では、予めFAQ記事をEmbeddingでベクトル化しておき、入力された文章もベクトルで表現し、各FAQ記事との距離を計算し、距離の近いものから表示することで、検索機能を実現できるのです。

弊社のRightSupport by KARTE (以下、RightSupport) でも上記のような仕組みで検索機能を実装しており、自然文による検索を提供しています。RightSupportでは、AzureのOpenAI ServiceのEmbeddingsを利用しています。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models#embeddings-models
RightSupportではEmbeddings APIを直接利用し、検索機能自体は独自に実装していますが、最近ではLLMを利用した自然言語クエリによる検索機能自体がPaaSとして提供されています。今回は、それらの検索機能がどんなものか使ってみます。試してみるサービスは、Google Cloud Platform (GCP) のVertex AI Search and Conversationです。
Embeddings APIを利用した検索システム
Vertex AI Searchを使う前に、現状のRightSupportで行っている検索について簡単に説明しておきます。RightSupportでは、クライアント企業のFAQ記事をインポートし、FAQ検索ウィジェットとしてサイトのあらゆる場所に提供できるといった機能があります。このFAQ記事検索にOpen AIのEmbeddingsを利用しています。
機能としては以下のようになっています。
- 各FAQ記事をEmbeddings APIに投げて、ベクトル化し、CacheとDBに保存しておく
- エンドユーザーが検索すると、その文言をEmbeddings APIに投げてベクトル化する
- 検索文言と各FAQ記事のコサイン類似度を計算し、1に近いものから順にFAQ一覧を表示する
Open AIのEmbeddingsはnormalizeされており、難しいことを考えず内積を取れば簡単に類似度を計ることができます。
実際の検索結果は下図のようになっており、自然文の検索文言に対してそれっぽい記事が引っかかっていることがわかります。検索文言のサポートウィジェットというのは、RightSupport内の機能の一つであり、サイト内にサポート用のウィジェットを出すための機能です。実際中身まで見てみると、1件目はその強調表示の設定方法そのものズバリであり、2件目はサポートウィジェットにおいて効果的な使い方の一つとして強調表示を設定する方法を案内しています。これらの結果から検索結果としては妥当な感じがします(定性評価になってはしまいますが…)。

Vertex AI Search
次にVertex AI Seachを利用して、同じFAQで検索アプリケーションを作ってみます。Vertex AI Search and Conversationは、LLMを利用し検索やチャットボットなどを簡単に構築できるGCPのプロダクトです。今回は検索なので、Vertex AI Searchを利用します。設定方法に関しては公式のドキュメントやブログなどで色々と記事が出てるので割愛します。
Vertex AI SearchはGCP上では 検索と会話 という名前になっており、開くと以下のように作成した検索アプリなどが一覧として表示されます。

自然言語クエリ処理の利用
Vertex AI Searchで自然言語クエリを利用するためにはフォローアップ検索をオンにする必要があります。フォローアップ検索を利用するにはデータストアと検索アプリの作成時に以下の設定をする必要があります。
- データストアは非構造化データかウェブサイト
- ウェブサイトの場合は
高度なインデックス登録をオンにする
- ウェブサイトの場合は
- 検索アプリを作成するときに
高度なLLM機能をオンにする
これらの設定を行い、検索アプリを作成することで自然言語クエリによる検索機能を作ることができます。実際に、弊社のプロダクトであるRightSupportのヘルプページ (https://help.rightsupport.karte.io) のデータを元に検索アプリを作ってみました。
実際に検索してみます。RightSupportにはサポートウィジェットというWebサイト上にウィジェットを出す機能があり、またそのウィジェットをエンドユーザーが起こしたイベントに応じて強調表示する機能があります。その機能について調べてみます。

左図は構造化データを利用しフォローアップ検索をオフにした検索アプリで、右は非構造化データを利用しフォローアップ検索をオンにした検索アプリです。「サポートウィジェット 強調表示」のように単語を並べて検索した場合は、検索結果は違いますが、どちらもいずれかのFAQがヒットしており、また1つ目の結果は同じページでした(データの入れ方が違うため結果のUIが違いますが)。
次に「サポートウィジェットの強調表示設定について知りたい」という自然文による検索をしてみます。
このように、フォローアップ検索がオフの場合は、検索になにもヒットしませんが、フォローアップ検索がオンの方ではそれっぽい検索結果が返ってきています。定性評価になってしまいますが、2件目以降(1件目の検索結果は同じなので)の結果は自然文による検索の方が欲しい情報が返ってきている感じがします。
これらのアプリは、さくっと1, 2時間くらいで出来ました。このように、Vertex AI Searchを使えば、LLMを利用した自然言語クエリによる検索を手軽に作ることができます。
Vertex AI Searchを使ったトライアルは、今回はここで終わりますが、次はAzureの Azure AI Search も試してみたいと思います。また、これらのサービスはただ自然言語クエリによる検索が出来るだけではなく、GoogleやBingの検索技術を色々と盛り込んだ高機能な検索やチャットボットのようなものになっています。自然言語処理の専門家がいなくても、高度な検索機能が手軽に作れるように技術が進化しているのは、小さなチームでトライを重ねている僕たちのようなスタートアップにとって、とても良い環境になったのを感じています。
またRightTouchには、こうしたLLMの活用をはじめ、最新の技術に積極的に触れて、プロダクトに活用できないかを考える環境・カルチャーがあります。RightTouchの取り組みや雰囲気に興味を持ってくださった方がいたら、ぜひカジュアルからお話できたら嬉しいです。
エンジニア求人情報の詳細
https://recruit.righttouch.co.jp/engineer