1. 總覽
在各個產業中,專利研究是瞭解競爭環境、找出潛在的授權或收購商機,以及避免侵害現有專利的重要工具。
專利研究範圍廣泛且複雜。篩選無數的技術摘要,找出相關的創新技術,是一項艱鉅的任務。傳統的關鍵字搜尋方式往往不準確且耗時。摘要內容冗長且技術性,很難讓讀者快速掌握核心概念。這可能導致研究人員錯過重要專利,或浪費時間在無關的結果上。
這項創新的秘訣在於 Vector Search。向量搜尋不會只依賴簡單的關鍵字比對,而是會將文字轉換為數值表示法 (嵌入)。這樣一來,我們就能根據查詢的含義進行搜尋,而非只使用特定字詞。在文獻搜尋領域,這項功能可說是劃時代的突破。舉例來說,即使文件中未使用「可穿戴式心率監測器」這個詞組,您還是可以找到相關專利。
目標
在本程式碼研究室中,我們將利用 AlloyDB、pgvector 擴充功能,以及 Gemini 1.5 Pro、嵌入和向量搜尋的內置功能,讓專利搜尋過程更快速、更直覺且精確。
建構項目
在本研究室中,您將:
- 建立 AlloyDB 執行個體並載入專利公開資料集資料
- 在 AlloyDB 中啟用 pgvector 和生成式 AI 模型擴充功能
- 根據洞察資訊產生嵌入
- 針對使用者搜尋文字執行即時餘弦相似度搜尋
- 在無伺服器 Cloud Functions 中部署解決方案
下圖顯示實作過程中涉及的資料流程和步驟。
High level diagram representing the flow of the Patent Search Application with AlloyDB
需求條件
2. 事前準備
建立專案
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
- 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境,並預先載入 bq。按一下 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 叢集、執行個體和資料表,用於載入專利資料集。
建立 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
指令碼,用於載入專利資料。
- 在 Google Cloud 控制台中,開啟 AlloyDB 頁面。
- 選取新建立的叢集,然後按一下執行個體。
- 在 AlloyDB 導覽選單中,按一下「AlloyDB Studio」。使用憑證登入。
- 按一下右側的「新分頁」圖示,開啟新分頁。
- 請將上述
insert_into_patents_data.sql
指令碼中的insert
查詢陳述式複製到編輯器中。您可以複製 50 到 100 個插入陳述式,快速示範這個用途。 - 按一下「執行」。查詢結果會顯示在「結果」表格中。
5. 為專利資料建立嵌入
首先,請執行以下查詢範例來測試嵌入函式:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
這應該會針對查詢中的範例文字,傳回看起來像浮點陣列的嵌入向量。如下所示:
更新 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;
在這個查詢中,
- 使用者搜尋的文字為:「A new Natural Language Processing related Machine Learning Model」。
- 我們會使用模型 textembedding-gecko@003,在 embedding() 方法中將其轉換為嵌入。
- "<=>" 代表使用 COSINE SIMILARITY 距離方法。
- 我們會將嵌入方法的結果轉換為向量類型,以便與儲存在資料庫中的向量相容。
- LIMIT 10 代表我們會選取與搜尋字串最相符的 10 個項目。
結果如下:
如您在結果中看到的,相符項目與搜尋文字非常相近。
7. 將應用程式發布到網路
準備好將這個應用程式移至網路了嗎?步驟如下:
- 前往 Cloud Shell 編輯器,然後按一下編輯器左下角 (狀態列) 的「Cloud Code - Sign In」圖示。選取已啟用帳單功能的目前 Google Cloud 專案,並確認您也已透過 Gemini 登入相同專案 (位於狀態列的右上角)。
- 按一下 Cloud Code 圖示,等待 Cloud Code 對話方塊彈出。選取「New Application」,然後在「Create New Application」(建立新應用程式) 彈出式視窗中,選取 Cloud Functions 應用程式:
在「Create New Application」(建立新應用程式) 彈出式視窗的 2/2 頁面中,選取「Java: Hello World」,然後在偏好的位置輸入「alloydb-pgvector」做為專案名稱,然後按一下「OK」:
- 在產生的專案結構中,搜尋 pom.xml,然後將其替換為存放區檔案中的內容。除了其他幾個依附元件外,它還應具備以下依附元件:
- 將 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);
}
- 如要部署剛建立的 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 函式控制台中看到函式。搜尋及開啟新建立的函式,編輯設定並變更下列項目:
- 前往「執行階段、建構作業、連線和安全性設定」
- 將逾時時間提高至 180 秒
- 前往「連線設定」分頁:
- 在「Ingress」設定下方,確認已選取「Allow all traffic」(允許所有流量)。
- 在「Egress」設定下,按一下「Network」下拉式選單,然後選取「Add New VPC Connector」選項,並按照彈出式對話方塊中的操作說明進行:
- 請為 VPC 連接器提供名稱,並確認區域與執行個體相同。將「Network」值保留為預設值,並將「Subnet」設為「Custom IP Range」,IP 範圍為 10.8.0.0 或可用的類似值。
- 展開「顯示縮放設定」,並確認設定值是否完全符合下列設定:
- 按一下「建立」,這個連接器現在應該會列在輸出設定中。
- 選取新建的連接器
- 選擇將所有流量轉送至這個虛擬私有雲連接器。
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"}'
結果:
您也可以透過「Cloud Functions」清單測試。選取已部署的函式,然後前往「TESTING」分頁。在要求 JSON 的「設定觸發事件」部分文字方塊中,輸入以下內容:
{"search": "A new Natural Language Processing related Machine Learning Model"}
按一下「Test the function」按鈕,即可在頁面右側看到結果:
大功告成!在 AlloyDB 資料上使用嵌入模型執行相似度向量搜尋,就這麼簡單。
9. 清理
如要避免系統向您的 Google Cloud 帳戶收取這篇文章所用資源的費用,請按照下列步驟操作:
- 在 Google Cloud 控制台中前往「管理」
- 資源頁面。
- 在專案清單中選取要刪除的專案,然後點按「刪除」。
- 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。
10. 恭喜
恭喜!您已成功使用 AlloyDB、pgvector 和向量搜尋功能執行相似度搜尋。結合 AlloyDB、Vertex AI 和 Vector Search 的功能,我們已大幅改善文獻搜尋功能,讓使用者能以有意義的方式,輕鬆且有效率地搜尋文獻。