產生及管理向量嵌入

本頁說明如何生成及儲存向量嵌入。如需總覽,請參閱「向量嵌入儲存空間」。

事前準備

如果您使用 MySQL 8.4 以下版本的 Cloud SQL,則須啟用 cloudsql_vector 資料庫旗標,才能生成及儲存向量嵌入。

如果您使用 MySQL 適用的 Cloud SQL 9.7 以上版本,則不需在 Cloud SQL 執行個體上設定 cloudsql_vector 資料庫旗標,即可生成及儲存向量嵌入。不過,您無法建立向量索引,或對向量資料執行 ANN 搜尋。

根據資料列資料生成向量嵌入

您可以使用文字嵌入 API (例如 Vertex AI 或 OpenAI),為指定資料列的資料生成向量嵌入。您可以將任何文字嵌入 API 與 Cloud SQL 向量嵌入搭配使用。不過,您必須使用相同的文字嵌入 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 陳述式。

請使用下列語法建立資料表。

如果是 MySQL 8.4 以下版本的 MySQL 適用的 Cloud SQL,請使用下列語法:

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:嵌入要使用的維度數量。

在以下範例中,嵌入資料欄含有一個三維向量。儲存在這個資料欄的資料具有 VARBINARY 資料類型。

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

如果是 MySQL 適用的 Cloud SQL 9.7 以上版本,則可選擇是否宣告 VARBINARY 關鍵字,且支援回溯相容性。您也不需要指定向量的維度,預設值為 2048。

如果是 MySQL 9.7 以上版本的 Cloud SQL,可以使用下列語法:

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

詳情請參閱 MySQL 說明文件中的「VECTOR 類型」。

在現有資料表新增向量嵌入欄

使用 ALTER TABLE 陳述式,將向量嵌入資料欄新增至現有資料表。資料欄必須使用 VECTOR 資料類型來保存嵌入。

在以下範例中,具有三維向量的嵌入資料欄會插入資料表。

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

MySQL 9.7:

ALTER TABLE books
ADD COLUMN embedding
  VECTOR(3);

插入向量嵌入

搭配使用 INSERT 和 string_to_vector 函式,將向量嵌入值插入資料表。

在以下範例中,系統會將三維向量插入嵌入資料欄。

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

插入多個向量嵌入

搭配使用 INSERT 和 string_to_vector 函式,插入以半形逗號分隔的向量嵌入清單。

在下列陳述式中,兩個嵌入 (每個嵌入包含一個三維向量) 會插入嵌入資料欄。

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

新增或更新向量嵌入

使用 string_to_vector 函式對資料表執行 INSERT 或 UPDATE 作業,並使用下列語法新增向量嵌入資料欄。

在下列陳述式中,upsert 用於插入或更新嵌入資料欄,嵌入資料包含具有三個維度的向量。

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]');

更新向量嵌入

搭配使用 UPDATE 和 string_to_vector 函式,即可更新向量嵌入。

在下列陳述式中,UPDATE 用於以三維向量更新嵌入欄。

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;

刪除向量嵌入

搭配使用 DELETE 和 string_to_vector 函式,即可從資料表移除向量嵌入。如果已有向量索引,則必須先刪除。詳情請參閱「捨棄向量索引」。

在下列陳述式中,DELETE 用於刪除嵌入資料欄中的值。

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

後續步驟