瞭解如何使用 Vertex AI 排序模型 (例如 semantic-ranker-default-003
) 排序及重新排序應用程式的搜尋結果。您可以使用 ai.rank()
函式,根據文件與查詢的關聯性為文件評分,並重新排序向量搜尋結果,以改善查詢順序。
Vertex AI 排序 API 會接收文件清單,並根據文件與指定查詢 (搜尋字串) 的相關程度,對這些文件進行排序。使用 ai.rank()
函式時,系統會傳回分數,指出文件回答特定查詢的程度。
如要使用本頁的說明,您必須瞭解 PostgreSQL 適用的 AlloyDB,並熟悉生成式 AI 概念。
AlloyDB 會保留並建立 ai
結構定義。
事前準備
請先完成下列事項,再對搜尋結果進行排序:
- 確認已安裝
google_ml_integration
擴充功能。 - 確認
google_ml_integration.enable_model_support
標記已設為on
。 - 與 Vertex AI 整合。
- 啟用 Discovery Engine API。
- 取得使用排名模型所需的角色。
啟用 Discovery Engine API
主控台
- 啟用 API
- 在「確認專案」步驟中,按一下「下一步」,確認要變更的專案名稱。
- 在「啟用 API」步驟中,按一下「啟用」,啟用 Discovery Engine API。如果先前已啟用這個 API,這裡就不會列出。
gcloud
如要使用排名模型,必須啟用 Discovery Engine API。
將 PROJECT_ID
替換為您的專案 ID,並將 Google Cloud PROJECT_NUMBER
替換為對應的專案編號。
# Enable Discovery Engine API gcloud services enable discoveryengine.googleapis.com --project=PROJECT_ID gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/discoveryengine.viewer"
Vertex AI 模型不需要註冊模型,即可用於排序。
您可以將 Vertex AI 模型名稱做為 model_id
,如下例所示。
SELECT index, score FROM ai.rank( model_id => 'semantic-ranker-default-003', search_string => 'Affordable family-friendly vacation spots in Southeast Asia?', documents => ARRAY[ 'Luxury resorts in South Korea', 'Family vacation packages for Vietnam: Ha Long Bay and Hoi An', 'Budget-friendly beaches in Thailand perfect for families', 'A backpacker guide to solo travel in India'])
語意排序器常見的用途是重新排序向量搜尋傳回的結果,以便更妥善地排序查詢。下列範例說明如何針對這個用途使用語意排序模型。這個範例會使用向量搜尋,擷取查詢 personal fitness
equipment
的初始結果集。然後重新排序,傳回前五個結果。
WITH initial_ranking AS ( SELECT id, description, ROW_NUMBER() OVER () AS ref_number FROM product ORDER BY embedding <=> google_ml.embedding( 'gemini-embedding-001', 'personal fitness equipment')::vector LIMIT 10 ), reranked_results AS ( SELECT index, score FROM ai.rank( model_id => 'semantic-ranker-default-003', search_string => 'personal fitness equipment', documents => (SELECT ARRAY_AGG(description ORDER BY ref_number) FROM initial_ranking), top_n => 5) ) SELECT id, description FROM initial_ranking, reranked_results WHERE initial_ranking.ref_number = reranked_results.index ORDER BY reranked_results.score DESC;
如需可用模型和用途清單,請參閱「支援的型號」。
與 Vertex AI 整合並安裝擴充功能
- 與 Vertex AI 整合。
- 確認已安裝最新版
google_ml_integration
。如要檢查已安裝的版本,請執行下列指令:
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.4.3 (1 row)
如果未安裝擴充功能,或安裝的版本低於 1.4.3,請執行下列指令更新擴充功能:
CREATE EXTENSION IF NOT EXISTS google_ml_integration; ALTER EXTENSION google_ml_integration UPDATE;
如果您在執行上述指令時遇到問題,或執行上述指令後,擴充功能未更新至 1.4.3 版,請與 AlloyDB 支援團隊聯絡。
確認版本為最新後,請執行
upgrade_to_preview_version
程序,安裝預覽功能:CALL google_ml.upgrade_to_preview_version(); SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.4.4 (1 row)
必要的角色
如要取得使用 Discovery Engine 排序模型所需的權限,請要求管理員在 your project
上授予您 Discovery Engine 檢視者 (roles/discoveryengine.viewer
) Identity and Access Management (IAM) 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」一文。
搜尋結果排名
以下 SQL 查詢顯示如何為搜尋結果排名:
SELECT
ai.rank(
model_id => 'MODEL_ID',
search_string => 'SEARCH_STRING',
documents => ARRAY['DOCUMENT_1', 'DOCUMENT_2', 'DOCUMENT_3']);
更改下列內容:
參數 | 說明 |
---|---|
MODEL_ID |
您定義的模型端點專屬 ID。 |
SEARCH_STRING |
用來排序記錄的搜尋字串。 |
DOCUMENTS |
用於識別記錄的專屬字串。 |
如需支援的 Vertex AI 排序模型清單,請參閱「支援的模型」。
範例
如要使用 Vertex AI 排序模型為搜尋結果排序,請執行下列查詢:
SELECT index, score
FROM
ai.rank(
model_id => 'semantic-ranker-default-003',
search_string => 'AlloyDB is a PostgreSQL compatible AI database that is ready for production.',
documents =>
ARRAY[
'Alloys are made from combination of metals',
'The best enterprise-ready PostgreSQL database.',
'You can feel the heat in Alloy apartments.']);
回覆內容是表格,顯示每份文件和根據與搜尋查詢相關性得出的分數。以下是範例回應:
index | score
-------+------------
2 | 0.33
1 | 0.28
3 | 0.16
(3 rows)
假設有一個 AlloyDB 資料庫,其中包含轉換為嵌入內容的評論說明清單。下列程式碼片段範例說明如何使用排名模型,根據產品評論說明與查詢的語意相似度,擷取排名最高的產品名稱。
WITH initial_ranking AS (
SELECT product_id, name, review, review_id, ROW_NUMBER() OVER () AS ref_number
FROM user_reviews
ORDER BY
review_desc_embedding <=> google_ml.embedding(
'gemini-embedding-001', 'good desserts')::vector
LIMIT 10
), reranked_results AS (
SELECT index, score
FROM
ai.rank(
model_id => 'semantic-ranker-512',
search_string => 'good desserts',
documents => (SELECT ARRAY_AGG(review ORDER BY ref_number) FROM initial_ranking),
top_n => 5)
)
SELECT product_id, name
FROM initial_ranking, reranked_results
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC;