使用 Spanner、Vector Search 建構專利搜尋應用程式;Gemini 1.0 Pro!

1. 總覽

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

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

目標

在本程式碼研究室中,我們將利用 Spanner 和原地 Gemini 1.0 Pro、嵌入和向量搜尋,讓專利搜尋過程更快速、更直覺且精確無比。

建構項目

在本研究室中,您將:

  1. 可建立 Spanner 執行個體
  2. 載入 Google 專利公開資料集
  3. 使用 Gemini 1.0 Pro 模型建立文字嵌入的遠端模型
  4. 根據載入的資料集建立生成式洞察資訊
  5. 根據洞察資訊產生嵌入
  6. 針對資料集發出相似搜尋查詢

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

14cfdde5e24258a.png

需求條件

  • 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. 請在控制台中搜尋 Vertex AI 和 Spanner API,確認已啟用這兩項 API。或者,您也可以在 Cloud Shell 終端機中使用下列指令:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

另一個替代做法是使用這個連結

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

3. 準備 Spanner 資料庫

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

可建立 Spanner 執行個體

  1. 建立名為 spanner-vertexSpanner 執行個體
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

建立資料庫

  1. 在 Google Cloud 控制台中開啟「Spanner」Spanner頁面。
  2. 從清單中選取 spanner-vertex 執行個體。
  3. 在「資料庫」下方,點選「建立資料庫」
  4. 將資料庫名稱設為 patents。
  5. 按一下「建立」,建立資料庫。

建立表格

  1. 在 Google Cloud 控制台中開啟「Spanner」Spanner頁面。
  2. 從清單中選取 spanner-vertex 執行個體。
  3. 選取 patents 資料庫。
  4. 在「資料表」分頁下方,按一下「建立資料表」。Spanner Studio 頁面隨即開啟。
  5. 按一下「New SQL editor」分頁,開啟新的分頁。
  6. 執行以下查詢:
CREATE TABLE patents_data (
   id string(25), type string(25), number string(20), country string(2), date string(20), abstract string(300000), title string(100000),kind string(5), num_claims numeric, filename string(100), withdrawn numeric, 
) PRIMARY KEY (id);

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

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

  1. 在 Google Cloud 控制台中開啟「Spanner」Spanner頁面。
  2. 從清單中選取 spanner-vertex 執行個體。
  3. 選取 patents 資料庫。
  4. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  5. 按一下「New SQL editor」分頁,開啟新的分頁。
  6. 從編輯器中的 insert_into_patents_data.sql 指令碼複製 insert 查詢陳述式。您可以複製 50 到 100 個插入陳述式,快速示範這個用途。
  7. 按一下「執行」。查詢結果會顯示在「結果」表格中。

5. 為 Gemini 1.0 Pro 建立遠端模型

專利資料載入資料庫後,我們會建立遠端模型,使用 Gemini 1.0 Pro Vertex AI 模型產生摘要標題和關鍵字。

在 Spanner Studio 編輯器中執行下列 DDL 指令:

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  2. 按一下「New SQL editor」分頁,開啟新的分頁。
  3. 執行以下查詢:
CREATE MODEL gemini_pro_model INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。

6. 建立文字嵌入的遠端模型

先前步驟的結果包含標題和關鍵字的綜合摘要。我們會將這項回應轉換為嵌入資料,以便在執行查詢時產生適當的配對結果。我們會透過 Spanner 遠端使用 Vertex AI 的 Text Embedding Gecko 003 model

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  2. 按一下「New SQL editor」分頁,開啟新的分頁。
  3. 執行以下查詢:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
 embeddings
   STRUCT<
     statistics STRUCT<truncated BOOL, token_count FLOAT64>,
     values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
 endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/textembedding-gecko@003');
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。

7. 從專利摘要產生生成式洞察資料

我們會建立 patents_data_gemini 資料表,用於儲存透過先前建立的 Gemini 1.5 Pro 模型產生的生成式洞察資料。

建立資料表

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  2. 按一下「New SQL editor」分頁,開啟新的分頁。
  3. 執行以下查詢:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。

產生深入分析資訊

如要透過生成式洞察資料填入資料表,建議您使用採用批次寫入或變異方法的應用程式。在本程式碼研究室中,我們最多會執行 4 次下列 DDL 查詢,以便填入資料表。

INSERT INTO patents_data_gemini (id, gemini_response)
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b where id not in (select id from patents_data_gemini) limit 50
));

注意:如果您在這個步驟中收到「Quota Exceeded」錯誤 (如果您使用的是免費額度較少的方案,就有可能發生這種情況),請嘗試略過插入作業,只執行下方因應措施部分中的選取查詢。

解決方法部分:

SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))

觀察洞察資料

表格中包含針對查詢中 'Identify the areas of work or keywords in this abstract', 提示產生的洞察資料。

注意:如果您執行的是上述解決方法部分的查詢,而非 INSERT DDL,請略過這部分,改為執行本頁最後一個 SELECT 查詢。

請執行下列查詢,驗證洞察結果:

select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;

您會看到以下結果:

6041fab164aaab93.png

注意:如果您執行了因應措施部分的查詢,請將上述選取查詢中的表格名稱,替換為因應措施部分中的查詢。因此,請改為執行以下命令:

select title, abstract, gemini_response from patents_data a inner join (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))) b
on a.id = b.id;

結果應與上方結果螢幕截圖相同。

8. 為產生的洞察資料產生嵌入

在資料表中填入洞察資料後,我們現在可以使用這些洞察資料產生嵌入資料。這些嵌入資料可協助我們不依賴完全比對關鍵字,而是根據概念相似性產生結果。

注意:如果您在上一個步驟中執行了因應措施部分查詢,可以略過這個步驟,並直接查看這個步驟中的因應措施部分查詢。

執行下列查詢來產生嵌入:

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  2. 按一下「New SQL editor」分頁,開啟新的分頁。
  3. 執行下列查詢,建立 patents_data_embeddings 資料表。
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。
  2. 執行下列查詢,產生嵌入值。
INSERT INTO patents_data_embeddings (id, patents_embeddings)
SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM patents_data_gemini));
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。

觀察結果

這個表格包含為標題和摘要文字產生的嵌入資料。

請執行下列查詢來驗證結果:

select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;

您會看到以下結果:

a1e968bac4ab1cb.png

解決方法

如果您已按照其他步驟中的解決方法操作,請使用以下查詢:

select title, abstract, b.patents_embeddings from patents_data a inner join 
(SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
)))))) b
on a.id = b.id;

這應該會產生與上方螢幕截圖相同的結果。

9. 準備向量搜尋

產生文字嵌入內容後,我們可以準備網頁應用程式,以便執行相似向量搜尋。在本程式碼研究室中,我們會建立一個網頁應用程式,其中包含根據 K-Nearest Neighbors 相似度搜尋功能提供搜尋結果的邏輯。您可以將這個準備好的資料集搭配搜尋應用程式使用,以視覺化方式呈現搜尋結果。

在程式碼研究室中,我們將執行範例查詢,搜尋提示、根據內容產生結果,並將結果限制在 10 個項目。

執行以下查詢:

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」窗格會顯示資料庫中的物件清單。
  2. 按一下「New SQL editor」分頁,開啟新的分頁。
  3. 執行下列查詢,建立 patents_data_embeddings 資料表。
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join patents_data_gemini b on a.id = b.id
inner join patents_data_embeddings c on a.id = c.id
ORDER BY distance
LIMIT 10;
  1. 按一下「執行」。查詢結果會顯示在「結果」表格中。

注意:如果您在解決方法部分使用查詢,因為最早的插入陳述式之一出現配額錯誤,您可以略過所有其他步驟,直接執行以下查詢,觀察在 Spanner 資料庫中對向量嵌入執行最近鄰搜尋的結果:

SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join (SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b 
)))))) c on a.id = c.id
ORDER BY distance
LIMIT 2;

觀察結果

先前的查詢使用 COSINE_DISTANCE 方法,找出與提示最相符的 10 個項目。

您會看到以下結果:

d26ca8b8238bdf25.png

系統產生的結果與查詢中提示的內容非常接近。

10. 清理

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

  1. 在 Google Cloud 控制台中前往「管理資源」頁面。
  2. 在專案清單中選取要刪除的專案,然後按一下「刪除」。如果您不想刪除專案,只要刪除在 Spanner 中建立的執行個體即可。
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。

11. 恭喜

恭喜!您已成功使用 Spanner 內建的向量搜尋功能執行相似度搜尋。此外,您也瞭解如何輕鬆使用嵌入和大型語言模型,直接透過 SQL 提供生成式 AI 功能。

後續步驟

如要進一步瞭解 Spanner 的 K 近鄰 (KNN 向量搜尋) 功能,請參閱以下網頁:https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

您也可以參閱 https://cloud.google.com/spanner/docs/ml 進一步瞭解如何使用 Spanner 的 VertexAI 整合功能,透過 SQL 執行線上預測。