RAG・AI Agentを支えるRetriverの基礎知識と実装まとめ
はじめに
株式会社neoAIの研究開発組織 (neoAI Research) / 東京大学の竹本健悟です。
巷では昨年からRAG(Retrieval Augmented Generation)、そして最近ではAI Agentが大いに注目を集め世間を騒がせていますね。
これらの技術を活用して、社内ドキュメントを外部知識としてLLMに提供するアプリケーションを構築する際、実運用に足る精度を出すためには質問に対して適切なドキュメントを高精度で取得することが最も重要なカギとなります。
今回はそんなRAG・AI Agentの中核を担うRetrieverについて、ベクトル検索やキーワード検索といった代表的な手法や評価指標まで基礎的な知識を網羅的に解説していきます。
オープンソースのベクトルDBであるQdrantを用いた日本語キーワード検索の実装方法や、AWS、Microsoft Azure、GCPといったクラウドサービスでRetrieverを実現するための方法・各サービスの特徴の比較についても少し紹介します。
Retrieverとは?
入力(クエリ)に対して、データベース内の文書(ドキュメント)から関連度の高いものを抽出する機構のことをRetrieverと言います。
検索エンジン、質問応答システム、チャットボットなど、多岐にわたる分野で活用されており、今日ではLLMのめざましい発展によりLLMに与えるコンテキストをデータベースから取得する意味合いで用いられることが多くなっています。
OpenAI GPT-4o、Google Gemini 1.5 Flashといった高いマルチモーダル性能を誇る基盤モデルが登場した辺りから、画像や音声データを対象としたクロスモーダルなRetrieverの有用性が高まってきており、様々な手法が考案されてきていますが、今回はテキストデータに対するRetrieverを対象にして検索手法を解説していきます。
ベクトル検索
ベクトル検索では、BERTなどの事前学習済みのTransformerモデルを使用してテキストをエンコードして文章に対する埋め込み表現(Embedding)をベクトルとして得ます。
文脈・文意を踏まえてベクトルが作成されるので、ベクトル間のcos類似度、Euclid距離などを用いればベクトルの類似度≒文書の類似度を測ることができ、これによってドキュメントを検索するのがベクトル検索です。
Embeddingモデルによって入力できる文章の長さの上限(コンテキスト長)は異なっているため、それ以上の長さの文章をEmbeddingに反映することはできません。
そのため、ドキュメントはコンテキスト長以下の長さを持つひとまとまりの塊(チャンク)に分割してEmbeddingモデルに通すことが一般的です。また、文章の長さにドキュメント間で大きな乖離があると文章の長さがEmbeddingに影響してしまうので、チャンクの大きさは一定にすることが重要です。
参考:近似最近傍探索
以上であげたようにEmbeddingモデルでテキストをベクトル化し、全文書に対してマッチングすれば高速な検索ができるかというと、そういうわけではありません。
次元
となり、計算量が
そのため、ベクトルの圧縮を行い高速に解を求めたり、厳密に最近傍でなくても良いので高速に解を求める近似最近傍探索 (ANN)を行うためのアルゴリズムが様々考案されています。
この中で、大規模データに対する速度・精度のトレードオフで非常に優れており、多くのVectorDBで実装されているアルゴリズムがHNSW(Hierarchical Navigable Small World)です。
HNSWではベクトルに対して上層が疎で下層に行くほど密になる階層的なグラフ構造を作成し、各層で最も近いノードを見つけながら下位層に移動していくことで近傍点を効率的に探索します。
HNSWの他にも様々なアルゴリズムがあり、それらを組み合わせた手法なども存在します。それぞれのアルゴリズムでベクトル数によって応答速度・精度が異なるため、パフォーマンスを追求したい場合は各アルゴリズムの特徴を理解し、適切なアルゴリズムを選択する必要があります。
最近傍探索、近似最近傍探索については東大の松井先生のスライドが非常にわかりやすいのでおすすめです。
キーワード検索
ベクトル検索の弱点として正確な一致検索が苦手であるといったことが挙げられます。
実データに対するユースケースでは「この製品番号が含まれている文書をとってきてほしい」というようなある単語が含まれる文書をジャストで取ってきたいというような場合があると思います。このような時に有用なのがキーワード検索という手法です。
以下でキーワード検索の各手法を解説します。
tf-idf
tf-idfとは、
- tf:単語の出現頻度(term frequency)
- idf:単語の希少度(inverse document frequency)
の2つを掛け合わせたものです。(tfはあるドキュメントに対して一意に定義できるのに対して、idfが他ドキュメントとの関係で値が変動することに注意してください。)
上の計算式に従ってクエリ内の単語ごとにスコアが算出できます。
そのドキュメント内でよく出てきて、かつ他のドキュメントにはあまり出てこない単語の重要度が高いということなので、直感的に理解することができると思います。
BM25
tf-idfの弱点として以下のことが挙げられます。
- 文書の長さを考慮していない
- 同じ単語が多数出現するとTfのスコアが線形に増加していくためしてスコアが異常に高くなる
- チューニングができない(いじれるパラメーターがない)
これらのTf-Idfの弱点を解決したのがBM25です。BM25の計算式が以下になります。
なんのこっちゃという感じだと思いますか、各部分について見ていくとtfの増加を抑える、ドキュメント内の総単語数のばらつきによる不公平性を解消していることが数式から見て取れます。
Tf-Idf、BM25についてはアイシアさんの以下の解説動画が非常にわかりやすいのでおすすめです。
-
【自然言語処理】tf-idf 単語の情報量を加味した類似度分析【Elasticsearch への道①】#084 #VRアカデミア
-
【自然言語処理】BM25 - tf-idfの進化系の実践類似度分析【Elasticsearch への道②】#085 #VRアカデミア
SPLADE
Tf-Idf・BM25のようなキーワードは単語の完全一致が前提となっているため、同義語に対応ができないという弱点があります。
これに対応するため、確率計算ではなくLM(Language Model)を用いてSparse Vectorを得る手法が近年考案されています。
LMを用いてSparse Vectorを得ることで、文脈理解ができるというベクトル検索の強みとシンプルで効率の良いキーワード検索の良いところどりをするイメージです。
SPLADEは、BERTなどの事前学習済みのTransformerモデルを使用してテキストをエンコードし、語彙全体に対して各単語の重要度スコアを計算します。これにより、入力テキストに含まれない関連単語にも非ゼロの重みを付与することが可能です。ここで正則化手法(例えば、L1正則化)を適用して、ベクトル(=単語空間)の多くの要素がゼロになるように学習が行われています。
上の画像を見れば、クエリに無い「効果」「良い」といった単語に対してもスコアが算出されているのがわかると思います。
@hotchpotchさんが作成された日本語で学習されたSPLADEモデルは、パラメータ数・次元数が少ないにも関わらず、multilingual-e5-largeといったエンベディングモデルよりも高いベンチマークスコアを叩き出しています。
ハイブリッド検索とReranker
ハイブリッド検索とRerankerはベクトル検索、キーワード検索単体で望んだ検索精度が得られない場合に精度向上に有用な手段です。以下でそれぞれ解説していきます。
ハイブリッド検索
これまで見てきたベクトル検索とキーワード検索の長所と弱点をまとめると、以下のようになります。
長所 | 弱点 | |
---|---|---|
ベクトル検索 | 文脈や文章全体の意味を捉えることができる | 学習データに精度が依存するため、学習データに含まれない固有単語に対する対応ができない |
キーワード検索 | クエリと正確に一致するキーワードを含む文書を返すため、意図した情報を得やすい | 単語の出現有無のみを判断するため、文脈や意味を考慮した検索ができない、言い換えに対応できない |
これらの検索手法を組み合わせることで弱点を補い合おうというのがハイブリッド検索です。
ハイブリッド検索では、各検索手法において算出されたスコアが融合されて最終的なスコアが計算されます。
代表的なスコア融合アルゴリズムとしてはRRF(Reciprocal Rank Fusion)があります。大体のRetrieverではデフォルトでRRFでのスコア融合を用いるようになっているイメージです。
ある検索手法iにおけるドキュメントdの順位を
Reranker
LM(Language Model)を用いてドキュメントを質問文に対して関連する順に並べ替え直し、最終的な順位を決定するのがRerankerの役割です。基本的にはベクトル検索などで絞り込んだ文書に対してRerankerを適用してリランキングを行います。
日本語に特化して学習されたRerankerとしては、@hotchpotchさんが作成されたjapanese-reranker-cross-encoderなどがあります。
評価指標
基本的にRetrieverの評価に用いられる評価指標は推薦システムのものと同じです。以下で代表的な評価指標を幾つか紹介します。
Recall@k
各クエリに対して、上位
MRR(Mean Reciprocal Rank)
各クエリ
MAP(Mean Average Precision)
-
:上からP@j 番目の予測におけるPrecisionの値(上位j 個の予測中に正解がj 個あればPrecisionはk となる)k / j -
:y 番目のドキュメントが正解なら1、不正解なら0をとるj -
:総正解数GTP
これらの値を用いてAP(Average Precision)を以下のように計算します。
上位の予測に正解が多く含まれているほどPrecisionが高くなりスコアが大きくなるような式になっています。
このAPを各クエリに対して計算し、その平均を取ったものがMAPになります。
nDCG(normalized Discounted Cumulative Gain)
まずあるクエリに対しての上からj番目の予測について、「おすすめ度=どれだけ取ってきて欲しいか」を
これを用いてDCGを以下のように計算します。
上位予測ほど分母が小さいため影響度が大きく、
nDCG は、計算された DCG を、考えうる限り最も理想的な DCG (=予測上位ドキュメントがおすすめ度の最も高い順に並んでいるような場合)で割って正規化します。
各種クラウドサービスにおけるRetrieverの特徴
最後に各種クラウドサービスでどのようにRetrieverを実現できるのか、主に検索手法に重点を置いて提供されているサービスの特徴を見ていきます。
ざっと調べただけなので情報が古かったり解釈を間違えている可能性がありますのでご了承ください🙏
AWS
AWSでは、Retriever用のサービスとしてAmazon OpenSearch Serviceが提供されています。
Amazon OpenSearch Serviceの主な特徴としては以下が挙げられます。
- テキスト内の文字の置換、削除、テキスト分割後の後処理も指定できる
- 日本語の解析は形態素解析エンジンの Kuromoji がベースのトークナイザで行われる
- カスタム辞書を作成可能
- ハイブリッド検索は可能だが、リランカーの実装にはAmazon Kendra Rerankerとの連携が必要(参考)
- Dashboardがイケてて、データ収集・分析のための機能が豊富
他にもAmazon KendraがRetriever用のサービスとして提供されており、こちらはAmazon OpenSearch Serviceより少し料金がかかるようですが、SharePointやBoxといった外部データサービスとの連携やPDFなどのドキュメントの文章化を内部的に行えるなど便利な機能をたくさん内包しています。
Google Cloud Platform (GCP)
GCPでは、Retriever用のサービスとしてVertex AI Searchが提供されています。
Vertex AI Searchの主な特徴としては以下が挙げられます。
- Vertex AI Agent Builderの一部として内包されており、LLMを用いたエージェントアプリケーションの構築を簡単に行える
- Vertex AI の生成 AI を使用すると、テキスト エンベディングとマルチモーダル エンベディングの両方を作成することができる
- 日本語解析の機能はついておらず、ハイブリッド検索を行うには形態素解析を用いて自前でSparse Vectorを作成しなければならない(参考)
VertexAIの高性能なエンベディングモデルなどのサービスとの連携がVertex AI Search独自の強みかなと思います。
Microsoft Azure
Microsoft Azureでは、Retriever用のサービスとしてAzure AI Searchが提供されています。
Azure AI Searchの主な特徴としては以下が挙げられます。
- 日本語アナライザーを搭載しており、日本語のキーワード検索にネイティブ対応している
- セマンティックリランカーによるリランキング、Microsoft 製のLLMである Turing モデルによって抽出的要約を行った意図の答えとなるチャンクの断片をピンポイントで返してくれる「セマンティックアンサー」を機能として備えたセマンティックハイブリッド検索という強力な検索方法を使うことができる
Reranker、Sparse Embeddingモデルを用意しなくても高精度な検索を実現できることがAzure AI Searchを用いる大きな利点であるといえます。
比較
他サービスと比較して、Azure AI SearchはRerankerまでを含めた高度な検索手法をそれ単体で実現できるのが大きなアドバンテージだなと感じました。
しかし、Amazon OpenSearch Serviceにはテキスト処理のカスタマイズ性や豊富な分析機能、Vertex AI SearchにはVertex AIとの強力な連携など各サービス独自の強みがあるので、各サービスの独自の強みを活かしつつ、プロジェクトの要件に最適なものを選択することが重要です。
今回は検索手法に主に重点を置いて各サービスについて比較して見ましたが、実際にアプリケーションを構築する際にはデータをインデックスする際の手軽さ、他サービスとの連携、料金といった面も考慮に入れて考える必要があると思います。
おわりに
こちらのテックブログは,画像生成やLLM開発などを通して,社内の技術力を先導しているneoAIの研究組織「neoAI Research」メンバーで執筆しています.
「未来を創る生成AIの先駆者になろう」
neoAIでは最先端技術を駆使するプロフェッショナル集団として,業務効率化を超えて社会に新たな価値を創出していきます.あなたの好奇心と可能性を,neoAIで開花させてみませんか?
【現在採用強化中です!】
・AIエンジニア/PM職
・Biz Dev
・自社プロダクトエンジニア職
・オープンポジション
【詳しい採用情報はこちらから!】
Discussion