人とコンピュータの関係を考えると、二者間には常にインタフェースが存在します。本連載では、人とコンピュータの間に介在するインタフェースに着目し、インタフェースとそれらを世に生み出すプロダクト開発について議論します。Helpfeelが、独自のインタフェースを実装しながら、便利さと楽しさを備えたWebサービスをどのように開発しているのかについてお伝えします。
こんにちは、生成AIエキスパート・エンジニアの寺本です。最近では生成AIといえばチャットの印象が強くなっていますが、Helpfeelでは検索体験を向上するために生成AIを活用する方法も探っています。今回紹介するのは、「ベクトル検索」と「埋め込みモデル」です。
ベクトル検索と埋め込みモデル
ベクトル検索とは、テキストや画像などのデータを数値のベクトルに変換し、これを利用して情報の検索やサジェストを行う技術です。一方埋め込みモデルは、その「テキストや画像などのデータを数値のベクトルに変換」するための機械学習モデルです。
大量の文章を事前学習することで、任意のテキストの意味内容を反映したベクトル表現を生成できます。これにより、従来のキーワードベースの検索よりもより深い意味レベルでのマッチングが可能になるため、単なる検索精度の向上だけでなく、検索体験の幅を大きく広げる可能性を秘めています。
ベクトル検索の前準備として、検索したい文書をベクトルに変換しておきます。検索時はユーザーが提供する複雑なクエリや長文の質問をベクトル化することで、関連する文書を素早く見つけ出せるようになります。さまざまな埋め込みモデルが公開されていますが、OpenAI社が提供する「Embedding API」を使用すれば、任意の長さのテキストを簡単なAPIで埋め込みベクトルに変換できるため、機械学習やインフラの知識が無くても実装が可能です。
ベクトル検索の実践例
私が開発したContact Sense AIという機能では、このベクトル検索技術を応用して、問い合わせフォームに入力された内容から即座にFAQをサジェストできます。事前にFAQにひも付く質問文のリストを作成しているため、この質問文をベクトル化して検索しています。
これにより、従来のキーワードベースの検索では難しかった、ユーザーの意図するニュアンスや文脈を考慮した検索を提供可能になりました。
こちらの社内ポータルサイトを模した例では、「今度イベントで京都に行くんですけど、切符を自腹で購入してしまい」と検索したら、自腹で負担した経費を申請するやり方が検索にヒットしています。
さらにこちらの例では、英語の検索クエリに対して日本語の検索結果がヒットしています。翻訳しているわけではありません。これは埋め込みモデルの面白い性質で、多言語のデータでモデルを学習させることで、異なる言語間の意味もうまくベクトルで表現できるようです。
どちらの例もOpenAIのEmbedding APIを利用していますが、ヒットしている質問文は事前に用意したものです。
技術の課題と解決策
このように万能にも見えるベクトル検索と埋め込みモデルですが、製品化していく中でいくつかの問題点が見えてきました。ここからは、実際に手を動かすことで見えてきた3つの課題と、それらをアルゴリズムやインタフェースの工夫で解決するアプローチを紹介します。
コストの問題
1つ目はコストの問題です。埋め込みベクトルを計算するには、GPUを用いた大規模な計算処理が必要です。OpenAI APIなどのSaaSを利用する場合はAPIの利用料金として、自前のモデルをクラウドでホストする場合はコンピューティングリソースの料金として、事前に費用を見積もることが重要です。
2024年1月25日に発表されたOpenAIの新しい埋め込みモデル(v3)では、smallとlargeが展開された上、ベクトル長が可変になったことで、精度とコストのトレードオフを意識する必要が出てきました。largeはsmallよりも精度が良いそうですが、その価格はsmallの6.5倍です。また、ベクトル長は長いほど精度が良くなるそうですが、ベクトルを計算する際に必要なメモリが増えるため、インフラコストが増大するというトレードオフの関係があります。
開発している製品の価格と原価率が決まっている場合は、コスト的にベクトル検索が可能かを検討することになります。ベクトル検索のコストは、埋め込みにかかるコストと、検索にかかるコストの2つに分かれます。後者は製品レベルのベクトルデータベースを用意すると最低でも月額100ドルくらいはかかるので、ユーザー数が多いサービスであれば前者を、安定性や速度が必要なサービスであれば後者を重点的にチェックすると良いでしょう。
型番や固有名詞に弱い
2つ目は、型番や固有名詞に弱いという問題です。汎用の埋め込みモデルでは、「No.123」のような数値や、「A-123」のような型番を適切にベクトル化できないことがあります。これはキーワード検索に慣れ親しんだユーザーにとって、かなり非直感的に感じるふるまいです。
また、固有名詞の認識も、ベクトル検索が直面する重要な課題の一つです。例えば、ユーザーが「Helpfeelの料金について知りたい」と検索した場合、ユーザーが知りたいのは「料金」の方なのに「Helpfeel」という固有名詞に引っ張られて、「Helpfeelの利用規約について」のようなテキストが一番上にヒットすることがあります。
解決策として、自前でモデルを学習するのも手ですが、十分な量のデータを用意するのは難しいこともあります。その場合は、キーワード検索とベクトル検索を組み合わせて使うのがオススメです。具体的には、最初にキーワード検索を行ったあとでベクトルを用いてリランキングする方法や、キーワード検索とベクトル検索のスコアを組み合わせて使う方法があります。あるいはもっとシンプルに、キーワード検索の結果とベクトル検索の結果を両方とも見せるという解決策も有効かも知れません。
ユーザーの違和感
3つ目は、検索結果に対するユーザーの違和感の問題です。先ほど「検索結果が非直感的である」と述べましたが、型番や固有名詞に限らず、ベクトル検索はキーワードではなく言葉の意味で検索を行うため、特に社内システムでは従来の検索とのギャップが問題になることがあります。せっかく精度が上がったのに使いづらいと思われるのは悲しい出来事です。
これに対しては、もしかすると啓蒙が必要かも知れません。これまではキーワードに引っ掛かった検索結果を人間が片っ端から読んで探すのが一般的でしたが、ベクトル検索の場合、検索クエリを具体的に書くことに労力を割いた方がより良い結果を得られることがあります。
検索対象か検索クエリを変えてしまうのも有効です。例えば、質問から回答を検索しようとすると、ベクトル検索はうまく機能しない場合があります。質問と意味が近い質問を検索したり、回答と意味が近い回答を検索したりすることで、精度を大きく高められる可能性があります。もちろんインタフェースもセットで考える必要があるでしょう。
将来の展望
将来的には生成AIの技術を活用し、ユーザーの意図をより深く理解することで、検索体験にもイノベーションを起こすことが期待されます。自然言語で検索できれば、検索の活用の幅が大きく広がるからです。例えば、過去の行動履歴や現在のユーザーの状態を自動的に検索クエリに含めることで、ユーザーが書いていないことまで見通せるかもしれません。
さらに、マルチモーダル検索の発展により、テキスト入力だけでなく、画像を用いた検索も普及していくでしょう。既に画像とテキストをペアで学習することで、画像を埋め込みベクトル化するモデルが公開されています。ユーザーは写真を撮影するだけで関連情報を検索できるなど、PDFの図やグラフなども検索対象になっていきます。
今回は、ベクトル検索と埋め込みモデルの課題と将来性についてお伝えしました。世の中的には生成AI=チャット(ボット)とみなされる場合が多いようですが、検索インタフェースだってまだまだ発展途上なんです。AIだけが一歩先に進んでしまい、インタフェースが追いついていないようにすら思えます。
私たちは日夜この問題に取り組んでおり、今回ご紹介したContact Sense AIのような製品の構想がまだまだたくさんあります。あなたもぜひ一緒に、世界をあっと驚かせるようなスゴい検索体験を発明していきましょう!