程式碼研究室簡介
1. 總覽
在各個產業中,內容比對搜尋都是應用程式的核心功能。檢索增強生成技術已在相當長的一段時間內,以生成式 AI 技術為基礎的檢索機制,成為這項重要技術演進的關鍵推手。生成式模型擁有廣泛的脈絡視窗和出色的輸出品質,正在改變 AI 的發展方向。RAG 提供系統化方式,可將情境資料注入 AI 應用程式和代理程式,並以結構化資料庫或各種媒體的資訊做為基礎。這些背景資料對於釐清真相和確保輸出結果的準確性至關重要,但這些結果的準確性如何?貴公司是否在很大程度上依賴這些內容比對和關聯度的準確度?那麼,這項專案一定會讓您愛不釋手!
向量搜尋的秘訣不僅在於建立向量,還在於瞭解向量比對是否確實良好。我們都曾經歷過這種情況,茫然地盯著結果清單,心想:「這東西到底有沒有在運作?」接下來,我們將深入探討如何評估向量比對的品質。您可能會問:「RAG 有哪些變化?」一切!多年以來,檢索增強生成 (RAG) 技術一直是個有希望但難以實現的目標。如今,我們終於有工具可用於建構 RAG 應用程式,並提供執行關鍵任務所需的效能和可靠性。
我們現在已掌握 3 項基礎知識:
- 說明情境搜尋對你的服務機器人有何意義,以及如何使用 Vector Search 達成目標。
- 我們也深入探討如何在資料範圍內 (也就是在資料庫本身) 使用向量搜尋 (如果您還不清楚,所有 Google Cloud 資料庫都支援這項功能)。
- 我們比其他人更進一步,說明如何透過 ScaNN 索引支援的 AlloyDB 向量搜尋功能,實現輕量向量搜尋 RAG 功能,以便提供高效能和高品質的服務。
如果您尚未完成基本、中級和略為進階的 RAG 實驗,建議您按照以下順序閱讀這 3 篇文章:這裡、這裡和這裡。
專利搜尋可協助使用者找到與搜尋文字相關的上下文專利,我們在過去就已建立這類功能。我們現在將使用新版進階 RAG 功能建構應用程式,以便為該應用程式提供品質受控的內容相關搜尋功能。讓我們一起來瞭解
下圖顯示這個應用程式中整體流程的運作情形。~
目標
允許使用者根據文字說明搜尋專利,提升效能和品質,同時使用 AlloyDB 最新的 RAG 功能評估產生的比對結果品質。
建構項目
在本實驗室中,您將:
- 建立 AlloyDB 例項並載入專利公開資料集
- 建立中繼資料索引和 ScaNN 索引
- 使用 ScaNN 的內嵌篩選方法,在 AlloyDB 中實作進階向量搜尋
- 實作回想評估功能
- 評估查詢回應
需求條件
2. 事前準備
建立專案
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
- 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境。按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」。
- 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
- 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
- 如果未設定專案,請使用下列指令進行設定:
gcloud config set project <YOUR_PROJECT_ID>
- 啟用必要的 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 叢集、執行個體和資料表,用於載入專利資料集。
建立叢集和執行個體
- 前往 Cloud 控制台的 AlloyDB 頁面。如要輕鬆在 Cloud Console 中找到大部分的頁面,請使用控制台的搜尋列進行搜尋。
- 在該頁面中選取「建立叢集」:
- 您會看到類似下方的畫面。使用下列值建立叢集和執行個體 (如果您要從存放區複製應用程式程式碼,請務必確認這些值相符):
- 叢集 ID:"
vector-cluster
" - 密碼:"
alloydb
" - PostgreSQL 15 / 最新版本 (建議使用)
- Region:"
us-central1
" - 網路:"
default
"
- 選取預設網路後,畫面會顯示如下圖所示畫面。
選取「設定連線」。
- 接著選取「使用系統自動分配的 IP 範圍」,然後按一下「繼續」。查看相關資訊後,請選取「建立連線」。
- 網路設定完成後,您可以繼續建立叢集。按一下「CREATE CLUSTER」,完成叢集設定,如下所示:
請務必變更執行個體 ID (您可以在設定叢集 / 執行個體時找到) 為
vector-instance
。如果無法變更,請務必在所有後續參照中使用例項 ID。
請注意,叢集建立作業大約需要 10 分鐘。成功後,畫面上會顯示剛剛建立的叢集總覽。
4. 資料擷取
接下來,我們要新增一個包含商店資料的表格。前往 AlloyDB,選取主要叢集,然後選取 AlloyDB Studio:
您可能需要等待執行個體建立完成。完成後,請使用建立叢集時建立的憑證登入 AlloyDB。使用下列資料驗證 PostgreSQL:
- 使用者名稱:"
postgres
" - 資料庫:
postgres
- 密碼:
alloydb
成功驗證 AlloyDB Studio 後,您就可以在編輯器中輸入 SQL 指令。您可以使用最後一個視窗右側的加號新增多個編輯器視窗。
您會在編輯器視窗中輸入 AlloyDB 指令,並視需要使用「Run」、「Format」和「Clear」選項。
啟用擴充功能
我們將使用擴充功能 pgvector
和 google_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
檔案,我們會執行這個檔案來載入專利資料。
- 在 Google Cloud 控制台中,開啟 AlloyDB 頁面。
- 選取新建立的叢集,然後按一下執行個體。
- 在 AlloyDB 導覽選單中,按一下「AlloyDB Studio」。使用憑證登入。
- 按一下右側的「新分頁」圖示,開啟新分頁。
- 請將上述
insert_scripts.sql
指令碼中的insert
查詢陳述式複製到編輯器中。您可以複製 10 到 50 個插入陳述式,快速示範這個用途。 - 按一下「執行」。查詢結果會顯示在「結果」表格中。
注意:你可能會發現插入指令碼中含有大量資料。這是因為我們已在插入指令碼中加入嵌入項目。如果無法順利在 GitHub 中載入檔案,請按一下「查看原始資料」。這是為了避免您在使用 Google Cloud 的試用額度帳單帳戶時,產生超過幾個嵌入資料 (最多 20 到 25 個) 的麻煩 (在後續步驟中)。
5. 為專利資料建立嵌入
首先,請執行以下範例查詢來測試嵌入函式:
SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');
這應該會針對查詢中的範例文字,傳回看起來像浮點陣列的嵌入向量。如下所示:
更新 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;
在這個查詢中,
- 使用者搜尋的文字為:「Sentiment Analysis」。
- 我們會使用模型 text-embedding-005,在 embedding() 方法中將其轉換為嵌入。
- "<=>" 代表使用 COSINE SIMILARITY 距離方法。
- 我們將嵌入方法的結果轉換為向量類型,以便與資料庫中儲存的向量相容。
- LIMIT 10 代表我們會選取與搜尋文字最相符的 10 個項目。
AlloyDB 可將向量搜尋 RAG 提升至更高層級:
我們推出了許多新功能,其中兩個以開發人員為主的功能如下:
- 內嵌式篩選
- 喚回評估工具
內嵌式篩選
以往開發人員必須執行向量搜尋查詢,並處理篩選和回憶功能。AlloyDB 查詢最佳化工具會選擇如何執行含有篩選條件的查詢。內嵌篩選是一種新的查詢最佳化技術,可讓 AlloyDB 查詢最佳化工具同時評估中繼資料篩選條件和向量搜尋,並利用中繼資料欄的向量索引和索引。這項功能可提高喚回效能,讓開發人員充分利用 AlloyDB 提供的即用功能。
內嵌式篩選最適合中等選擇性。當 AlloyDB 搜尋向量索引時,只會為符合結構描述資料篩選條件的向量計算距離 (查詢中的函式篩選器通常會在 WHERE 子句中處理)。這項功能可大幅改善這些查詢的效能,並補足後置篩選或前置篩選的優點。
- 安裝或更新 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 索引,因為索引不適用於較少的資料列。請略過下列步驟。
- 如要建立 ScaNN 索引,請安裝 alloydb_scann 擴充功能。
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- 首先,請不啟用索引和不啟用內嵌篩選器,執行向量搜尋查詢:
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;
結果應類似於以下內容:
- 對其執行 Explain Analyze:(沒有索引或內嵌篩選)
執行時間為 2.4 毫秒
- 我們將在 num_claims 欄位上建立一般索引,以便篩選:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
- 讓我們為專利搜尋應用程式建立 ScaNN 索引。在 AlloyDB Studio 中執行下列指令:
CREATE INDEX patent_index ON patents_data
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);
重要注意事項: (num_leaves=32)
適用於資料集的總列數超過 1000 列。如果資料列計數少於 100,則不需要建立索引,因為索引不適用於較少的資料列。
- 設定在 ScaNN 索引上啟用內嵌篩選功能:
SET scann.enable_inline_filtering = on
- 現在,請執行含有篩選器和向量搜尋的相同查詢:
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;
如您所見,執行相同向量搜尋的時間大幅縮短。在向量搜尋中加入內嵌篩選器並注入 ScaNN 索引,就能實現這項功能!
接下來,我們來評估啟用 ScaNN 的向量搜尋功能的回溯率。
喚回評估工具
相似搜尋中的回憶率,是指從搜尋中擷取的相關例項百分比,也就是真陽性個案的數量。這是評估搜尋品質最常用的指標。回想率損失的其中一個原因,是近似近鄰搜尋 (ANN) 與 k (精確) 近鄰搜尋 (KNN) 之間的差異。向量索引 (例如 AlloyDB 的 ScaNN) 會實作近似近鄰演算法,讓您在大型資料集上加快向量搜尋速度,但須犧牲一點召回率。現在,AlloyDB 可讓您直接在資料庫中評估個別查詢的權衡,並確保其長期穩定性。您可以根據這項資訊更新查詢和索引參數,以便取得更優異的結果和效能。
搜尋結果回憶法背後的邏輯為何?
在向量搜尋的情況下,回憶率是指索引傳回的向量中,真正最近鄰的百分比。舉例來說,如果最近鄰查詢的 20 個最近鄰點中,有 19 個是實際值最近鄰點,則回憶率為 19/20x100 = 95%。回溯率是用於評估搜尋品質的指標,定義為傳回結果與查詢向量客觀上最接近的百分比。
您可以使用 evaluate_query_recall 函式,找出向量查詢在特定配置的向量索引中的回憶率。這個函式可讓您調整參數,以取得所需的向量查詢回溯結果。
重要注意事項:
如果您在執行下列步驟時,遇到 HNSW 索引的權限遭拒錯誤,請先略過整個回憶評估部分。這可能與目前的存取限制有關,因為本程式碼研究室的說明文件是在該限制發布後才撰寫。
- 在 ScaNN 索引和 HNSW 索引上設定「啟用索引掃描」標記:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
- 在 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 新增為索引方法。如需更多參數選項,請參閱說明文件。
我們使用這個向量搜尋查詢的回憶率:
我發現 RECALL 為 70%。我現在可以使用這項資訊變更索引參數、方法和查詢參數,並提高這個向量搜尋的回憶率!
7. 使用修改過的查詢和索引參數進行測試
現在,我們將根據收到的回收資料修改查詢參數,來測試查詢。
- 我已將結果集中的資料列數量修改為 7 (先前為 25),發現 RECALL 有所改善,即 86%。
也就是說,我可以在即時情況下調整使用者看到的相符項目數量,根據使用者的搜尋情境改善相符項目的相關性。
- 請修改索引參數,再試一次:
在這項測試中,我將使用 "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 距離函式。
以上查詢的結果如下:
如您所見,即使不變更索引邏輯,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']);
以上查詢的結果如下:
回憶值的轉換率高達 90%!!!
您也可以根據所需的回溯值和應用程式使用的資料集,在索引中變更其他參數,例如 num_leaves 等。
8. 清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取這篇文章中所用資源的費用,請按照下列步驟操作:
- 在 Google Cloud 控制台中前往「資源管理工具」頁面。
- 在專案清單中選取要刪除的專案,然後點按「刪除」。
- 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。
- 或者,您也可以按一下「DELETE CLUSTER」按鈕,刪除我們剛為這個專案建立的 AlloyDB 叢集 (如果您在設定時未為叢集選擇 us-central1,請變更這則超連結中的地點)。
9. 恭喜
恭喜!您已成功使用 AlloyDB 的進階向量搜尋功能,建構出效能高且真正以意義為導向的上下文專利搜尋查詢。我已整合了採用 ADK 和我們在此討論的所有 AlloyDB 內容的品質控管多工具代理應用程式,以便建立效能優異且品質優良的專利向量搜尋與分析代理程式,您可以前往以下網址查看:https://youtu.be/Y9fvVY0yZTY
如要瞭解如何建構該代理程式,請參閱這個 codelab。
立即開始!