本頁說明如何根據模型生成和儲存向量嵌入項目。
詳情請參閱「使用 Cloud SQL 建構生成式 AI 應用程式」。
Cloud SQL 可讓您使用 Vertex AI 託管的嵌入模型,將文字字串轉換為嵌入,也就是模型以數值向量表示指定文字的語意。
Cloud SQL 會將嵌入項目實作為 real
值陣列。您可以將生成的嵌入做為 pgvector
擴充功能函式的輸入內容。
事前準備
如果您想使用 Cloud SQL 生成嵌入內容,或只需要處理從其他來源儲存在資料庫中的嵌入內容,則部分規定會有所不同。
區域限制
如要使用 Cloud SQL 生成 Vertex AI 嵌入項目,執行個體必須位於支援生成式 AI 基礎模型的區域。Cloud SQL 可用於嵌入的 Vertex AI 模型 (text-embedding
和 textembedding-gecko
) 位於該區域。
必要資料庫擴充功能
如要使用嵌入內容,請在 Cloud SQL 執行個體上安裝 google_ml_integration
擴充功能。如果是 Vertex AI 模型,請安裝 1.2
以上版本。如果是第三方或自訂模型,請安裝 1.4.2
以上版本。
如果想儲存這些嵌入,並搭配使用向量函式和運算子,則還需要 pgvector
擴充功能。
Cloud SQL 支援這兩種擴充功能。您可以在執行個體中的任何資料庫上安裝這些擴充功能。詳情請參閱「設定 PostgreSQL 擴充功能」。
設定模型存取權
如要從 Cloud SQL 執行個體產生嵌入內容,請先設定 Cloud SQL,以便與文字嵌入模型搭配使用。
如要使用雲端式 text-embedding
或 textembedding-gecko
模型,請整合 Cloud SQL 與 Vertex AI。
授予資料庫使用者產生嵌入內容的權限
授予資料庫使用者權限,使用 embedding
函式執行預測:
如「使用 psql 用戶端連線」一文所述,將
psql
用戶端連線至主要執行個體。在
psql
命令提示字元中,連線至資料庫並授予權限:\c DB_NAME GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
更改下列內容:
DB_NAME:您要授予權限的資料庫名稱
USER_NAME:要授予權限的使用者名稱
生成嵌入項目
Cloud SQL 提供函式,可將文字轉換為向量嵌入。接著,您可以將該嵌入項目以向量資料的形式儲存在資料庫中,並視需要使用 pgvector
函式對其執行查詢。
生成嵌入
如要使用 Cloud SQL 生成嵌入,請使用 embedding
擴充功能提供的 google_ml_integration
函式:
SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');
請將下列項目改為對應的值:
MODEL_ID:要查詢的模型 ID。
如果您使用 Vertex AI Model Garden,請指定
text-embedding-004
或text-multilingual-embedding-002
。這些是 Cloud SQL 可用於文字嵌入的雲端模型。詳情請參閱文字嵌入。VERSION_TAG (選用):要查詢的模型版本標記。如果是
text-embedding-004
或text-multilingual-embedding-002
之前的textembedding-gecko
版本,請在標記前加上@
。如果您使用 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:模型支援的維度數量。
如果您使用
text-embedding
或textembedding-gecko
模型搭配 Vertex AI,請指定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-gecko
之前的版本,請使用text-embedding-004
或text-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()
回應。如果您未在嵌入呼叫中指定模型版本,新發布的模型版本可能會突然變更特定輸入內容的回傳向量。這可能會導致應用程式發生錯誤或其他非預期行為。
後續步驟
- 使用 Cloud SQL 建構生成式 AI 應用程式
- 整合 Cloud SQL 與 Vertex AI
- 從 Cloud SQL 執行個體叫用線上預測
- 瞭解嵌入工作流程範例
- 使用 LangChain 建構採用 LLM 的應用程式
- 使用 Cloud SQL Studio 管理資料
- 藉助 Gemini 編寫 SQL 程式碼