為搜尋結果排名

瞭解如何使用 Vertex AI 排序模型 (例如 semantic-ranker-default-003) 排序及重新排序應用程式的搜尋結果。您可以使用 ai.rank() 函式,根據文件與查詢的關聯性為文件評分,並重新排序向量搜尋結果,以改善查詢順序。

Vertex AI 排序 API 會接收文件清單,並根據文件與指定查詢 (搜尋字串) 的相關程度,對這些文件進行排序。使用 ai.rank() 函式時,系統會傳回分數,指出文件回答特定查詢的程度。

如要使用本頁的說明,您必須瞭解 PostgreSQL 適用的 AlloyDB,並熟悉生成式 AI 概念。

AlloyDB 會保留並建立 ai 結構定義。

事前準備

請先完成下列事項,再對搜尋結果進行排序:

啟用 Discovery Engine API

主控台

  1. 啟用 API
  2. 在「確認專案」步驟中,按一下「下一步」,確認要變更的專案名稱。
  3. 在「啟用 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 整合並安裝擴充功能

  1. 與 Vertex AI 整合
  2. 確認已安裝最新版 google_ml_integration
    1. 如要檢查已安裝的版本,請執行下列指令:

              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.3
              (1 row)
            
    2. 如果未安裝擴充功能,或安裝的版本低於 1.4.3,請執行下列指令更新擴充功能:

              CREATE EXTENSION IF NOT EXISTS google_ml_integration;
              ALTER EXTENSION google_ml_integration UPDATE;
            

      如果您在執行上述指令時遇到問題,或執行上述指令後,擴充功能未更新至 1.4.3 版,請與 AlloyDB 支援團隊聯絡。

    3. 確認版本為最新後,請執行 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;

後續步驟