AlloyDB Omni でベクトル検索を実行する

ドキュメントのバージョンを選択してください。

このチュートリアルでは、AlloyDB Omni でベクトル検索を設定して実行する方法について説明します。正確な最近傍検索(KNN)と近似最近傍(ANN)ベースの ScaNN インデックスを使用してクエリを実行します。また、ScaNN インデックスを使用してフィルタ付きベクトル検索クエリを効率的に実行する方法についても説明します。

目標

  • AlloyDB Omni に AlloyDB AI をインストールする。
  • データベースに接続し、必要な拡張機能をインストールする。
  • product テーブルと product inventory テーブルを作成します。
  • product テーブルと product inventory テーブルにデータを挿入し、基本的なベクトル検索を実行します。
  • products テーブルに ScaNN インデックスを作成する。
  • ベクトル検索を実行する。
  • フィルタと結合を使用して複雑なベクトル検索を実行する。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを算出できます。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

前提条件

ベクトル検索を実行する前に、次の前提条件を満たす必要があります。

コンピューティング環境に基づいて AlloyDB Omni に AlloyDB AI をインストールする

使用しているコンピューティング環境に基づいて、AlloyDB Omni に AlloyDB AI をインストールするの手順に沿って AlloyDB Omni をインストールします。

psql を使用してデータベースに接続する

psql を使用してデータベースに接続します。

    export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=my-db-cluster,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}'`
    kubectl exec -ti $DBPOD -c database -- psql -h localhost -U postgres

必要な拡張機能をインストールする

次のクエリを実行して、vectoralloydb_scanngoogle_ml_integration の拡張機能をインストールします。

  CREATE EXTENSION IF NOT EXISTS vector;
  CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

商品と商品在庫データを挿入して基本的なベクトル検索を実行する

このチュートリアルでは、product_inventory テーブルと product テーブルを使用して、複雑なベクトル検索クエリを実行します。

  1. 次のステートメントを実行して、次の処理を行う product テーブルを作成します。

    • 基本的な商品情報を保存します。
    • 各商品の商品説明のエンベディング ベクトルを計算して保存する embedding ベクトル列が含まれています。
      CREATE TABLE product (
        id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        category VARCHAR(255),
        color VARCHAR(255),
        embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004', description)) STORED
      );
    
  2. 次のクエリを実行して、利用可能な在庫と対応する価格に関する情報を保存する product_inventory テーブルを作成します。

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. 次のクエリを実行して、商品データを product テーブルに挿入します。

    INSERT INTO product (id, name, description,category, color) VALUES
    (1, 'Stuffed Elephant', 'Soft plush elephant with floppy ears.', 'Plush Toys', 'Gray'),
    (2, 'Remote Control Airplane', 'Easy-to-fly remote control airplane.', 'Vehicles', 'Red'),
    (3, 'Wooden Train Set', 'Classic wooden train set with tracks and trains.', 'Vehicles', 'Multicolor'),
    (4, 'Kids Tool Set', 'Toy tool set with realistic tools.', 'Pretend Play', 'Multicolor'),
    (5, 'Play Food Set', 'Set of realistic play food items.', 'Pretend Play', 'Multicolor'),
    (6, 'Magnetic Tiles', 'Set of colorful magnetic tiles for building.', 'Construction Toys', 'Multicolor'),
    (7, 'Kids Microscope', 'Microscope for kids with different magnification levels.', 'Educational Toys', 'White'),
    (8, 'Telescope for Kids', 'Telescope designed for kids to explore the night sky.', 'Educational Toys', 'Blue'),
    (9, 'Coding Robot', 'Robot that teaches kids basic coding concepts.', 'Educational Toys', 'White'),
    (10, 'Kids Camera', 'Durable camera for kids to take pictures and videos.', 'Electronics', 'Pink'),
    (11, 'Walkie Talkies', 'Set of walkie talkies for kids to communicate.', 'Electronics', 'Blue'),
    (12, 'Karaoke Machine', 'Karaoke machine with built-in microphone and speaker.', 'Electronics', 'Black'),
    (13, 'Kids Drum Set', 'Drum set designed for kids with adjustable height.', 'Musical Instruments', 'Blue'),
    (14, 'Kids Guitar', 'Acoustic guitar for kids with nylon strings.', 'Musical Instruments', 'Brown'),
    (15, 'Kids Keyboard', 'Electronic keyboard with different instrument sounds.', 'Musical Instruments', 'Black'),
    (16, 'Art Easel', 'Double-sided art easel with chalkboard and whiteboard.', 'Arts & Crafts', 'White'),
    (17, 'Finger Paints', 'Set of non-toxic finger paints for kids.', 'Arts & Crafts', 'Multicolor'),
    (18, 'Modeling Clay', 'Set of colorful modeling clay.', 'Arts & Crafts', 'Multicolor'),
    (19, 'Watercolor Paint Set', 'Watercolor paint set with brushes and palette.', 'Arts & Crafts', 'Multicolor'),
    (20, 'Beading Kit', 'Kit for making bracelets and necklaces with beads.', 'Arts & Crafts', 'Multicolor'),
    (21, '3D Puzzle', '3D puzzle of a famous landmark.', 'Puzzles', 'Multicolor'),
    (22, 'Race Car Track Set', 'Race car track set with cars and accessories.', 'Vehicles', 'Multicolor'),
    (23, 'RC Monster Truck', 'Remote control monster truck with oversized tires.', 'Vehicles', 'Green'),
    (24, 'Train Track Expansion Set', 'Expansion set for wooden train tracks.', 'Vehicles', 'Multicolor');
    
  4. 省略可: データが product テーブルに挿入されていることを確認するには、次のクエリを実行します。

    SELECT * FROM product;
    
  5. 次のクエリを実行して、在庫データを product_inventory テーブルに挿入します。

    INSERT INTO product_inventory (id, product_id, inventory, price) VALUES
    (1, 1, 9, 13.09),
    (2, 2, 40, 79.82),
    (3, 3, 34, 52.49),
    (4, 4, 9, 12.03),
    (5, 5, 36, 71.29),
    (6, 6, 10, 51.49),
    (7, 7, 7, 37.35),
    (8, 8, 6, 10.87),
    (9, 9, 7, 42.47),
    (10, 10, 3, 24.35),
    (11, 11, 4, 10.20),
    (12, 12, 47, 74.57),
    (13, 13, 5, 28.54),
    (14, 14, 11, 25.58),
    (15, 15, 21, 69.84),
    (16, 16, 6, 47.73),
    (17, 17, 26, 81.00),
    (18, 18, 11, 91.60),
    (19, 19, 8, 78.53),
    (20, 20, 43, 84.33),
    (21, 21, 46, 90.01),
    (22, 22, 6, 49.82),
    (23, 23, 37, 50.20),
    (24, 24, 27, 99.27);
    
  6. 次のベクトル検索クエリを実行して、music という単語に類似する商品を検索します。商品の説明に music という単語が明示的に書かれていなくても、検索結果にはそのクエリに関連する商品が表示されます。

    SELECT * FROM product
    ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
    LIMIT 3;
    

    インデックスを作成せずに基本的なベクトル検索を実行すると、AlloyDB AI は KNN を使用します。KNN により効率的な再現率が得られますが、規模が大きくなるとパフォーマンスに影響する可能性があります。より良いクエリ パフォーマンスを得るためには、ANN 検索用の ScaNN インデックスを使用することをおすすめします。ScaNN により、高い再現率を維持しながら低レイテンシで検索できます。

    インデックスを作成しない場合、AlloyDB Omni はデフォルトで KNN を使用します。

products テーブルに ScaNN インデックスを作成する

次のクエリを実行して、product テーブルに product_index ScaNN インデックスを作成します。

  CREATE INDEX product_index ON product
  USING scann (embedding cosine)
  WITH (num_leaves=5);

num_leaves パラメータは、ツリーベースのインデックスがインデックスの構築に使用するリーフノードの数を示します。このパラメータのチューニング方法について詳しくは、ベクトルクエリのパフォーマンスをチューニングするをご覧ください。

次のベクトル検索クエリを実行して、自然言語クエリ music に類似した商品を検索します。商品の説明に music という単語が含まれていなくても、クエリに関連する商品が結果に表示されます。

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
  LIMIT 3;

scann.num_leaves_to_search クエリ パラメータは、類似性検索中に検索されるリーフノードの数を制御します。num_leavesscann.num_leaves_to_search のパラメータ値を調整することで、クエリのパフォーマンスと再現率のバランスをとることができます。

次の複雑なベクトル検索クエリを実行します。フィルタが適用されていても、クエリ条件を満たす関連する結果が返されます。

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product p
JOIN product_inventory pi ON p.id = pi.product_id
WHERE pi.price < 80.00
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;

クリーンアップ

データベース クラスタを削除する

      kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=merge

AlloyDB Omni Operator をアンインストールする

Kubernetes クラスタから AlloyDB Omni Kubernetes オペレーターをアンインストールする手順は次のとおりです。

  1. すべてのデータベース クラスタを削除します。

          for ns in $(kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.namespace}{"\n"}{end}'); do
          for cr in $(kubectl get dbclusters.alloydbomni.dbadmin.goog -n $ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do
          kubectl patch dbclusters.alloydbomni.dbadmin.goog $cr -n $ns --type=merge -p '{"spec":{"isDeleted":true}}'
          done
          done
      ```
  2. 次のコマンドを実行して、AlloyDB Omni Kubernetes オペレーターがすべてのデータベース クラスタを削除したことを確認します。

        kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces
  3. AlloyDB Omni Kubernetes オペレーターによって作成された他のリソースを削除します。

        kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespaces
  4. AlloyDB Omni Kubernetes オペレーターをアンインストールします。

        helm uninstall alloydbomni-operator --namespace alloydb-omni-system
  5. AlloyDB Omni Kubernetes オペレーターに関連する Secret、カスタム リソースの説明、Namespace をクリーンアップします。

        kubectl delete certificate -n alloydb-omni-system --all
        kubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,ANNOTATION:.metadata.annotations.cert-manager\.io/issuer-name | grep -E 'alloydbomni|dbs-al' | awk '{print $1 " " $2}' | xargs -n 2 kubectl delete secret -n
        kubectl delete crd -l alloydb-omni=true
        kubectl delete ns alloydb-omni-system

次のステップ