ベクトル検索を行う


このチュートリアルでは、 Google Cloud コンソールを使用して、AlloyDB for PostgreSQL でベクトル検索を設定して実行する方法について説明します。ベクトル検索機能の例が含まれていますが、これらはデモ目的のみを対象としています。

Vertex AI エンベディングでベクトル検索を行う方法については、AlloyDB AI でベクトル エンベディングの使用を開始するをご覧ください。

目標

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

料金

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

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

始める前に

課金と必要な API を有効にする

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します。

  3. AlloyDB for PostgreSQL の作成と接続に必要な Cloud API を有効にします。

    API を有効にする

    1. [プロジェクトを確認] の手順で、[次へ] をクリックして、変更するプロジェクトの名前を確認します。
    2. [API を有効にする] の手順で、[有効にする] をクリックして、次の機能を有効にします。

      • AlloyDB API
      • Compute Engine API
      • Service Networking API
      • Vertex AI API

AlloyDB クラスタとプライマリ インスタンスを作成する

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. [クラスタを作成] をクリックします。

  3. [クラスタ ID] に「my-cluster」と入力します。

  4. パスワードを入力します。このパスワードは、このチュートリアルで使用するためメモしておきます。

  5. リージョンを選択します(例: us-central1 (Iowa))。

  6. デフォルトのネットワークを選択します。

    限定公開アクセス接続がある場合は、次のステップに進みます。接続が設定されていない場合は、[接続をセットアップ] をクリックし、次の手順を行います。

    1. [IP 範囲を割り振る] で、[自動的に割り振られた IP 範囲を使用する] をクリックします。
    2. [続行]、[接続を作成] の順にクリックします。
  7. [ゾーンの可用性] で [シングルゾーン] を選択します。

  8. 2 vCPU,16 GB マシンタイプを選択します。

  9. [接続] で、[パブリック IP を有効にする] を選択します。

  10. [CREATE CLUSTER] をクリックします。AlloyDB がクラスタを作成してプライマリ クラスタの [概要] ページに表示するまでに数分かかることがあります。

  11. [クラスタ内のインスタンス] で、[接続] ペインを開きます。このチュートリアルで使用するため、接続 URI をメモしておきます。

    接続 URI は projects/<var>PROJECT_ID</var>/locations/<var>REGION_ID</var>/clusters/my-cluster/instances/my-cluster-primary 形式です。

Vertex AI ユーザーに AlloyDB サービス エージェントへの権限を付与する

AlloyDB で Vertex AI テキスト エンベディング モデルを使用できるようにするには、クラスタとインスタンスが配置されているプロジェクトの AlloyDB サービス エージェントに Vertex AI ユーザー権限を追加する必要があります。

権限を追加する方法については、AlloyDB サービス エージェントに Vertex AI ユーザー権限を付与するをご覧ください。

ウェブブラウザを使用してデータベースに接続する

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. [リソース名] 列で、クラスタの名前 my-cluster をクリックします。

  3. ナビゲーション パネルで [AlloyDB Studio] をクリックします。

  4. [AlloyDB Studio にログイン] ページで、次の操作を行います。

    1. postgres データベースを選択します。
    2. postgres ユーザーを選択します。
    3. クラスタとそのプライマリ インスタンスを作成するで作成したパスワードを入力します。
    4. [認証] をクリックします。[エクスプローラ] ペインに、postgres データベース内のオブジェクトのリストが表示されます。
  5. [+ 新しい SQL エディタタブ] または [+ 新しいタブ] をクリックして、新しいタブを開きます。

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

次のクエリを実行して、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;

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

  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-005', description)) STORED
      );
    
  2. 次のクエリを実行して、利用可能な在庫と対応する価格に関する情報を格納する product_inventory テーブルを作成します。このチュートリアルでは、product_inventory テーブルと product テーブルを使用して、複雑なベクトル検索クエリを実行します。

    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;
    

    クエリの結果は次のとおりです。 基本的な検索クエリの結果

    インデックスを作成せずに基本的なベクトル検索を実行すると、正確な最近傍検索(KNN)が使用され、効率的な再現率が得られます。大規模な場合、KNN を使用するとパフォーマンスに影響する可能性があります。クエリ パフォーマンスを向上させるには、近似最近傍探索(ANN)に ScaNN インデックスを使用することをおすすめします。これにより、低レイテンシで高い再現率を実現できます。

    インデックスを作成せずに、AlloyDB はデフォルトで正確な最近傍検索(KNN)を使用します。

    ScaNN の大規模な使用の詳細については、AlloyDB AI でベクトル エンベディングを使ってみるをご覧ください。

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_leaves パラメータ値と scann.num_leaves_to_search パラメータ値は、パフォーマンスと再現率のバランスをとるのに役立ちます。

ScaNN インデックスを使用している場合でも、フィルタされたベクトル検索クエリを効率的に実行できます。次の複雑なベクトル検索クエリを実行します。フィルタが適用されていても、クエリ条件を満たす関連する結果が返されます。

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;

クリーンアップ

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. [リソース名] 列でクラスタ名 my-cluster をクリックします。

  3. [クラスタを削除] をクリックします。

  4. Delete cluster my-clustermy-cluster を入力して、クラスタの削除を確認します。

  5. [削除] をクリックします。

  6. クラスタを作成するときにプライベート接続を作成した場合は、 Google Cloud コンソールの[Networking] ページに移動し、[Delete VPC network] をクリックします。

次のステップ