運用 AlloyDB、Vector Search 和 Vertex AI 建構專利搜尋應用程式!

1. 總覽

在各個產業中,專利研究是瞭解競爭環境、找出潛在的授權或收購商機,以及避免侵害現有專利的重要工具。

專利研究範圍廣泛且複雜。篩選無數的技術摘要,找出相關的創新技術,是一項艱鉅的任務。傳統的關鍵字搜尋方式往往不準確且耗時。摘要內容冗長且技術性,很難讓讀者快速掌握核心概念。這可能導致研究人員錯過重要專利,或浪費時間在無關的結果上。

這項創新的秘訣在於 Vector Search。向量搜尋不會只依賴簡單的關鍵字比對,而是會將文字轉換為數值表示法 (嵌入)。這樣一來,我們就能根據查詢的含義進行搜尋,而非只使用特定字詞。在文獻搜尋領域,這項功能可說是劃時代的突破。舉例來說,即使文件中未使用「可穿戴式心率監測器」這個詞組,您還是可以找到相關專利。

目標

在本程式碼研究室中,我們將利用 AlloyDB、pgvector 擴充功能,以及 Gemini 1.5 Pro、嵌入和向量搜尋的內置功能,讓專利搜尋過程更快速、更直覺且精確。

建構項目

在本研究室中,您將:

  1. 建立 AlloyDB 執行個體並載入專利公開資料集資料
  2. 在 AlloyDB 中啟用 pgvector 和生成式 AI 模型擴充功能
  3. 根據洞察資訊產生嵌入
  4. 針對使用者搜尋文字執行即時餘弦相似度搜尋
  5. 在無伺服器 Cloud Functions 中部署解決方案

下圖顯示實作過程中涉及的資料流程和步驟。

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

需求條件

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

2. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  3. 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境,並預先載入 bq。按一下 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 叢集、執行個體和資料表,用於載入專利資料集。

建立 AlloyDB 物件

建立叢集和執行個體,叢集 ID 為「patent-cluster」,密碼為「alloydb」,支援 PostgreSQL 15,區域為「us-central1」,網路設定為「default」。將執行個體 ID 設為「patent-instance」。按一下「建立叢集」。如需建立叢集的詳細資訊,請參閱以下連結:https://cloud.google.com/alloydb/docs/cluster-create

建立表格

您可以在 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) ;

啟用擴充功能

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

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

授予權限

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

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 會顯示您的專案編號。

或者,您也可以使用 gcloud 指令授予存取權:

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"

變更資料表,新增用於儲存嵌入向量的向量欄

執行下列 DDL,將 abstract_embeddings 欄位新增至剛剛建立的資料表。這個資料欄可儲存文字的向量值:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. 將專利資料載入資料庫

我們會使用 BigQuery 中的 Google Patents 公開資料集做為資料集。我們將使用 AlloyDB Studio 執行查詢。alloydb-pgvector 存放區包含我們要執行的 insert_into_patents_data.sql 指令碼,用於載入專利資料。

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

5. 為專利資料建立嵌入

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

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

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

25a1d7ef0e49e91e.png

更新 abstract_embeddings 向量欄位

執行下列 DML,使用對應的嵌入資料更新資料表中的專利摘要:

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

6. 執行向量搜尋

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

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

在這個查詢中,

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

結果如下:

8e77af965fc787ae.png

如您在結果中看到的,相符項目與搜尋文字非常相近。

7. 將應用程式發布到網路

準備好將這個應用程式移至網路了嗎?步驟如下:

  1. 前往 Cloud Shell 編輯器,然後按一下編輯器左下角 (狀態列) 的「Cloud Code - Sign In」圖示。選取已啟用帳單功能的目前 Google Cloud 專案,並確認您也已透過 Gemini 登入相同專案 (位於狀態列的右上角)。
  2. 按一下 Cloud Code 圖示,等待 Cloud Code 對話方塊彈出。選取「New Application」,然後在「Create New Application」(建立新應用程式) 彈出式視窗中,選取 Cloud Functions 應用程式:

a800ee1eb6cb8a5b.png

在「Create New Application」(建立新應用程式) 彈出式視窗的 2/2 頁面中,選取「Java: Hello World」,然後在偏好的位置輸入「alloydb-pgvector」做為專案名稱,然後按一下「OK」:

5b09446ecf7d4f8d.png

  1. 在產生的專案結構中,搜尋 pom.xml,然後將其替換為存放區檔案中的內容。除了其他幾個依附元件外,它還應具備以下依附元件:

2b3a3cdd75a57711.png

  1. 將 HelloWorld.java 檔案替換為 repo 檔案中的內容。

請注意,您必須將下列值替換為實際值:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

請注意,這個函式會將搜尋文字做為輸入參數,並使用「search」做為鍵,在這個實作中,我們只會從資料庫傳回最相符的項目:

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. 如要部署剛建立的 Cloud 函式,請在 Cloud Shell 終端機中執行下列指令。請記得先使用以下指令前往對應的專案資料夾:
cd alloydb-pgvector

然後執行下列指令:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

重要步驟:

設定部署作業後,您應該會在 Google Cloud Run 函式控制台中看到函式。搜尋及開啟新建立的函式,編輯設定並變更下列項目:

  1. 前往「執行階段、建構作業、連線和安全性設定」
  2. 將逾時時間提高至 180 秒
  3. 前往「連線設定」分頁:

4e83ec8a339cda08.png

  1. 在「Ingress」設定下方,確認已選取「Allow all traffic」(允許所有流量)。
  2. 在「Egress」設定下,按一下「Network」下拉式選單,然後選取「Add New VPC Connector」選項,並按照彈出式對話方塊中的操作說明進行:

8126ec78c343f199.png

  1. 請為 VPC 連接器提供名稱,並確認區域與執行個體相同。將「Network」值保留為預設值,並將「Subnet」設為「Custom IP Range」,IP 範圍為 10.8.0.0 或可用的類似值。
  2. 展開「顯示縮放設定」,並確認設定值是否完全符合下列設定:

7baf980463a86a5c.png

  1. 按一下「建立」,這個連接器現在應該會列在輸出設定中。
  2. 選取新建的連接器
  3. 選擇將所有流量轉送至這個虛擬私有雲連接器。

8. 測試應用程式

部署完成後,您應該會看到以下格式的端點:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

您可以透過 Cloud Shell 終端機執行下列指令來測試:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

結果:

da3dcfac7d024031.png

您也可以透過「Cloud Functions」清單測試。選取已部署的函式,然後前往「TESTING」分頁。在要求 JSON 的「設定觸發事件」部分文字方塊中,輸入以下內容:

{"search": "A new Natural Language Processing related Machine Learning Model"}

按一下「Test the function」按鈕,即可在頁面右側看到結果:

e21f806d661996ff.png

大功告成!在 AlloyDB 資料上使用嵌入模型執行相似度向量搜尋,就這麼簡單。

9. 清理

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

  1. 在 Google Cloud 控制台中前往「管理」
  2. 資源頁面。
  3. 在專案清單中選取要刪除的專案,然後點按「刪除」。
  4. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。

10. 恭喜

恭喜!您已成功使用 AlloyDB、pgvector 和向量搜尋功能執行相似度搜尋。結合 AlloyDBVertex AIVector Search 的功能,我們已大幅改善文獻搜尋功能,讓使用者能以有意義的方式,輕鬆且有效率地搜尋文獻。