今回のテックブログを担当するMooA(※)開発室の李と申します。
※MooA(ムーア)とは、モビルスが独自開発するオペレーション支援AIで、コンタクトセンターのオペレータやスーパーバイザーの業務をサポートするAIシステムです。
最近、大規模言語モデル(Large Language Models、以下LLM)の活用例が増えています。セマンティック検索(意味検索)を組み合わせることで、LLMはより高度で精度の高い応答や情報提供が可能となります。今回のブログでは、セマンティック検索とRedisを使って、LLMがより高度で精度の高い応答を実現する方法を紹介します。
セマンティック検索とは
セマンティック検索(意味検索)は、情報検索の方法の一つであり、単純なキーワードの一致だけでなく、意味や関連性に基づいて情報を検索・取得する技術です。従来のキーワードベースの検索エンジンでは、単語やフレーズの一致を重視して結果を返すため、検索クエリの意図を完全に理解することができませんでした。しかし、セマンティック検索では、ユーザーの意図をより深く理解し、関連性の高い情報を提供することができます。
セマンティック検索は、自然言語処理(Natural Language Processing)や機械学習(Machine Learning)の技術を活用しています。文脈や意味に基づいた検索クエリの解釈を行い、関連するドキュメントや情報源を特定します。これにより、キーワードの一致だけでなく、文章の意味や関連性を考慮した検索結果が得られます。
ドキュメントの検索を利用する際、例えばユーザーが「apple」というキーワードで検索する場合、従来のキーワードベースの検索エンジンではApple社やリンゴに関連する情報を返しますが、セマンティック検索では文脈や意味を解釈し、キーワード「apple」と一致する情報だけでなく、オレンジやパイナップルなどの「果物」に関連する情報も提供することができます。
また、セマンティック検索はサジェストシステムにおいても活用されます。例えば、ユーザーが入力している途中のキーワードに基づいて、セマンティックサーチは文脈や意味を理解し、次に入力される可能性の高い単語やフレーズを予測します。たとえば、ユーザーが「スマート」と入力した場合、セマンティックサーチは「スマートフォン」、「スマートウォッチ」、「スマートホーム」といった関連キーワードを提案します。
LLMとの組み合わせ
セマンティック検索を使って検索結果を絞り込み、関連性の高い文書や情報を抽出します。そして、抽出された情報をLLMに与えることで、LLMがより適切な文や回答を生成できます。セマンティック検索が文脈や意味を考慮して情報を絞り込んでいるため、それを基にしたLLMの応答や生成結果は、より意味的に優れたものとなる可能性があります。
Redisとは
RedisはC言語で開発された、Open Source Key-Value in-memory databaseです。ちょっと修飾語が多いと感じませんか?(笑)それでは、一つずつ紹介していきましょう。
‐ Open Source
Open Sourceとは、無償で一般公開される「ソースコード」のことです。つまり、Redisは無料のソフトウェアとなります。RedisのライセンスはBSD 3-Clauseなので、商用利用も可能となります。
‐ Key-Value database
MySQLなどのリレーショナルデータベースでは、データは構造化されたテーブルやカラムに格納されていますが、RedisなどのKey-Valueデータベースは、KeyとValueのペアのコレクションとしてデータを格納します。また、Keyは一意の識別子として機能し、KeyとValueのどちらも、単純なオブジェクトから複雑な複合オブジェクトまで、何であっても構いません。
‐ In-memory database
Redisは、メモリ上にデータを保存することで、非常に高速な書き込みと読み込みが可能となります。また、ディスク上にデータを永続化し、リストアも容易に行うことができます。
Redisは、データストレージエンジンである、上記の問題(大量の複雑なハッシュテーブルを保存・共有など)を非常に簡単に解決し、実装することができます。
Redisのデータタイプ
Redisには、いくつのデータタイプがあり、以下はでよく使われているデータタイプを紹介します。
- stringは、Redisの基本のデータタイプであり、1つのkeyに1つのvalueが対応します。Valueは文字列だけでなく、数値でも可能です。Redisのstringはバイナリセーフであり、jpg画像やシリアライズされたオブジェクトなど、あらゆるデータを格納することができます。Redisのstringは最大512Mのvalueを格納できます。
- hashは、Redisのkeyとvalueのマッピングで、特にオブジェクトの保存に適しています。
- listは、文字列を挿入順に並べたものです。要素はリストの先頭(左)または末尾(右)に追加できます。Twitterのフォローリストやファンリストなど、さまざまなシナリオで使用されます。Redisは、listに対してpushとpopの操作を提供し、セグメントを操作するためのAPIも提供しているので、セグメントの要素を直接検索したり削除したりすることができます。
- setは、文字列型の順序のないコレクションであり、listとは異なるのは、setには重複要素がないことです。
- sorted setは、与えられたランキングスコアによって、自動的にソートされます。sorted setにも重複要素がありません。
※上記以外にも、Streams, Geospatial indexes, Bitmaps, Bitfields, HyperLogLogデータタイプもあります。
RedisでのVector Similarity Search
Vector Similarity Search(ベクトル類似度検索)を紹介する前に、まずVector Similarity(ベクトル類似度)を紹介しましょう。簡単に言えば、ベクトルは数字のリストだと考えてください。Vector Similarityは2つ以上のベクトルがどれだけ違うか(似ているか)を表す尺度です。
Vector Similarity Searchはセマンティック検索(Semantic Search)の一つの手法として使用することができます。ベクトル類似度検索は、ベクトル表現を使用して文書やクエリの類似性を計算し、関連性の高い情報を検索する手法です。この手法では、文書やクエリをベクトル空間に埋め込み、ベクトル間の距離や類似性を計算することで、意味的な関連性を捉えます。
Redisでは、Euclidean、Inner Product、そしてCosine Similarityなどのベクトル類似度の計算をサポートしています。
ベクトル類似度で一番理解しやすいCosine Similarityを紹介しましょう。例えば、上記の図の中にVector 1とVector 3のなす角が Vector 1 とVector 2のなす角より大きいので、Vector 1 とVector 2のなす角のcosine値はVector 1 とVector 2のなす角のcosine値より大きい、それは「Vector 1とVector 2の類似度はVector 1とVector 3の類似度より大きい」ということを意味します。
Embeddings
Embeddingsは、テキスト、画像、音声などのデータを数値ベクトルの形式に変換する手法やモデルです。これにより、テキストデータを機械学習アルゴリズムに入力できるようになります。
具体的には、単語や文章を低次元のベクトル空間にマッピングします。これにより、単語や文章の意味や関係性を数値表現として捉えることができます。例えば、同義語間の距離が近くなるようなベクトル表現を学習することができます。
そのため、上記のデータをベクトル表現に変換するためのモデルは「Embeddings Model」と呼ばれています。テキスト専用のEmbeddings Modelを例として説明すると、一般的には、Embeddings Modelは大量のデータ(コーパスなど)を用いて訓練されます。有名なテキストEmbeddings Modelには、Word2Vec、GloVe、BERTなどがあります。
下記の図のように、Embedding Modelを使えれば、テキスト、画像、音声などのデータを埋め込み空間に変換することはできます。変換したベクトルとデータ両方もRedisでの保存ができます。
下記の図はユーザーがある情報を検索する際の流れを表わしています。もしユーザーが「○○の使い方を教えてください。」と検索すると、この検索内容はまずEmbedding Modelでベクトルを変換して、Redisを使って検索内容のベクトルと保存したデータのベクトルの類似度を算出することで、関連するデータを取得できます。取得されたデータを検索内容と一緒にLLMに入力すれば、期待する答えの生成ができます。
こんなワークフローにより、Redisでデータのベクトルを保存して、検索の結果をLLMに提供することで、精度と質の高い応答や情報提供が可能となります。
おわりに
今回は、LLMの精度を向上するために、セマンティック検索との組み合わせを紹介しました。また、Redisというデータベースをセマンティック検索がサポートし、その検索結果をLLMで合わせて使うことができる可能性も紹介しました。
(参考)
モビルスでは、一緒に働く仲間を募集中です!
興味のある方は、ぜひ採用情報のページをご覧ください!