運用 AlloyDB 最新的向量搜尋功能,實現品質控管的檢索增強生成 (RAG)!

運用 AlloyDB 最新的向量搜尋功能,實現品質控管 RAG!

程式碼研究室簡介

subject上次更新時間:5月 28, 2025
account_circle作者:Author: Abirami Sukumaran

1. 總覽

在各個產業中,內容比對搜尋都是應用程式的核心功能。檢索增強生成技術已在相當長的一段時間內,以生成式 AI 技術為基礎的檢索機制,成為這項重要技術演進的關鍵推手。生成式模型擁有廣泛的脈絡視窗和出色的輸出品質,正在改變 AI 的發展方向。RAG 提供系統化方式,可將情境資料注入 AI 應用程式和代理程式,並以結構化資料庫或各種媒體的資訊做為基礎。這些背景資料對於釐清真相和確保輸出結果的準確性至關重要,但這些結果的準確性如何?貴公司是否在很大程度上依賴這些內容比對和關聯度的準確度?那麼,這項專案一定會讓您愛不釋手!

向量搜尋的秘訣不僅在於建立向量,還在於瞭解向量比對是否確實良好。我們都曾經歷過這種情況,茫然地盯著結果清單,心想:「這東西到底有沒有在運作?」接下來,我們將深入探討如何評估向量比對的品質。您可能會問:「RAG 有哪些變化?」一切!多年以來,檢索增強生成 (RAG) 技術一直是個有希望但難以實現的目標。如今,我們終於有工具可用於建構 RAG 應用程式,並提供執行關鍵任務所需的效能和可靠性。

我們現在已掌握 3 項基礎知識:

  1. 說明情境搜尋對你的服務機器人有何意義,以及如何使用 Vector Search 達成目標。
  2. 我們也深入探討如何在資料範圍內 (也就是在資料庫本身) 使用向量搜尋 (如果您還不清楚,所有 Google Cloud 資料庫都支援這項功能)。
  3. 我們比其他人更進一步,說明如何透過 ScaNN 索引支援的 AlloyDB 向量搜尋功能,實現輕量向量搜尋 RAG 功能,以便提供高效能和高品質的服務。

如果您尚未完成基本、中級和略為進階的 RAG 實驗,建議您按照以下順序閱讀這 3 篇文章:這裡這裡這裡

專利搜尋可協助使用者找到與搜尋文字相關的上下文專利,我們在過去就已建立這類功能。我們現在將使用新版進階 RAG 功能建構應用程式,以便為該應用程式提供品質受控的內容相關搜尋功能。讓我們一起來瞭解

下圖顯示這個應用程式中整體流程的運作情形。~ 1c871099f1fde825.png

目標

允許使用者根據文字說明搜尋專利,提升效能和品質,同時使用 AlloyDB 最新的 RAG 功能評估產生的比對結果品質。

建構項目

在本實驗室中,您將:

  1. 建立 AlloyDB 例項並載入專利公開資料集
  2. 建立中繼資料索引和 ScaNN 索引
  3. 使用 ScaNN 的內嵌篩選方法,在 AlloyDB 中實作進階向量搜尋
  4. 實作回想評估功能
  5. 評估查詢回應

需求條件

  • ChromeFirefox 等瀏覽器
  • 已啟用計費功能的 Google Cloud 專案。

2. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  3. 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境。按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」。

「啟用 Cloud Shell」按鈕圖片

  1. 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
  1. 如果未設定專案,請使用下列指令進行設定:
gcloud config set project <YOUR_PROJECT_ID>
  1. 啟用必要的 API。您可以在 Cloud Shell 終端機中使用 gcloud 指令:
gcloud services enable alloydb.googleapis.com compute.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com aiplatform.googleapis.com

您可以透過主控台搜尋每項產品,或使用這個連結,來代替 gcloud 指令。

如要瞭解 gcloud 指令和用法,請參閱說明文件

3. 資料庫設定

在本實驗室中,我們會使用 AlloyDB 做為專利資料的資料庫。它會使用叢集來保存所有資源,例如資料庫和記錄。每個叢集都有一個主要例項,可提供資料的存取點。資料表會儲存實際資料。

讓我們建立 AlloyDB 叢集、執行個體和資料表,用於載入專利資料集。

建立叢集和執行個體

  1. 前往 Cloud 控制台的 AlloyDB 頁面。如要輕鬆在 Cloud Console 中找到大部分的頁面,請使用控制台的搜尋列進行搜尋。
  2. 在該頁面中選取「建立叢集」

f76ff480c8c889aa.png

  1. 您會看到類似下方的畫面。使用下列值建立叢集和執行個體 (如果您要從存放區複製應用程式程式碼,請務必確認這些值相符):
  • 叢集 ID:"vector-cluster"
  • 密碼:"alloydb"
  • PostgreSQL 15 / 最新版本 (建議使用)
  • Region"us-central1"
  • 網路:"default"

538dba58908162fb.png

  1. 選取預設網路後,畫面會顯示如下圖所示畫面。

選取「設定連線」

7939bbb6802a91bf.png

  1. 接著選取「使用系統自動分配的 IP 範圍」,然後按一下「繼續」。查看相關資訊後,請選取「建立連線」。768ff5210e79676f.png
  2. 網路設定完成後,您可以繼續建立叢集。按一下「CREATE CLUSTER」,完成叢集設定,如下所示:

e06623e55195e16e.png

請務必變更執行個體 ID (您可以在設定叢集 / 執行個體時找到)

vector-instance。如果無法變更,請務必在所有後續參照中使用例項 ID

請注意,叢集建立作業大約需要 10 分鐘。成功後,畫面上會顯示剛剛建立的叢集總覽。

4. 資料擷取

接下來,我們要新增一個包含商店資料的表格。前往 AlloyDB,選取主要叢集,然後選取 AlloyDB Studio:

847e35f1bf8a8bd8.png

您可能需要等待執行個體建立完成。完成後,請使用建立叢集時建立的憑證登入 AlloyDB。使用下列資料驗證 PostgreSQL:

  • 使用者名稱:"postgres"
  • 資料庫:postgres
  • 密碼:alloydb

成功驗證 AlloyDB Studio 後,您就可以在編輯器中輸入 SQL 指令。您可以使用最後一個視窗右側的加號新增多個編輯器視窗。

91a86d9469d499c4.png

您會在編輯器視窗中輸入 AlloyDB 指令,並視需要使用「Run」、「Format」和「Clear」選項。

啟用擴充功能

我們將使用擴充功能 pgvectorgoogle_ml_integration 來建構這個應用程式。pgvector 擴充功能可讓您儲存及搜尋向量嵌入資料。google_ml_integration 擴充功能提供的函式可用於存取 Vertex AI 預測端點,以便在 SQL 中取得預測結果。執行下列 DDL 啟用這些擴充功能:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector
;

如要檢查資料庫已啟用的擴充功能,請執行下列 SQL 指令:

select extname, extversion from pg_extension;

建立表格

您可以在 AlloyDB Studio 中使用下列 DDL 陳述式建立資料表:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;

abstract_embeddings 欄可儲存文字的向量值。

授予權限

執行下列陳述式,授權執行「嵌入」函式:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

將 Vertex AI 使用者角色授予 AlloyDB 服務帳戶

Google Cloud IAM 控制台中,將「Vertex AI 使用者」角色授予 AlloyDB 服務帳戶 (格式如下:service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com)。PROJECT_NUMBER 會顯示您的專案編號。

或者,您也可以在 Cloud Shell 終端機中執行下列指令:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

將專利資料載入資料庫

我們會使用 BigQuery 中的 Google Patents 公開資料集做為資料集。我們將使用 AlloyDB Studio 執行查詢。資料會匯入這個 insert_scripts.sql 檔案,我們會執行這個檔案來載入專利資料。

  1. 在 Google Cloud 控制台中,開啟 AlloyDB 頁面。
  2. 選取新建立的叢集,然後按一下執行個體。
  3. 在 AlloyDB 導覽選單中,按一下「AlloyDB Studio」。使用憑證登入。
  4. 按一下右側的「新分頁」圖示,開啟新分頁。
  5. 請將上述 insert_scripts.sql 指令碼中的 insert 查詢陳述式複製到編輯器中。您可以複製 10 到 50 個插入陳述式,快速示範這個用途。
  6. 按一下「執行」。查詢結果會顯示在「結果」表格中。

注意:你可能會發現插入指令碼中含有大量資料。這是因為我們已在插入指令碼中加入嵌入項目。如果無法順利在 GitHub 中載入檔案,請按一下「查看原始資料」。這是為了避免您在使用 Google Cloud 的試用額度帳單帳戶時,產生超過幾個嵌入資料 (最多 20 到 25 個) 的麻煩 (在後續步驟中)。

5. 為專利資料建立嵌入

首先,請執行以下範例查詢來測試嵌入函式:

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

這應該會針對查詢中的範例文字,傳回看起來像浮點陣列的嵌入向量。如下所示:

25a1d7ef0e49e91e.png

更新 abstract_embeddings 向量欄位

請執行下列 DML,以便使用對應的嵌入資料更新資料表中的專利摘要,但前提是您將 abstract_embeddings 資料插入插入指令碼:

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

如果您使用 Google Cloud 的試用版帳單信用額,可能無法產生超過幾個嵌入項目 (最多 20 到 25 個)。因此,我已在插入指令碼中加入嵌入項目,如果您已完成「將專利資料載入資料庫」步驟,則應會在載入的資料表中看到這些項目。

6. 運用 AlloyDB 的新功能執行進階 RAG

表格、資料和嵌入內容都已準備就緒,現在讓我們針對使用者搜尋文字執行即時向量搜尋。您可以執行下列查詢來測試這項功能:

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

在這個查詢中,

  1. 使用者搜尋的文字為:「Sentiment Analysis」。
  2. 我們會使用模型 text-embedding-005,在 embedding() 方法中將其轉換為嵌入。
  3. "<=>" 代表使用 COSINE SIMILARITY 距離方法。
  4. 我們將嵌入方法的結果轉換為向量類型,以便與資料庫中儲存的向量相容。
  5. LIMIT 10 代表我們會選取與搜尋文字最相符的 10 個項目。

AlloyDB 可將向量搜尋 RAG 提升至更高層級:

我們推出了許多新功能,其中兩個以開發人員為主的功能如下:

  1. 內嵌式篩選
  2. 喚回評估工具

內嵌式篩選

以往開發人員必須執行向量搜尋查詢,並處理篩選和回憶功能。AlloyDB 查詢最佳化工具會選擇如何執行含有篩選條件的查詢。內嵌篩選是一種新的查詢最佳化技術,可讓 AlloyDB 查詢最佳化工具同時評估中繼資料篩選條件和向量搜尋,並利用中繼資料欄的向量索引和索引。這項功能可提高喚回效能,讓開發人員充分利用 AlloyDB 提供的即用功能。

內嵌式篩選最適合中等選擇性。當 AlloyDB 搜尋向量索引時,只會為符合結構描述資料篩選條件的向量計算距離 (查詢中的函式篩選器通常會在 WHERE 子句中處理)。這項功能可大幅改善這些查詢的效能,並補足後置篩選或前置篩選的優點。

  1. 安裝或更新 pgvector 擴充功能
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

如果您已安裝 pgvector 擴充功能,請將向量擴充功能升級至 0.8.0.google-3 以上版本,以便使用回溯評估工具功能。

ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';

只有在向量擴充功能為 <0.8.0.google-3> 時,才需要執行這個步驟。

重要注意事項:如果資料列數量少於 100,就不需要建立 ScaNN 索引,因為索引不適用於較少的資料列。請略過下列步驟。

  1. 如要建立 ScaNN 索引,請安裝 alloydb_scann 擴充功能。
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. 首先,請啟用索引和啟用內嵌篩選器,執行向量搜尋查詢:
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims
>= 15
ORDER BY abstract_embeddings
<=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

結果應類似於以下內容:

6989de0fc3f0f753.png

  1. 對其執行 Explain Analyze:(沒有索引或內嵌篩選)

908dcf87c7f00ed4.png

執行時間為 2.4 毫秒

  1. 我們將在 num_claims 欄位上建立一般索引,以便篩選:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. 讓我們為專利搜尋應用程式建立 ScaNN 索引。在 AlloyDB Studio 中執行下列指令:
CREATE INDEX patent_index ON patents_data 
USING scann
(abstract_embeddings cosine)
WITH
(num_leaves=32);

重要注意事項: (num_leaves=32) 適用於資料集的總列數超過 1000 列。如果資料列計數少於 100,則不需要建立索引,因為索引不適用於較少的資料列。

  1. 設定在 ScaNN 索引上啟用內嵌篩選功能:
SET scann.enable_inline_filtering = on
  1. 現在,請執行含有篩選器和向量搜尋的相同查詢:
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims
>= 15
ORDER BY abstract_embeddings
<=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

aa54cba2b2ada2cb.png

如您所見,執行相同向量搜尋的時間大幅縮短。在向量搜尋中加入內嵌篩選器並注入 ScaNN 索引,就能實現這項功能!

接下來,我們來評估啟用 ScaNN 的向量搜尋功能的回溯率。

喚回評估工具

相似搜尋中的回憶率,是指從搜尋中擷取的相關例項百分比,也就是真陽性個案的數量。這是評估搜尋品質最常用的指標。回想率損失的其中一個原因,是近似近鄰搜尋 (ANN) 與 k (精確) 近鄰搜尋 (KNN) 之間的差異。向量索引 (例如 AlloyDB 的 ScaNN) 會實作近似近鄰演算法,讓您在大型資料集上加快向量搜尋速度,但須犧牲一點召回率。現在,AlloyDB 可讓您直接在資料庫中評估個別查詢的權衡,並確保其長期穩定性。您可以根據這項資訊更新查詢和索引參數,以便取得更優異的結果和效能。

搜尋結果回憶法背後的邏輯為何?

在向量搜尋的情況下,回憶率是指索引傳回的向量中,真正最近鄰的百分比。舉例來說,如果最近鄰查詢的 20 個最近鄰點中,有 19 個是實際值最近鄰點,則回憶率為 19/20x100 = 95%。回溯率是用於評估搜尋品質的指標,定義為傳回結果與查詢向量客觀上最接近的百分比。

您可以使用 evaluate_query_recall 函式,找出向量查詢在特定配置的向量索引中的回憶率。這個函式可讓您調整參數,以取得所需的向量查詢回溯結果。

重要注意事項:

如果您在執行下列步驟時,遇到 HNSW 索引的權限遭拒錯誤,請先略過整個回憶評估部分。這可能與目前的存取限制有關,因為本程式碼研究室的說明文件是在該限制發布後才撰寫。

  1. 在 ScaNN 索引和 HNSW 索引上設定「啟用索引掃描」標記:
SET scann.enable_indexscan = on
SET hnsw
.enable_index_scan = on
  1. 在 AlloyDB Studio 中執行以下查詢:
SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

evaluate_query_recall 函式會將查詢做為參數,並傳回其回憶率。我使用用於檢查效能的查詢做為函式輸入查詢。我已將 SCaNN 新增為索引方法。如需更多參數選項,請參閱說明文件

我們使用這個向量搜尋查詢的回憶率:

c98f38fbe6a0b6c5.png

我發現 RECALL 為 70%。我現在可以使用這項資訊變更索引參數、方法和查詢參數,並提高這個向量搜尋的回憶率!

7. 使用修改過的查詢和索引參數進行測試

現在,我們將根據收到的回收資料修改查詢參數,來測試查詢。

  1. 我已將結果集中的資料列數量修改為 7 (先前為 25),發現 RECALL 有所改善,即 86%。

c12f7b92b8481ceb.png

也就是說,我可以在即時情況下調整使用者看到的相符項目數量,根據使用者的搜尋情境改善相符項目的相關性。

  1. 請修改索引參數,再試一次:

在這項測試中,我將使用 "L2 Distance" 而非 "Cosine" 相似度距離函式。我也會將查詢限制改為 10,看看即使搜尋結果集數量增加,搜尋結果的品質是否會有所改善。

[舊版] 使用餘弦相似度距離函式的查詢:

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

重要注意事項:「我們如何知道這個查詢使用 COSINE 相似度?」您可以使用「<=>"」表示餘弦距離,藉此識別距離函式。

說明文件連結:Vector Search 距離函式。

以上查詢的結果如下:

c62ef8922d6bf0b2.png

如您所見,即使不變更索引邏輯,RECALL 仍可達到 70%。還記得我們在「內嵌篩選」部分第 6 步驟中建立的 ScaNN 索引「patent_index」嗎?執行上述查詢時,同一個索引仍有效。

現在,我們來使用不同的距離函式查詢建立索引:L2 距離:<->

drop index patent_index;

CREATE INDEX patent_index_L2 ON patents_data
USING scann
(abstract_embeddings L2)
WITH
(num_leaves=32);

刪除索引陳述式只是為了確保資料表中沒有不必要的索引。

現在,我可以執行下列查詢,在變更向量搜尋功能的距離函式後評估 RECALL。

[修正後] 使用餘弦相似度距離函式的查詢:

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <-> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

以上查詢的結果如下:

6c163dd08cf4d693.png

回憶值的轉換率高達 90%!!!

您也可以根據所需的回溯值和應用程式使用的資料集,在索引中變更其他參數,例如 num_leaves 等。

8. 清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取這篇文章中所用資源的費用,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中前往「資源管理工具」頁面。
  2. 在專案清單中選取要刪除的專案,然後點按「刪除」。
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。
  4. 或者,您也可以按一下「DELETE CLUSTER」按鈕,刪除我們剛為這個專案建立的 AlloyDB 叢集 (如果您在設定時未為叢集選擇 us-central1,請變更這則超連結中的地點)。

9. 恭喜

恭喜!您已成功使用 AlloyDB 的進階向量搜尋功能,建構出效能高且真正以意義為導向的上下文專利搜尋查詢。我已整合了採用 ADK 和我們在此討論的所有 AlloyDB 內容的品質控管多工具代理應用程式,以便建立效能優異且品質優良的專利向量搜尋與分析代理程式,您可以前往以下網址查看:https://youtu.be/Y9fvVY0yZTY

如要瞭解如何建構該代理程式,請參閱這個 codelab

立即開始