Spanner、ベクトル検索、Gemini 1.0 Pro を使用して特許検索アプリを構築

1. 概要

さまざまな業界において、特許調査は競争環境を理解し、使用許諾契約や買収の機会を特定し、既存の特許の侵害を回避するための重要なツールです。

特許調査は広範囲かつ複雑です。 数え切れないほどの技術概要を精査して関連するイノベーションを見つけるのは大変な作業です。 従来のキーワードベースの検索は、多くの場合、不正確で時間がかかります。 特許抄録は長くて技術的なため、核となるアイデアをすぐに把握することが困難です。 これにより、研究者が重要な特許を見逃したり、無関係な結果に時間を浪費したりする可能性があります。

目的

このコードラボでは、Spanner、インプレース Gemini 1.0 Pro、Embeddings、ベクトル検索を活用して、特許検索のプロセスをより高速、より直感的、そして非常に正確にすることを目指します。

アプリの構築手順

このコードラボでは、次のことを行います。

  1. Spannerインスタンスを作成する
  2. Google Patentsの公開データセットを読み込む
  3. Gemini 1.0 Pro モデルを使用してテキストエンべディング(埋め込み)用のリモート モデルを作成する
  4. 読み込まれたデータセットから「インサイト」を作成する
  5. 洞察からエンべディングを生成する
  6. データセットに対する類似性検索クエリを発行する

次の図は、実装に含まれるデータの流れと手順を表しています。

c0c8ab86310e306b.png

要件

  • ChromeFirefoxなどのブラウザ
  • 課金が有効になっている Google Cloud プロジェクト

2. 準備

プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します
  2. Cloud プロジェクトで課金が有効になっていることを確認してください。ドキュメントで プロジェクトで課金が有効になっているかどうかを確認する方法も確認してください。。
  3. BigQueryの bq コマンドがインストールされているCloud Shellを使用します。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。

Activate Cloud Shell button image

  1. Cloud Shell に接続したら、次のコマンドを使用して、すでに認証されていることと、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <PROJECT_ID>
  1. API を有効にするには、 Gemini for Google Cloud Marketplaceに移動します。 Cloud Shell ターミナルで次のコマンドも使用できます。
gcloud services enable spanner.googleapis.com --project <PROJECT_ID>
gcloud services enable aiplatform.googleapis.com --project <PROJECT_ID>
  1. Vertex AI および Spanner API が有効になっていることを確認します。 gcloud コマンドの代替として、 このリンクを使用してコンソールでも確認できます。

gcloud コマンドと使用方法については ドキュメントを参照してください。

3. Spannerデータベースを準備する

特許データセットが読み込まれる Spanner インスタンス、データベース、テーブルを作成しましょう。

Spannerインスタンスを作成する

  1. spanner-vertexという名前の Spanner インスタンスを作成します。
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

データベースを作成する

  1. Google Cloud コンソールで、 Spannerページを開きます。
  2. リストから「spanner-vertex」インスタンスを選択します。
  3. 「データベース」の下で、 「データベースの作成」 をクリックします。
  4. データベース名を patents に設定します。
  5. 作成」をクリックしてデータベースを作成します。

テーブルを作成する

  1. Google Cloud コンソールで、 Spannerページを開きます。
  2. リストから「spanner-vertex」インスタンスを選択します。
  3. patents」 データベースを選択します 。
  4. 「テーブル」タブで、 「テーブルの作成」 をクリックします。 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. 特許データをデータベースにロードする

Google Patents Public Datasets がデータセットとして使用されます。 クエリを実行するには Spanner Studio を使用します。 spanner-gemini-searchリポジトリには、特許データをロードするために実行する insert_into_patents_data.sqlスクリプトが含まれています。

  1. Google Cloud コンソールで、 Spannerページを開きます。
  2. リストから「spanner-vertex」インスタンスを選択します。
  3. patents」データベースを選択します。
  4. ナビゲーション メニューで、 Spanner Studio をクリックします。 エクスプローラーペインには、データベース内のオブジェクトのリストが表示されます。
  5. 新しい SQL エディター タブをクリックして新しいタブを開きます。
  6. エディターで、 「insert_into_patents_data.sql」スクリプトから「insert」クエリ ステートメントをコピーします。 このユースケースの簡単なデモのために、50 ~ 100 個の挿入ステートメントをコピーできます。
  7. [実行]をクリックします。 クエリの結果が結果テーブルに表示されます。

5. Gemini 1.0 Pro のリモート モデルを作成する

特許データがデータベースに読み込まれた後、Vertex AI の Gemini 1.0 Pro モデルを使用してタイトルとキーワードの要約セットを生成するリモート モデルを作成します。

Spanner Studio エディタで次の DDL コマンドを実行します。

  1. ナビゲーション メニューで、 Spanner Studio をクリックします。 エクスプローラーペインには**、**データベース内のオブジェクトのリストが表示されます。
  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. [実行]をクリックします。 クエリの結果が結果テーブルに表示されます。

6. テキストエンべディング用のリモートモデルを作成する

前のステップの結果には、タイトルとキーワードで構成される統合された概要が含まれています。 この応答をクエリを実行するときに適切な一致を生成するのに役立つエンべディングに変換します。 Vertex AI のText Embedding Gecko 003 modelを Spanner からリモートで使用します。

  1. ナビゲーション メニューで、 Spanner Studio をクリックします。 エクスプローラーペインには**、**データベース内のオブジェクトのリストが表示されます。
  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. [実行]をクリックします。 クエリの結果が結果テーブルに表示されます。

7. 特許抄録から生成的なインサイトを生み出す

先ほど作成した Gemini 1.5 Pro モデルを使用して生成する生成的インサイトを保存するためのpatents_data_geminiテーブルを作成します。

テーブルを作成する

  1. ナビゲーション メニューで、 Spanner Studio をクリックします。 エクスプローラーペインには**、**データベース内のオブジェクトのリストが表示されます。
  2. 新しい SQL エディター タブをクリックして新しいタブを開きます。
  3. 次のクエリを実行します。
CREATE TABLE
 patents_data_gemini (id STRING(100),
   gemini_response STRING(MAX))
PRIMARY KEY
 (id);
  1. [実行]をクリックします。 クエリの結果が結果テーブルに表示されます。

インサイトを生成する

生成的なインサイトをテーブルに取り込むには、バッチ書き込みまたはミューテーション方式を使用するアプリケーションを使用することをお勧めします。 このコードラボでは、次の DDL クエリを最大 4 回実行してテーブルにデータを入力します。

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
     5 ));

注: この手順で 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
     5 ));

インサイトを観察する

このテーブルには、 クエリ内のプロンプト「 Identify the areas of work or keywords in this abstract 」 によって生成されたインサイトが保持されています。

次のクエリを実行して、インサイトの結果を確認してみましょう。

SELECT
 title,
 abstract,
 gemini_response
FROM
 patents_data a
INNER JOIN
 patents_data_gemini b
ON
 a.id = b.id;

次のような結果が表示されます。

94e900c24f09b43.png

注: patents_data_gemini テーブルの作成手順中にエラー メッセージが表示された場合は、上記の選択クエリのテーブル名を回避策セクションのクエリに置き換えてください。 したがって、代わりに以下を実行します。

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 をクリックします。 エクスプローラーペインには**、**データベース内のオブジェクトのリストが表示されます。
  2. 新しい SQL エディター タブをクリックして新しいタブを開きます。
  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;

次のような結果が表示されます。

35447939a53ae80a.png

注: 前の手順で patents_data_embeddings ステートメントに挿入したときにエラーが発生した場合は、回避策セクションのクエリで patents_data_gemini テーブルを置き換えます。 クエリは次のようになります:

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
             5 )))))) b
ON
 a.id = b.id;

これにより、上記のスクリーンショットに示されているのと同じ結果になるはずです。

9. ベクトル検索の準備

テキストエンべディングを生成したので、類似性ベクトル検索を実行できるように Web アプリケーションを準備できます。 このコードラボでは、 K 近傍類似度検索機能に基づいて検索結果を提供するロジックを含む Web アプリケーションを作成します。 この準備されたデータセットを 検索アプリで使用すると、検索結果がどのように表示されるかを視覚化できます。

このコードラボでは、プロンプトを検索し、コンテキストに基づいて結果を生成し、結果を 10 エントリに制限するサンプル クエリを実行します。

次のクエリを実行します。

  1. ナビゲーション メニューで、 Spanner Studio をクリックします。 エクスプローラーペインには**、**データベース内のオブジェクトのリストが表示されます。
  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. [実行]をクリックします。 クエリの結果が結果テーブルに表示されます。

注: 最も初期の挿入ステートメントの 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 件の一致を検索します。

次のような結果が表示されます。

b4d21c965668bd80.png

生成される結果は、クエリの一部であったプロンプトと文脈的に非常に近くなります。

10. 掃除

この投稿で使用したリソースに対して Google Cloud アカウントに料金が発生しないようにするには、次の手順に従ってください。

  1. Google Cloud コンソールで、 [リソースの管理]ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、 [削除] をクリックします
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン]をクリックしてプロジェクトを削除します。

11. おめでとうございます

おめでとうございます。Spanner の組み込みベクトル検索を使用して類似性検索を正常に実行しました。 さらに、エンべディングと LLM モデルを操作して、SQL を直接使用して生成 AI 機能を提供することがいかに簡単であるかを確認しました。

次に

Spanner の正確な最近傍 (KNN ベクトル検索) 機能の詳細については、こちらをご覧ください: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Spanner の VertexAI 統合を使用して SQL でオンライン予測を実行する方法の詳細については、こちらをご覧ください: https://cloud.google.com/spanner/docs/ml