產生及管理向量嵌入

本頁面說明如何根據模型生成和儲存向量嵌入項目。

詳情請參閱「使用 Cloud SQL 建構生成式 AI 應用程式」。

Cloud SQL 可讓您使用 Vertex AI 代管的嵌入模型,將文字字串轉譯為嵌入,這是模型將指定文字的語意意義表示為數值向量。

Cloud SQL 會將嵌入項目實作為 real 值的陣列。您可以使用產生的嵌入做為 pgvector 擴充函式的輸入內容。

事前準備

部分要求會因您想使用 Cloud SQL 產生嵌入資料,或是只需要使用從其他來源儲存在資料庫中的嵌入資料而有所不同。

區域限制

如要使用 Cloud SQL 產生 Vertex AI 嵌入項目,您的執行個體必須位於支援生成式 AI 基礎模型的區域。Cloud SQL 可用於嵌入的 Vertex AI 模型 (text-embeddingtextembedding-gecko) 位於該區域。

必要的資料庫擴充功能

如要使用嵌入功能,請在 Cloud SQL 執行個體上安裝 google_ml_integration 擴充功能。如果是 Vertex AI 模型,請安裝 1.2 以上版本。如果是第三方或自訂模型,請安裝 1.4.2 以上版本。

您可以選擇儲存這些嵌入資料,並使用向量函式和運算子搭配嵌入資料,因此也需要 pgvector 擴充功能。

Cloud SQL 提供這兩種擴充功能。您可以在執行個體中的任何資料庫上安裝這些擴充功能。詳情請參閱「設定 PostgreSQL 擴充功能」。

設定模型存取權

您必須先設定 Cloud SQL 以便使用文字嵌入模型,才能從 Cloud SQL 執行個體產生嵌入資料。

如要使用雲端 text-embeddingtextembedding-gecko 模型,您必須將 Cloud SQL 與 Vertex AI 整合

授予資料庫使用者產生嵌入資料的存取權

授予資料庫使用者權限,以便使用 embedding 函式執行預測作業:

  1. psql 用戶端連線至主要執行個體,如使用 psql 用戶端連線一文所述。

  2. psql 命令提示字元中,連線至資料庫並授予權限:

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

    更改下列內容:

    • DB_NAME:您要授予權限的資料庫名稱

    • USER_NAME:您要授予權限的使用者名稱

生成嵌入項目

Cloud SQL 提供函式,可將文字轉譯為向量嵌入。接著,您可以將該嵌入項目儲存至資料庫中做為向量資料,並視需要使用 pgvector 函式對其執行查詢。

產生嵌入

如要使用 Cloud SQL 產生嵌入項目,請使用 google_ml_integration 擴充功能提供的 embedding 函式:

SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');

請將以下項目改為對應的值:

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-004
    text-multilingual-embedding-002。這些是 Cloud SQL 可用於文字嵌入的雲端模型。詳情請參閱「文字嵌入」。

  • VERSION_TAG (選用):要查詢的模型版本標記。如果是 textembedding-gecko 以下 text-embedding-004text-multilingual-embedding-002 之前的版本,請在標記前方加上 @

    如果您要使用 Vertex AI 中的某個 textembedding-gecko 模型,請指定 模型版本 中列出的其中一個版本標記。

  • TEXT:要轉譯為向量嵌入的文字。

以下範例會使用 text-embedding-004 模型,根據提供的文字字串產生嵌入項目:

SELECT embedding( 'text-embedding-004', 'Cloud SQL is a managed, cloud-hosted SQL database service.');

儲存產生的嵌入

embedding() 函式的傳回值是 real 值的陣列。如要在資料表中儲存這個值,請新增 real[] 欄:

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];

請將以下項目改為對應的值:

  • TABLE:資料表名稱

  • EMBEDDING_COLUMN:新嵌入資料欄的名稱

  • DIMENSIONS:模型支援的維度數量。

    如果您使用 Vertex AI 搭配 text-embeddingtextembedding-gecko 模型,請指定 768

您也可以選擇在安裝 pgvector 擴充功能後,將嵌入項目儲存為 vector 值:

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN vector(DIMENSIONS);

建立用於儲存嵌入資料的資料欄後,您可以根據同一個資料表中另一個資料欄中已儲存的值填入資料欄:

UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);

請將以下項目改為對應的值:

  • TABLE:資料表名稱。

  • EMBEDDING_COLUMN:嵌入資料欄的名稱。

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-004
    text-multilingual-embedding-002。這些是 Cloud SQL 可用於文字嵌入的雲端模型。詳情請參閱「文字嵌入」。

  • VERSION_TAG (選用):要查詢的模型版本標記。對於 textembedding-geckotext-embedding-004text-multilingual-embedding-002 之前的版本,請使用 Prepend the tag with@`。

    如果您使用 Vertex AI 中的某個 textembedding-gecko 模型,請指定 模型版本 中列出的其中一個版本標記。

  • SOURCE_TEXT_COLUMN:儲存文字的資料欄名稱。您將這段文字轉換為嵌入式資料。

上述指令適用於 real[]vector 嵌入資料欄。如果嵌入資料欄是 vector 類型,Cloud SQL 會隱含地將 embedding() 的傳回值從 real 陣列轉換為 vector 值。

以下範例使用 text-embedding-004 模型,根據 messages.message 欄的內容,為 messages.message_vector 欄填入嵌入資料:

UPDATE messages SET message_vector = embedding( 'text-embedding-004', message);

使用 pgvector 查詢及建立嵌入索引

pgvector PostgreSQL 擴充功能可讓您在資料庫中儲存、建立索引及查詢文字嵌入項目時,使用向量專屬運算子和函式。Cloud SQL 針對 pgvector 提供專屬的最佳化功能,讓您建立索引,加快涉及嵌入的查詢速度。

建立最近鄰居索引

pgvector 支援透過索引進行近似最鄰近搜尋 (ANN)。

如要建立 HNSW 索引,請使用 hnsw 函式,如以下範例所示:

CREATE INDEX ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = M, ef_construction = EF_CONSTRUCTION);

請將以下項目改為對應的值:

  • TABLE:要新增索引的資料表。

  • EMBEDDING_COLUMN:儲存 vector 資料的資料欄。

  • DISTANCE_FUNCTION:與此索引搭配使用的距離函式。選擇下列其中一個選項:

    • L2 距離vector_l2_ops

    • 內積vector_ip_ops

    • 餘弦距離vector_cosine_ops

  • M (選用):圖表中相鄰資料點的連線數量上限。建議範圍為 5 到 48。預設值為 16。

  • EF_CONSTRUCTION (選用):在建立索引時,在圖表檢索期間儲存最接近候選項目的清單大小。值越高,演算法就會考慮更多候選項目,進而建立更優質的索引。預設大小為 64。

如要在使用 real[] 資料類型而非 vector 的嵌入資料欄上建立此索引,請將資料欄轉換為 vector 資料類型:

CREATE INDEX ON TABLE
  USING hnsw ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
  WITH (m = M, ef_construction = EF_CONSTRUCTION);

DIMENSIONS 替換為嵌入資料欄的維度寬度。

下一節將示範這類索引的範例。

使用指定文字執行最近鄰查詢

在資料庫中儲存及建立嵌入索引後,您就能使用所有 pgvector 查詢功能

如要找出與文字最接近的語意相似字,請使用 embedding() 函式將文字轉譯為向量。在同一個查詢中,將這個向量套用至 pgvector 最鄰近運算子 <->,找出語意最相似的嵌入資料庫資料列。

由於 embedding() 會傳回 real 陣列,因此您必須將 embedding() 呼叫轉換為 vector,才能將這些值與 pgvector 運算子一起使用。

  SELECT RESULT_COLUMNS FROM TABLE
    ORDER BY EMBEDDING_COLUMN
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT

請將以下項目改為對應的值:

  • RESULT_COLUMNS:從語義相似的資料列中顯示的資料欄。

  • TABLE:包含要用來比較文字的嵌入資料表。

  • EMBEDDING_COLUMN:包含已儲存嵌入向量的資料欄。

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-004
    text-embedding-multilingual-002。這些是 Cloud SQL 可用於文字嵌入的雲端模型。詳情請參閱「文字嵌入」。

  • VERSION_TAG (選用):要查詢的模型版本標記。在標記開頭加上 @

    如果您要使用 Vertex AI 中的某個 textembedding-gecko 模型,請指定 模型版本 中列出的其中一個版本標記。

  • TEXT:您要的文字,可用來找出儲存的語意相近字詞。

  • ROW_COUNT:要傳回的資料列數量。如果只想取得最相符的單一項目,請將 1 指定為此參數的值。

如要使用儲存的嵌入資料欄執行此查詢,且該資料欄使用 real[] 資料類型而非 vector,請將資料欄轉換為 vector 資料類型:

  SELECT RESULT_COLUMNS FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT

使用模型版本標記,避免發生錯誤

Cloud SQL 強烈建議您一律使用所選嵌入模型的穩定版。對於大多數模型而言,這表示您必須明確設定版本標記。

在未指定模型版本標記的情況下呼叫 embedding() 函式,雖然語法有效,但可能會發生錯誤。

如果您在 Vertex AI Model Garden 中使用模型時省略版本標記,Vertex AI 就會使用模型的最新版本。這可能不是最新的穩定版。如要進一步瞭解可用的 Vertex AI 模型版本,請參閱「模型版本」。

特定 Vertex AI 模型版本對特定文字輸入一律會傳回相同的 embedding() 回應。如果您未在嵌入呼叫中指定模型版本,則新發布的模型版本可能會突然變更特定輸入內容的傳回向量。這可能會導致應用程式發生錯誤或其他非預期的行為。

後續步驟