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

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

始める前に

ベクトル データベース フラグが有効にされた Cloud SQL インスタンスが必要です。

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

Vertex AI や OpenAI などのテキスト エンベディング 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 オペレーションを使用して、次の構文に従ったベクトル エンベディング列を追加します。

次のステートメントでは、upsert を使用して、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]');

次のステップ