情報検索におけるブール検索モデルの理解
この記事では、ブール検索モデルとして知られる特定の情報検索方法について説明する。
情報検索**は、現代の推薦システムやGenerative AI (GenAI)において重要な役割を果たす基本概念である。高度なレベルでは、膨大な情報のコレクションから関連するデータを効率的に検索することを可能にする。
この記事では、ブール検索モデルとして知られる特定の情報検索方法について説明する。しかし、この方法を詳しく調べる前に、まず一般的な情報検索の概念について調べてみよう。
情報検索の重要性
あなたが気づいているかどうかにかかわらず、情報検索の概念は、私たちの生活の多くの分野や側面で使用されています。ネットサーフィンをしているときの状況を考えてみよう。特定のトピックを探すとき、通常はGoogleにそのトピックを入力する。一瞬のうちに、グーグルは関連するウェブページをいくつか表示する。
情報検索とは、その名が示すように、膨大なデータのコレクションからクエリーや質問に関連するコンテンツを検索することである。情報検索は、今日の世界の多くのユースケースに応用されている:
検索エンジン**](https://zilliz.com/learn/search-still-matters-enhance-information-retrieval-with-genai-and-vector-databases):グーグルはその代表例だ。クエリを入力すると、グーグルはオンラインで利用可能な何百万ものウェブページを素早くスキャンし、最も関連性の高い結果を表示する。
Eコマース**:AmazonやShopifyのようなプラットフォームは、顧客が購入したい商品を見つけるために情報検索技術を利用している。例えば、「男性用Tシャツ」と入力すると、一瞬で様々な男性用Tシャツが表示される。
企業の社内チャットボット:社内チャットボットは、顧客支援のためにますます人気が高まっています。これらのチャットボットは、リクエストを処理し、顧客の問題のトラブルシューティングに役立つ可能性のある関連コンテンツや記事を返します。
ソーシャルメディア情報検索と推薦システムの組み合わせにより、ソーシャルメディア・プラットフォーム上でよりパーソナライズされたフィードが作成される。例えば、YouTubeでテクノロジー関連のコンテンツを頻繁に見る場合、フィードのほとんどは動画で構成される。
情報検索システムの仕組み
一般的な情報検索システムは、以下のコンポーネントで構成されています:
ドキュメント:** ユーザーが検索可能なあらゆるコンテンツを指す。このプロセスには、YouTubeやNetflixのようなストリーミング・サービス上の動画、GoogleやBingのような検索エンジン上のウェブ・ページ、社内データベースのような情報管理システム内のデータ、画像、テキストなどが含まれる。
クエリ:これはユーザーの要求を表すもので、単語の文字列として表現することも、複雑な条件の集合として表現することもできる。クエリは、単純なキーワードからブール演算子を必要とする複雑なものまで、ユーザーが求める特定の情報を表します(例:「男性用のTシャツをAND*で探してください」)。
インデックス作成:*** 情報検索は、関連するコンテンツを高速かつ効率的に取得する必要があるため、インデックス作成は重要な役割を果たす。これは、より高速な検索のために、文書とデータベース内のその位置との間のマッピングを作成することを指します。
検索:***関連文書をユーザーに返すプロセス。ブーリアン検索やベクトル空間モデルなど、いくつかの検索方法を適用することができる。
情報検索プロセスは、保存する文書を収集することから始まる。実際には、数十万から数百万の文書が含まれることが多い。次に、収集した各文書にインデックスを付け、情報管理システム(通常はデータベース)に格納する。
構造化データは通常、従来のリレーショナル・データベースにインデックス付けされ保存されるが、画像やテキストなどの非構造化データは、ベクトル・データベースに保存する必要がある。ユースケースに応じて、異なるインデックス作成方法を実装することができる。例えば、Milvusのようなベクトルデータベースは、Inverted File Index (IVF)、[Hierarchical Navigable Small World (HNSW)]、またはProduct Quantizationなどの異なるインデックス作成方法をサポートしており、近似最近傍(ANN)検索を実行することができます。これらのインデックス作成方法については、この記事を参照してください。
図1-情報検索システムのワークフロー](https://assets.zilliz.com/Figure_1_High_level_workflow_of_the_information_retrieval_system_7aeb5afe2c.png)
すべての文書がインデックス化され、保存されると、情報検索プロセスを開始することができる。ユーザーはクエリを入力し、選択された検索アルゴリズムに基づいて、データベース内の最も関連性の高い文書がフェッチされる。一般的な検索アルゴリズムには、ブーリアン検索や、余弦距離や余弦類似度のようなベクトルベースの検索がある。
ブール検索モデルの概念
情報検索の基本的な概念を理解したところで、ブール検索モデルについて説明しよう。その名が示すように、ブール検索モデルはAND、OR、NOTなどのブール論理演算子を用いて関連文書を検索する。
AND:**クエリに含まれるすべての用語を含むすべての文書を検索します。クエリが "A AND B "の場合、AとBの両方を含む文書が検索されます。
OR:**クエリに含まれる用語のいずれかを含む文書をすべて検索します。クエリが "A OR B "の場合、AかBのどちらか、または両方を含む文書が検索される。
NOT:**クエリに含まれる特定の用語を含む文書をすべて除外する。クエリが "A AND NOT B "の場合、Aを含みBを含まない文書が検索されます。
図2- AND演算とOR演算のベン図](https://assets.zilliz.com/Figure_2_Venn_diagram_of_AND_and_OR_operations_25cbfa6e6e.png)
最も基本的な形で、ブール検索モデルは用語-文書出現率行列と呼ばれる概念を使用する。この概念はbag-of-words方式に依拠しており、2次元行列を構築する。列は文書を表し、行はすべての文書で利用可能な語彙または固有の用語を表す。
行列の各セルは、2つの値しか取り得ないブール値で表現される:0または1である。これは、ある用語が文書に存在するかどうかを表す。用語が存在する場合、値は1であり、存在しない場合、値は0である。
3つの文書があり、その中に3つの異なる用語だけが存在するとする。文書1には用語1と用語3が含まれるが用語2は含まれない。文書2には用語1のみが含まれ、文書3には用語1と用語2が含まれる。
図3-用語-文書行列の例](https://assets.zilliz.com/Figure_3_Example_of_term_document_matrix_9a5b54941b.png)
上記のように用語-文書マトリックスを設定したら、クエリを提供して、ブール検索法を実行することができる。次のようなクエリを考えてみよう:「用語1と用語2を含む文書を検索してください。このクエリを処理するために、ブール検索メソッドは以下の処理を行う:
1.用語1に関連する行を取り出す。上記の視覚化では、この値は[1, 1, 1]となる。
2.項2に関連する行を取る。上の可視化では、この値は[0, 0, 1]となる。
3.ビットごとのAND演算を行う:[1, 1, 1]と[0, 0, 1] = [0, 0, 1]。
上記のビット演算の結果に基づいて、文書3が返される。
ブール検索モデルにおける転置インデックス
上記のような用語-文書行列を実装する際の問題点は、現実には各用語に関連する行が極めて疎なことである。
10,000の文書と100,000のユニークな用語があるとしよう。上記のような用語-文書行列を実装すると、100,000 x 10,000の行列になってしまう。ほとんどの場合、その行列の各行は非常に疎になる。つまり、与えられた用語を含むドキュメントの数は限られているため、多くの0値が含まれることになる。ブール演算に必要な空間の複雑さは、文書と用語が増えるごとに二次関数的に増加する。
図4-用語-文書行列のスパース表現](https://assets.zilliz.com/Figure_4_Sparse_representation_of_term_document_matrix_d75f8aa565.png)
この問題に対処するため、通常、ブール検索モデルの効率と速度を向上させるために、転置インデックスと呼ばれる方法が実装されている。一言で言えば、用語-文書行列全体を作成する代わりに、用語xを含む文書のIDのみを格納する。言い換えれば、各用語に対して、各要素がその用語が存在する文書のIDに対応する、いわゆる転記リストを格納するのである:
図5-投稿リストの例](https://assets.zilliz.com/Figure_5_Posting_list_examples_fa34dcaac2.png)
この投稿リストを作成する最初のステップは、入力文書の前処理です。例えば、文書がテキストで構成されているとしよう。まず、トークン化、正規化、レマタイゼーション、ストップワード除去などの前処理とクリーニングを行います。これが終わったら、転置インデックスを作り始める。
わかりやすくするために、例を挙げて転置インデックスを構築してみよう。次の単語を含む2つの文書があるとする:
図6-文書例](https://assets.zilliz.com/Figure_6_Example_documents_0a1eccef43.png)
上記2つの文書のテキストをクリーニングすると、以下のようになる:
文書1:データサイエンスの研究データ
文書2:機械学習サブセット・データ・サイエンス
次に、転置インデックス法により、以下のような用語-文書IDのリストが作成される:
図7- 用語-文書IDリストへの文書](https://assets.zilliz.com/Figure_7_Documents_to_term_doc_ID_list_f8add1637d.png)
次に、用語をアルファベット順にソートする。同じ用語が複数の文書に出現する場合は、文書IDに基づいてソートする。次に、各用語について、対応する用語が出現する文書IDを含む投稿リストを作成する。
図8-ソートされた用語-文書IDリストからの投稿リスト作成](https://assets.zilliz.com/Figure_8_Posting_lists_creation_from_sorted_terms_doc_ID_list_03f1ad4112.png)
これでクエリ処理の準備が整った。クエリに基づいて検索を行う場合、最初のステップはクエリを解析し、その構造とチェックが必要な演算子(AND、OR、NOT)を理解することである。そして、優先順位の高い順に演算子を実行する。一般的には、情報検索の速度と効率を最適化するために、NOTが最初に処理され、次にANDとORが処理される。
例えば、"データ AND 学習 "というクエリがあるとしよう。このクエリは最初に解析され、AND演算子を特定する。次に、転置インデックスから "data "と "learning "という用語のリンクリストを検索する。演算子はANDなので、両投稿リストの交差点が見つかり、この場合はドキュメント2になる。したがって、ドキュメント2がユーザーに返される。
図9- 指定されたクエリに対して取得された投稿リスト](https://assets.zilliz.com/Figure_9_Retrieved_posting_lists_for_a_given_query_f92d055bb9.png)
ブール検索モデルの利点と限界
他の方法と同じように、ブール検索モデルにも利点と限界があります。従って、この方法が有用かどうかは、ユースケースに完全に依存します。以下は、この方法が提供できるいくつかの利点です:
単純性と効率性:** この方法は、理解しやすく実装しやすい単純なブール概念に基づいている。
検索結果のユーザー制御**:ブール演算子や用語を調整することで、検索結果を微調整することができます。言い換えれば、検索結果を完全にコントロールすることができます。
特に上述の転置インデックスの実装により、ブール式クエリは迅速に処理できる。システムは、文書が指定されたブール条件に一致するかどうかをチェックするだけでよい。
しかし、ブール検索モデルには次のような限界もある:
関連性に基づく結果の本質的なランク付けがない: **ブール検索は、単に文書がクエリ条件に一致するかどうかを判断するだけである。これは、クエリとの一致度やユーザーのニーズとの潜在的な関連性に基づいて結果を順序付ける方法を提供しません。
ユーザーがブール論理と演算子を理解する必要性: **すべてのユーザーがブール論理に精通しているわけではないので、これらのシステムを効果的に使用する障壁となる可能性がある。この制限のために、多くの場合、ユーザーのトレーニングや、ブール式クエリの複雑さを抽象化するユーザーフレンドリーなインターフェースの実装が必要となります。
ブール検索の二項対立的な性質(文書が関連性があるかないか)は、微妙な結果の欠如につながる可能性がある。このモデルの核となるコンセプトは、完全な用語の一致に基づいているため、クエリと意味的に類似していない検索結果が得られる可能性がある。
最新の検索システムにおけるブール検索モデルの応用例
ブール検索モデルの核となる概念は非常にシンプルであるが、今日のアプリケーションではまだ広く実装されている。情報検索プロセスでは、しばしばベクトル空間モデルのような高度な手法と組み合わされます。
ベクトル空間モデルは、文書とクエリをベクトル埋め込みとして表現する、もう一つの情報検索手法である。各文書をベクトル埋め込みに変換するには、OpenAI, HuggingFace, Voyage AI, Sentence Transformers などの様々な埋め込みモデルを利用することができます。
これらの埋め込みは、それらが表現する文書の意味的な意味を持っているので、この方法はクエリと意味的に類似した結果を取り出すことができる。これは、ブール検索モデルに欠けている能力である。
図10- 2次元ベクトル空間におけるベクトル埋め込み](https://assets.zilliz.com/Figure_10_Vector_embeddings_in_2_D_vector_space_e39129c7ba.png)
ブール検索モデルとベクトル空間モデルを組み合わせる場合、通常、このアプローチをハイブリッド検索システムと呼ぶ。本節では、オープンソースのベクトルデータベースであるMilvusの助けを借りて、ハイブリッド検索システムを実装する。
まず、Milvusのインストールから始めよう。Milvusをインストールする最も簡単な方法は、Milvus Liteを利用することです。以下のpipコマンドを実行することでインストールできます:
pip install pymilvus
pymilvus [モデル] をインストールします。
以下のように、商品データとそれに対応する色があるとします:
product_color = ['青', '緑', '青', '白'] とする。
product_title = ['便座バンパー', 'ヘッドセットApple', 'ヘッドセットJBL ', 'ヘッドセットSony']。
ここで、各商品タイトルを埋め込みモデルを使ってベクトル埋め込みに変換する必要があります。そのために、Milvusに統合されている文変換モデルを使います。
from pymilvus import model
sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
model_name='all-MiniLM-L6-v2', # モデル名を指定する。
device='cpu' # 使用するデバイスを指定(例:'cpu'または'cuda:0'
)
product_title_vector = sentence_transformer_ef.encode_documents(product_title)
次に、すべてのデータ、すなわち、商品ID、商品タイトル、商品タイトルベクトル、色をベクトルデータベースに格納しましょう。Milvus Liteを使えば、わずか数行のコードでこの処理を終えることができる:
from pymilvus import MilvusClient
クライアント = MilvusClient("./milvus_demo.db")
client.create_collection(
コレクション名="product_color_collection"、
dimension=384 # このデモで使用するベクトルは384次元です。
)
data = [ {"id": i, "vector": product_title_vector[i], "color": product_color[i], "title": product_title[i]} for i in range(len(product_title_vector))]
res = client.insert(
collection_name="product_color_collection"、
データ=データ
)
これで情報検索を行う準備が整った。
例えば次のようなクエリがあったとしよう:"_音楽を聴くのに使える製品を探してください。"とすると、以下のようにベクトル空間モデルを使って関連製品を検索することができます:
query = "音楽を聴くのに使える製品を探してください"
query_vector = sentence_transformer_ef.encode_queries([query])
res = client.search(
コレクション名="product_color_collection"、
data=query_vector、
limit=5、
output_fields=["title", "color"]、
)
print(res)
"""
出力する
データ["[{'id':1, 'distance':0.3618576228618622, 'entity':{'color': 'green', 'title':'Headset Apple'}}, {'id':3, 'distance':0.3233926296234131, 'entity':{'color': 'white', 'title':'Headset Sony'}}, {'id': 2, 'distance':0.2899249494075775, 'entity':{'color': 'blue', 'title':'ヘッドセット JBL '}}]]"
"""
上記のベクトル空間モデルによる情報検索では、異なるブランドのヘッドセットのリストが得られる。しかし、ブール検索モデルで結果を絞り込み、より具体的にすることができる。
ブール検索モデルでは、特定の色のセットを持つ製品を出すようにシステムに要求することもできます。次のクエリでは、白か緑のどちらかの色を持つ関連製品を返すようにシステムに要求します。
res = client.search(
コレクション名="product_color_collection"、
data=query_vector、
filter='(color == "green") or (color == "white")'、
limit=5、
output_fields=["title", "color"]、
)
print(res)
"""
出力する
データ["[{'id':1, 'distance':0.3618576228618622, 'entity':{'color': 'green', 'title':'Headset Apple'}}, {'id':3, 'distance':0.3233926296234131, 'entity':{'color': 'white', 'title':'ヘッドセット ソニー'}}"]
"""
そして今、緑と白のヘッドセットを残して、青のヘッドセットは除外された!
見てわかるように、ブール検索メソッドは現代の情報検索システムでも重要な役割を果たしている。色、サイズ、材質などの特定のメタデータを出力したい場合は、ブール検索モデルを使って検索結果をさらに絞り込むことができる。
結論
ブール検索モデルは、AND、OR、NOTなどのブール論理演算子を用いた情報検索手法である。AND演算はクエリに含まれる全ての用語を含む全ての文書を検索する。OR演算はクエリに含まれるいずれかの用語を含むすべての文書を検索し、NOT演算はクエリに含まれる特定の用語を含むすべての文書を除外する。
ブーリアン検索モデルは、検索プロセスを高速化し改善するために、転置インデックス・アプローチを利用する。このアプローチでは、特定の用語を含むすべての文書を転記リストとして保存するため、用語や文書の数が増えても拡張性の低い用語-文書行列を作成する必要がない。現在では、ブール検索モデルは、ベクトル空間モデルなど、より高度な情報検索システムでよく使われている。
その他のリソース
あなたのGenAIアプリのためのトップパフォーマンスAIモデル ](https://zilliz.com/ai-models)
ジェネレーティブAIリソースハブ ](https://zilliz.com/learn/generative-ai)
RAGとは ](https://zilliz.com/learn/Retrieval-Augmented-Generation)
情報検索とは何か? 総合ガイド](https://zilliz.com/learn/what-is-information-retrieval)
情報検索メトリクス](https://zilliz.com/learn/information-retrieval-metrics)
リランカーとは何か、そしてリランカーはどのように情報検索を強化するのか](https://zilliz.com/learn/what-are-rerankers-enhance-information-retrieval)
読み続けて

サーチ・スティル・マターズ生成AIとベクトル・データベースによる情報検索の強化
ChatGPTのようなLLMの進歩にもかかわらず、検索は依然として重要である。GenAIと検索やベクターデータベースを組み合わせることで、検索の精度とエクスペリエンスが向上する。

リランカーとは何か、そしてリランカーはどのように情報検索を強化するのか?
この記事では、リランカーの背後にある概念を探求し、検索と検索拡張世代(RAG)アプリケーションを強化するために、リランカーを広く採用されているオープンソースのベクトルデータベースであるMilvusと統合する方法を示す。

ChatGPTのようなGenAIはGoogle検索を置き換えるのか?
この記事では、GenAIと従来の検索エンジンがどのように機能するかを探り、それぞれの長所と短所を比較し、両テクノロジーを統合する可能性について議論する。