すべてのプロダクト
Search
ドキュメントセンター

DashVector:キーワード対応セマンティック検索

最終更新日:Jan 08, 2025

背景

キーワード検索とその制限

従来、情報検索はキーワードに基づいて、次のプロセスで実装されていました。

  1. Web ページなどのコーパスからキーワードが抽出されます。

  2. 転置インデックスを作成し、単語頻度-逆文書頻度 (TF-IDF) や Best Match 25 (BM25) などのアルゴリズムを適用することにより、これらのキーワードとコーパスの間のマッピングが確立されます。TF-IDF および BM25 では、通常、スパースベクトルを使用して単語頻度を表します。

  3. 検索中に、検索語からキーワードが抽出され、手順 2 で確立されたマッピングに基づいて、類似性によって上位 K 個のコーパスをリコールするために使用されます。

image.png

ただし、キーワード検索には、検索語の文脈上の意味を判断する機能がありません。たとえば、「土砂降り」を意味する慣用句である「rain cats and dogs」を検索すると、検索では「rain」、「cats」、および「dogs」というキーワードに関するドキュメントが返される可能性がありますが、慣用句的な意味は返されません。

セマンティックベクトル検索

AI 技術の進化のおかげで、セマンティック埋め込みモデルは強化されています。徐々に、セマンティックベクトル検索は情報リコールの主流の方法になりつつあります。実装プロセスは次のとおりです。

  1. 埋め込みモデルを使用して、コーパス (Web ページなど) からベクトル、より具体的にはデンスベクトルが生成されます。

  2. ベクトルはベクトル検索システムに格納されます。

  3. 検索中に、埋め込みモデルを使用して検索語からベクトルが生成され、ベクトル検索システムから最短距離にある上位 K 個のコーパスをリコールするために使用されます。

image.png

確かに、セマンティックベクトル検索には制限があります。つまり、より良い結果を得るには、セマンティック理解の観点から埋め込みモデルの継続的な最適化に依存しています。たとえば、モデルが「rice irrigating」と「irrigating rice」が類似の意味を持つことを認識できない場合、「rice irrigating」という検索語では「irrigating rice」に関するコーパスをリコールできません。キーワード検索は、この場合、「rice」と「irrigating」というキーワードに基づいてコーパスを効果的にリコールできるため、より優れたパフォーマンスを発揮します。

キーワード検索 + セマンティックベクトル検索

前述の欠点を克服するために、キーワード検索とセマンティックベクトル検索の両方を実装し、次の図に示すように、両方の方法を使用してリコールされたレコードを一緒にランク付けするサービスとシステムが開発されています。このようにして、キーワード検索またはセマンティックベクトル検索の単独実装と比較して、より優れた検索パフォーマンスを実現できます。

image.png

ただし、この複合検索方式には、次の欠点があります。

  1. システムの複雑さが増します。

  2. より多くのハードウェアリソース (メモリ、 CPU 、およびディスクリソース) が消費されます。

  3. 保守性が損なわれます。

  4. ......

キーワード対応セマンティック検索

DashVector は、デンスベクトルとスパースベクトルの両方をサポートしています。デンスベクトルは埋め込みによって高次元データの特徴を表すために使用され、スパースベクトルはキーワードと単語頻度を表すために使用されます。 DashVector が検索メカニズムで両方のベクトルを使用する場合、キーワード対応セマンティック検索を実行します。

image.png

この検索方式は、上記の 3 つの検索方式の長所を活用すると同時に、システムの複雑さの増加やリソースのオーバーヘッドなどの制限を最小限に抑えます。有効性と効率性のバランスにより、DashVector はほとんどのビジネスシナリオに適した汎用性の高いツールになります。

説明

スパースベクトルは、多くのゼロ値と非常に少数のゼロ以外の値で構成されます。 DashVector では、スパースベクトルを使用して、単語頻度などの情報を表すことができます。たとえば、スパースベクトル {1:0.4, 10000:0.6, 222222:0.8} では、3 つの異なるキーワードを表す要素 1、10000、および 222222 のみがゼロ以外の値を持ちます。これらの値は、キーワードの重みを表します。

前提条件

  • クラスタが作成されていること。詳細については、「クラスタの作成」をご参照ください。

  • API キーを取得していること。詳細については、「API キーの管理」をご参照ください。

  • 最新バージョンの SDK がインストールされていること。詳細については、「DashVector SDK のインストール」をご参照ください。

手順 1. スパースベクトルをサポートするコレクションを作成する

説明
  1. コードを正しく実行するには、サンプルコードの YOUR_API_KEY を API キーに、YOUR_CLUSTER_ENDPOINT をクラスタエンドポイントに置き換える必要があります。

  2. この例では、スパースベクトルを使用した検索を示しています。簡単にするために、デンスベクトルの次元数は 4 に設定されています。

import dashvector

client = dashvector.Client(
    api_key='YOUR_API_KEY',  // APIキーを指定します
    endpoint='YOUR_CLUSTER_ENDPOINT' // クラスタエンドポイントを指定します
)

ret = client.create('hybrid_collection', dimension=4, metric='dotproduct')

collection = client.get('hybrid_collection')
assert collection
重要

ドット積メトリック (metric='dotproduct') を使用するコレクションのみがスパースベクトルをサポートします。

手順 2. スパースベクトルを含むドキュメントを挿入する

from dashvector import Doc

collection.insert(Doc(
    id='A',
    vector=[0.1, 0.2, 0.3, 0.4],  // デンスベクトルを指定します
    sparse_vector={1: 0.3, 10:0.4, 100:0.3} // スパースベクトルを指定します
))

手順 3. スパースベクトルを含むベクトル検索を開始する

docs = collection.query(
    vector=[0.1, 0.1, 0.1, 0.1],  // 検索対象のデンスベクトルを指定します
    sparse_vector={1: 0.3, 20:0.7} // 検索対象のスパースベクトルを指定します
)

スパースベクトルエンコーダー

  • DashText は、DashVector に推奨されるスパースベクトルエンコーダーです。詳細については、「クイックスタート」をご参照ください。