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

1. 總覽

專利研究在各行業中都是一項重要的工具,有助於瞭解競爭狀況、找出潛在的授權或獲取機會,以及避免侵犯現有專利。

專利研究是龐大而複雜的。要逐一篩選無數技術抽象化,以找出相關創新,是一項艱鉅的任務。傳統的關鍵字搜尋通常不準確且耗時。抽象化架構繁瑣,且需要專業技術,因此難以迅速掌握核心概念。這可能會導致研究人員錯失重要專利,或是耗費時間研究不相關的結果。

目標

在本程式碼研究室中,我們會利用 Spanner 以及就地運用的 Gemini 1.0 Pro、嵌入和 Vector Search,加快專利搜尋流程,讓搜尋過程變得更快、更直覺,且精準。

建構項目

在這個研究室中,您將完成以下工作:

  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. 將資料庫名稱設為專利。
  5. 按一下「建立」來建立資料庫。

建立表格

  1. 在 Google Cloud 控制台中,開啟「Spanner」Spanner頁面。
  2. 從清單中選取 spanner-vertex 例項。
  3. 選取 patents 資料庫。
  4. 在「Tables」分頁下方,按一下 [Create Table]。Spanner Studio 頁面會隨即開啟。
  5. 按一下「新增 SQL 編輯器」分頁標籤開啟新分頁。
  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 專利公開資料集做為資料集。我們將使用 Spanner Studio 執行查詢。spanner-gemini-search 存放區包含會執行以載入專利資料的 insert_into_patents_data.sql 指令碼。

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

5. 建立 Gemini 1.0 Pro 適用的遠端模型

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

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

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」Explorer窗格會顯示資料庫中的物件清單。
  2. 按一下「新增 SQL 編輯器」分頁標籤開啟新分頁。
  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. 按一下「執行」。查詢結果會顯示在「Results」資料表中。

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

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

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」Explorer窗格會顯示資料庫中的物件清單。
  2. 按一下「新增 SQL 編輯器」分頁標籤開啟新分頁。
  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. 按一下「執行」。查詢結果會顯示在「Results」資料表中。

7. 根據專利摘要建立生成式深入分析資訊

我們會建立 patents_data_gemini 資料表,用於儲存生成式深入分析資訊,這些深入分析資訊將使用我們先前建立的 Gemini 1.5 Pro 模型生成。

建立表格

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

產生深入分析資訊

如要在資料表中填入生成式深入分析資訊,建議使用採用批次寫入或異動方法的應用程式。在這個程式碼研究室中,我們會最多執行下列 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
));

注意:如果您在這個步驟收到「超過配額」錯誤訊息 (在小利潤免費抵免額的情況下),請嘗試略過插入作業,並只執行下方「解決方法」部分中的選取查詢。

解決方法:

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」Explorer窗格會顯示資料庫中的物件清單。
  2. 按一下「新增 SQL 編輯器」分頁標籤開啟新分頁。
  3. 執行下列查詢來建立 patents_data_embeddings 資料表。
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. 按一下「執行」。查詢結果會顯示在「Results」資料表中。
  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. 按一下「執行」。查詢結果會顯示在「Results」資料表中。

觀察結果

這份表格包含系統為標題和摘要文字產生的嵌入項目,

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

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 Nearest Neighbors」相似搜尋功能提供搜尋結果的邏輯。您可以搭配搜尋應用程式使用這個準備的資料集,以視覺化方式呈現搜尋結果。

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

執行以下查詢:

  1. 在導覽選單中,按一下「Spanner Studio」。「Explorer」Explorer窗格會顯示資料庫中的物件清單。
  2. 按一下「新增 SQL 編輯器」分頁標籤開啟新分頁。
  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. 按一下「執行」。查詢結果會顯示在「Results」資料表中。

注意:如果您在最早的插入陳述式中因為有配額錯誤而使用「解決方法」一節中的查詢,可以略過所有其他步驟並直接執行下列查詢,以觀察在 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. 在專案清單中選取要刪除的專案,然後按一下「Delete」(刪除)。如果您不想刪除專案,請直接刪除您在 Spanner 中建立的執行個體。
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。

11. 恭喜

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

後續步驟

如要進一步瞭解 Spanner 最鄰近 (KNN 向量搜尋) 功能,請前往:https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

您也可以造訪下列網址,進一步瞭解如何使用 Spanner 的 VertexAI 整合功能以 SQL 執行線上預測:https://cloud.google.com/spanner/docs/ml