Cassandra ドキュメント

バージョン

プレリリースバージョンのドキュメントを表示しています。

ベクター検索クイックスタート

機械学習モデルを有効にするために、ベクター検索は、接続によって明示的に定義されていなくても、データベース内で類似性によって比較されるデータを使用します。ベクトルは、特定のオブジェクトまたはエンティティを表す浮動小数点型の配列です。

ベクター検索の基礎は、埋め込みにあります。埋め込みとは、テキストを浮動小数点数のベクトルのコンパクトな表現のことです。これらの埋め込みは、ニューラルネットワークを使用して入力を固定長のベクトルに変換するAPIにテキストを入力することで生成されます。埋め込みはテキストのセマンティックな意味を捉え、従来の単語ベースのアプローチよりも微妙な理解を提供します。ベクトル表現により、実質的に類似した入力は幾何学的に近い出力ベクトルを生成し、類似していない入力は幾何学的に離れた位置に配置されます。

ベクター検索を有効にするには、ベクター検索を備えたCassandraデータベースで新しい`vector`データ型を使用できます。

前提条件

前提条件はありません。

一般的に、Apache Cassandraでベクター検索を使用するには、次の手順に従います。

このクイックスタートでは、埋め込みはランダムに生成されました。一般的には、ソースドキュメント/コンテンツと、一致させるために要求されたクエリを両方とも埋め込みジェネレーターに通します。この例は、CQLを使用してベクター検索データオブジェクトを使用する方法の仕組みを示すためだけのものです。

ベクターキー空間の作成

ベクター検索テーブルに使用するキー空間を作成します。この例では、`cycling`を`keyspace name`として使用します。

CREATE KEYSPACE IF NOT EXISTS cycling
   WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };

ベクターキー空間の使用

ベクター検索テーブルに使用するキー空間を選択します。この例では、`cycling`を`keyspace name`として使用します。

USE cycling;

ベクターテーブルの作成

ベクトルを含む`comments_vector`列を含む、キー空間内に新しいテーブルを作成します。以下のコードは、5つの値を持つベクトルを作成します。

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);

必要に応じて、既存のテーブルを変更してベクトル列を追加できます。

ALTER TABLE cycling.comments_vs
   ADD comment_vector VECTOR <FLOAT, 5>(1)

ベクターインデックスの作成

Storage Attached Indexing (SAI) を使用してカスタムインデックスを作成します。

CREATE INDEX IF NOT EXISTS ann_index
  ON cycling.comments_vs(comment_vector) USING 'sai';

SAIの詳細については、Storage Attached Indexing のドキュメントを参照してください。

インデックスは、類似度関数を定義するオプションを使用して作成できます。

CREATE INDEX IF NOT EXISTS ann_index
    ON vsearch.com(item_vector) USING 'sai'
WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT' };

`similarity_function`の有効な値は、`DOT_PRODUCT`、`COSINE`、または`EUCLIDEAN`です。

データベースへのベクターデータの読み込み

新しい型を使用してテーブルにデータを入力します。

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-02-14 12:43:20-0800',
      'Raining too hard should have postponed',
      'Alex',
      [0.45, 0.09, 0.01, 0.2, 0.11]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-03-21 13:11:09.999-0800',
      'Second rest stop was out of water',
      'Alex',
      [0.99, 0.5, 0.99, 0.1, 0.34]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      e7ae5cf3-d358-4d99-b900-85902fda9bb0,
      '2017-04-01 06:33:02.16-0800',
      'LATE RIDERS SHOULD NOT DELAY THE START',
      'Alex',
      [0.9, 0.54, 0.12, 0.1, 0.95]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      totimestamp(now()),
      'The gift certificate for winning was the best',
      'Amy',
      [0.13, 0.8, 0.35, 0.17, 0.03]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-02-17 12:43:20.234+0400',
      'Glad you ran the race in the rain',
      'Amy',
      [0.3, 0.34, 0.2, 0.78, 0.25]
);

INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-03-22 5:16:59.001+0400',
      'Great snacks at all reststops',
      'Amy',
      [0.1, 0.4, 0.1, 0.52, 0.09]
);
INSERT INTO cycling.comments_vs (record_id, id, created_at, comment, commenter, comment_vector)
   VALUES (
      now(),
      c7fceba0-c141-4207-9494-a29f9809de6f,
      '2017-04-01 17:43:08.030+0400',
      'Last climb was a killer',
      'Amy',
      [0.3, 0.75, 0.2, 0.2, 0.5]
);

CQLを使用したベクターデータのクエリ

ベクター検索を使用してデータにクエリを実行するには、`SELECT`クエリを使用します。

SELECT * FROM cycling.comments_vs
    ORDER BY comment_vector ANN OF [0.15, 0.1, 0.1, 0.35, 0.55]
    LIMIT 3;

結果の一部として、クエリデータに最も近い最高スコアのノードの類似度計算を取得するには、`SELECT`クエリを使用します。

SELECT comment, similarity_cosine(comment_vector, [0.2, 0.15, 0.3, 0.2, 0.05])
    FROM cycling.comments_vs
    ORDER BY comment_vector ANN OF [0.1, 0.15, 0.3, 0.12, 0.05]
    LIMIT 1;

このタイプのクエリでサポートされている関数は次のとおりです。

  • similarity_dot_product

  • similarity_cosine

  • similarity_euclidean

パラメータは(<vector_column>,<embedding_value>)です。両方のパラメータはベクトルを表します。

  • 制限は1,000以下にする必要があります。

  • ベクター検索はApproximate Nearest Neighbor (ANN) を使用しており、ほとんどの場合、完全一致とほぼ同じ結果が得られます。スケーリングはExact Nearest Neighbor (KNN) よりも優れています。

  • 類似度の低い検索はサポートされていません。

  • `item_vector`列のオーバーライトまたは削除がないテーブルでは、ベクター検索は最適に機能します。変更のある`item_vector`列では、検索結果が遅くなる可能性があります。

コード例を使用して、ベクター検索の動作例を確認できます。独自のデータを読み込み、検索機能を使用してください。