😎

RAGシステム導入前に、全文検索 / セマンティック検索 / ハイブリット検索を整理してみた

2025/02/07に公開

はじめに

ChatGPTを活用したRAGシステムの開発案件に参画することになったので、キャッチアップしたことを記載していきます。RAG(Retrieval Augmented Generation)とは検索拡張生成のことで、社内専用GPTと言えばイメージしやすいでしょう。AIに企業独自のデータ(大量の社内ナレッジや文書、就業規則など)を学習させ、そのデータを元にAIが適宜回答します。また、外部のAIモデルがその企業独自データを学習することはないため、データ流出の心配はなく、セキュリティ面でも安心です。

主なユースケース

こちらが参考になります。
https://www.softbank.jp/biz/blog/business/articles/202409/rag-usecases/

https://intersect.inc/scW0fnId/XeACzPPa#index_M6xjAsjy

他にも、

  • 企業のFAQシステム
  • カスタマーサポート
  • ドキュメント管理システム

などなど、大手企業での導入が目立っています。もちろん中小企業や個人事業主でもRAGを活用できます。ただ、個人事業主などはNotion AIでいいのでは?と思ったりします。

RAGで重要になってくるのが検索精度。実装の前にまずは検索エンジンの仕組みについて知る必要があるようなので、今回はいくつかの検索技術をご紹介します。

全文検索

いわゆるキーワード検索で、一番馴染みのある検索方法かと思います。社内ドキュメントやデータベースから検索キーワードが含まれる情報をすべて見つけ出すのですが、グーグル検索エンジン等にも同じ技術が使われています。「ラーメン」と検索したら「ラーメン」が含まれるサイトや画像等が検索結果に並べられますよね。ただし文字列の一致が前提条件なのであって、言葉の意味を理解しているわけではありません。そのため関連性の高い柔軟な検索結果を返すわけではないのがデメリットと言えます。

全文検索には大きく2種類あります。

grep

検索する度にドキュメントを1~10まで調べる方法です。小規模データ向けのシンプルな実装になるので処理速度が速いのが特徴ですが、ドキュメントデータが大量になると遅くなります。

索引型

一方索引型は、大量データでも高速に処理される特徴があります。理由はあらかじめドキュメントにインデックスを作成し、そのインデックスリストの中から検索するからです。例えば「単語Aは、文書XのN行目と、文書YのN行目に記載されている」というようなリストです。一方で、そのインデックスリストを作成する手間、変更の度に再構築する手間などが発生するのがデメリットです。一般的にはこの索引型の全文検索が広く使われています。

セマンティック検索

入力キーワードから意図や意味を理解し、その解釈に基づいて最も関連性の高いワードや文書を探す方法です。例えば「世界中で愛される日本のアニメといえば?」に対して「One Peace」「NARUTO」などが回答されるイメージです。ChatGPTなどの生成AIはもちろん、SNSのレコメンド機能などにも活用されています。

自然言語の文脈を理解して単語の意味を区別できるのがメリットですが、意味の解析やアルゴリズムへのリソースが必要なので開発・運用コストが高い。そしてその回答が必ずしも完全ではないのがデメリットです。

ベクトル検索

セマンティック検索の一種です。テキストや画像などの非構造化データを、コンピュータが理解しやすいベクトル(数値表現)に変換し、数学的な近さで検索結果を返します。意味的に近いもの=数学的に近いものと判別。例えば「犬」と「猫」はどちらもペットとして飼われるのでベクトル距離が近いです。しかし「犬」と「自転車」は類似性も関連性も低いのでベクトル距離は遠いです。

(例)
  • → [0.21, 0.75, -0.12, 0.60]
  • → [0.22, 0.77, -0.10, 0.58]
  • 自転車 → [-0.45, 0.12, 0.60, -0.83]

ベクトル化するので全文検索に比べて処理が高速である一方で、類似性を学習させる元データの用意など、学習コストがかかってくるのがデメリットです。例えば、「SA」が含まれる文章を入力した時、その文脈では「サービスエリア」を指すのか「サイバーエージェント」を指すのか学習させなければいけません。

ハイブリット検索

異なる種類の検索手法を組み合わせたもので、例えばAzure AI Searchではベクトル検索とセマンティック検索のハイブリット検索が活用されています。

検索手法 説明
キーワードの厳密一致
(全文検索の強み)
ユーザーが入力した単語やフレーズを確実に拾い上げる
文脈や意味レベルでの近似値
(セマンティック検索の強み)
ユーザーの曖昧な意図や、
言い回しの違い(「規定」と「ルール」「ガイドライン」など)の
類似関係をくみ取る

このように、より検索精度高く検索結果を提供できるのがハイブリット検索の強みです。意味的な近さと数値的な近さを利用するので、ユーザーの意図をより汲み取りやすいモデルと言えます。開発コストはかかりますが、より精度の高い回答を得ることができるため、RAGシステムを導入する際の手法としてはこのハイブリット検索が導入されるケースが多いようです。

まとめ

検索方法 メリット デメリット
全文検索(grep型) - 単純で実装が簡単
- 高速で検索可能(小規模データに有効)
- 正規表現などを使った柔軟な検索が可能
- 意味の理解がないため、キーワードが一致するだけ
- 同義語や文脈に対する柔軟性が低い
- 大規模データに対しては非効率
全文検索(索引型) - 検索速度が速い(索引を使うため)
- 大規模データでも効率的
- 特定のキーワードやフレーズに基づく検索が可能
- 意味的な関連性を捉えられない
- 高度な自然言語の理解ができない
- 同義語や言い回しに弱い
セマンティック検索 - 文脈や意味に基づいて関連性のある結果を返す
- 同義語や類似語も捉えられる
- ユーザーの意図に合った結果を提供可能
- 高度な解析が必要で、導入が複雑
- データ量が膨大になると性能が落ちる
- 実装において計算リソースが必要
ベクトル検索 - 単語の意味を数値ベクトルで表現し、類似度計算が可能
- セマンティック検索を数値的に実現
- 高度な類似性を見つけることができる
- ベクトルの生成には事前学習やモデルが必要
- 計算リソースが高い
- 誤差や近似による検索精度の低下があり得る
ハイブリッド検索 - セマンティック検索とベクトル検索を組み合わせることで、より精度高く検索結果を提供
- 意味的な関連性と数値的な近さの両方を利用
- ユーザーの意図をより良く反映できる
- 実装が複雑で、システムのパフォーマンスに影響を与える可能性
- 複数の技術を組み合わせるため、保守が難しい
- 計算コストやデータの前処理に多くのリソースが必要
GitHubで編集を提案

Discussion