使用最佳化函式加快查詢速度

AlloyDB for PostgreSQL 的最佳化函式可讓您使用較小、較快的 Proxy 模型,處理大多數使用 AI 函式的 SQL 查詢,僅在必要時才改用較大的大型語言模型 (LLM)。這種做法可盡量減少遠端 LLM 呼叫,避免逐列分類或篩選,進而降低營運成本並提高查詢回應速度。

AlloyDB AI 函式 (例如 ai.if()) 可能會因遠端呼叫大型語言模型 (LLM) 而產生高延遲。最佳化函式會使用在本機訓練的小型代理模型處理查詢,解決延遲問題。這些模型會使用資料樣本進行訓練,並以 LLM 的輸出內容做為可靠資料來源。

系統會在執行階段使用 LLM,對資料列樣本進行準確度檢查。為執行這項檢查,AlloyDB 會使用 LLM 生成範例資料列的標籤,並與代理模型的預測結果進行比較,藉此驗證準確度。如果準確度檢查失敗,查詢會改用 LLM。

使用最佳化函式時,AlloyDB 會執行下列操作:

  1. 訓練 Proxy 模型:AlloyDB 會使用資料樣本訓練輕量 Proxy 模型。當您使用 PREPARE 陳述式搭配 ai.if() 函式訓練模型,以最佳化查詢時,系統會在背景執行這項操作。
  2. 執行查詢:使用 EXECUTE 陳述式時,AlloyDB 會使用訓練好的代理模型,在本機處理查詢。
  3. 備用 LLM:如果模型準確度偏低,或 AlloyDB 找不到模型,AlloyDB 會自動改用 LLM。

最佳化函式流程圖

事前準備

使用最佳化函式前,請先完成下列步驟:

  • 使用 psql 或 AlloyDB Studio,以 postgres 使用者或有權存取資料所在資料表的使用者身分,連線至資料庫。
  • 確認已安裝 google_ml_integration 擴充功能,且版本為 1.5.8 以上。

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    extversion
    ------------
    1.5.8
    (1 row)
    
  • 設定 AlloyDB,以便與 Gemini Enterprise Agent Platform 搭配使用。詳情請參閱「將資料庫與 Agent Platform 整合」。

  • 請確認下列資料庫旗標已啟用。詳情請參閱「設定執行個體的資料庫旗標」。

    • google_ml_integration.enable_model_support
    • google_ml_integration.enable_ai_query_engine
    • google_ml_integration.enable_cost_optimized_ai_functions
  • 為要查詢的資料表生成嵌入項目。詳情請參閱「生成及管理資料表的自動嵌入」。

  • 請考量下列事項:

    • 來源資料欄必須是 TEXT 或 VARCHAR 類型。
    • 為最佳化 AI 函式提供輸入內容的嵌入資料欄,必須是 REAL[] 或 VECTOR 類型。
    • 最佳化函式僅適用於提供 Agent Platform 生成模型的區域。如需可用區域清單,請參閱「部署作業和端點」。

使用最佳化函式

如要使用最佳化函式,請搭配 ai.if() 函式使用 PREPARE 和 EXECUTE 陳述式。以下範例說明如何使用最佳化函式:

  1. 建立 restaurant_reviews 資料表。保留來源資料的 review 資料欄屬於 TEXT 類型,用於查詢的 review_embedding 資料欄則屬於 VECTOR(768) 類型。

    CREATE TABLE restaurant_reviews (
        id SERIAL,
        name VARCHAR(64),
        city VARCHAR(64),
        review TEXT,
        review_embedding VECTOR(768)
    );
    
  2. 請使用 PREPARE 陳述式搭配 ai.if() 函式,表示查詢必須使用最佳化函式。這個陳述式會在背景觸發模型的非同步訓練。

    只有在符合下列條件時,系統才會訓練模型:

    • 查詢中只有一個 ai.if() 函式。
    • ai.if() 不在子查詢中。
    PREPARE positive_reviews_query AS
    SELECT r.name, r.city
    FROM restaurant_reviews r
    WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
    GROUP BY r.name, r.city
    HAVING COUNT(*) > 500;
    
  3. 使用 EXECUTE 陳述式執行查詢。由於 PREPARE 陳述式僅適用於目前的工作階段,因此您必須在同一個連線上執行 EXECUTE 陳述式:

    EXECUTE positive_reviews_query;
    
    conn2=> SELECT r.name, r.city
        FROM restaurant_reviews r
        WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
        GROUP BY r.name, r.city
        HAVING COUNT(*) > 500;
    

    如果符合下列任一條件,系統就不會使用訓練過的代理模型:

    • ai.if() 中參照的內容或嵌入資料欄有所變更。兩個資料欄必須屬於同一個資料表。
    • 提供給內容欄的提示會變更。
    • 查詢結構會變更,導致 query_id 不同。
    • 查詢在開始時未達到準確度檢查門檻。

    在這種情況下,查詢會改用 LLM,AlloyDB 則會傳回警告。

  4. 選用。如要停用整個資料庫環境的準確度驗證檢查 (模型訓練期間也會執行準確度檢查,因此必須停用),請執行下列指令。

    ALTER DATABASE DATABASE_NAME SET google_ml_integration.proxy_models_enable_accuracy_check = off;
    

    將 DATABASE_NAME 替換為資料庫名稱。

重新訓練代理模型

如果基礎資料表資料有大幅變更,您可以再次執行 PREPARE 陳述式,重新訓練 Proxy 模型。重新準備查詢會啟動新的訓練要求,取代現有的 Proxy 模型。

限制

如果變更來源內容欄、嵌入欄或提供給 ai.if() 函式的提示,則必須發出新的 PREPARE 陳述式。AlloyDB 會訓練最佳化函式,模擬提示和輸入資料獨特組合的行為。

後續步驟