ベクトル エンベディングを生成して管理する

このページでは、ベクトル エンベディングを生成して保存する方法について説明します。概要については、ベクトル エンベディングの保存をご覧ください。

始める前に

ベクトル データベース フラグが有効になっている Cloud SQL インスタンスが必要です。

行データに基づいてベクトル エンベディングを生成する

Vertex AIOpenAI などのテキスト エンベディング API を使用して、特定の行のデータのベクトル エンベディングを生成できます。Cloud SQL のベクトル エンベディングでは、任意のテキスト エンベディング API を使用できます。ただし、クエリ文字列ベクトルの生成に、同じテキスト エンベディング API を使用する必要があります。ソースデータとクエリのベクトル化で異なる API を組み合わせることはできません。

たとえば、Vertex AI からベクトル エンベディングを生成できます。

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

ベクトル エンベディングを保存する

このセクションでは、Cloud SQL でベクトル エンベディングを保存するステートメントの例を示します。

ベクトル エンベディング列を含む新しいテーブルを作成する

VECTOR データ型を使用する列で CREATE TABLE ステートメントを使用します。

次の構文を使用してテーブルを作成します。

CREATE TABLE TABLE_NAME(
  id INTEGER
  PRIMARY KEY
    AUTO_INCREMENT,
    title VARCHAR(60),
    EMBEDDING_COLUMN_NAME
      VECTOR(VECTOR_DIMENSIONS)
  USING VARBINARY);

次のパラメータを置き換えます。

  • TABLE_NAME: エンベディングを保存するテーブルの名前。
  • EMBEDDING_COLUMN_NAME: エンベディングを格納する列の名前。
  • VECTOR_DIMENSIONS: エンベディングに使用する次元数。

次の例では、エンベディング列に 3 つのディメンションを持つベクターがあります。この列に保存されるデータのデータ型は VARBINARY です。

CREATE TABLE books(
  id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);

既存のテーブルにベクトル エンベディング列を追加する

ALTER TABLE ステートメントを使用して、既存のテーブルにベクトル エンベディング列を追加します。列は、エンベディングを保持するために VECTOR データ型を使用する必要があります。

次の例では、3 つのディメンションを持つベクターを含むエンベディング列がテーブルに挿入されます。この列に保存されるデータのデータ型は VARBINARY です。

ALTER TABLE books
ADD COLUMN embedding
  VECTOR(3)
USING VARBINARY;

ベクトル エンベディングを挿入する

string_to_vector 関数INSERT を使用して、ベクトル エンベディング値をテーブルに挿入します。

次の例では、3 つのディメンションを持つベクトルがエンベディング列に挿入されます。

INSERT INTO books
  (
    title,
    embedding)
VALUES (('book title', string_to_vector('[1,2,3]')));

複数のベクトル エンベディングを挿入する

string_to_vector 関数INSERT を使用して、カンマ区切りのベクトル エンベディングのリストを挿入します。

次のステートメントでは、それぞれ 3 つのディメンションを持つベクトルを含む 2 つのエンベディングがエンベディング列に挿入されます。

INSERT INTO books
  (
    title,
    embedding)
VALUES
  (
    (
      'book title',
      string_to_vector('[1,2,3]')),
    ('book title', string_to_vector('[4,5,6]')));

ベクトル エンベディングを Upsert する

string_to_vector 関数を使用してテーブルに対して INSERT または UPDATE オペレーションを行い、次の構文でベクトル エンベディング列を追加します。

次のステートメントでは、アップサートを使用して、3 つのディメンションを持つベクトルを含むエンベディングをエンベディング列に挿入または更新します。

INSERT INTO books
  (
    id,
    title,
    embedding)
VALUES
  (
    (
      1,
      'book title',
      string_to_vector('[1,2,3]')))
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

ベクトル エンベディングを更新する

string_to_vector 関数UPDATE を使用して、ベクトル エンベディングを更新します。

次のステートメントでは、UPDATE を使用して、エンベディング列を 3 次元のベクトルで更新します。

UPDATE books
SET embedding = string_to_vector('[7,8,9]')
WHERE id = 1;

ベクトル エンベディングを取得する

ベクトル エンベディングを取得するには、エンベディングの名前とともに Cloud SQL の vector_to_string 関数を使用します。

次のステートメントでは、エンベディング列を取得して表示します。

SELECT vector_to_string(embedding) FROM books WHERE id = 1;

ベクトル エンベディングを削除する

string_to_vector 関数DELETE を使用して、テーブルからベクトル エンベディングを削除します。ベクトル インデックスがある場合は、まず削除する必要があります。詳細については、ベクトル インデックスを削除するをご覧ください。

次のステートメントでは、DELETE を使用してエンベディング列の値を削除します。

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

次のステップ