AlloyDB、ベクトル検索、Vertex AI を使用して特許検索アプリを作成する

1. 概要

さまざまな業界において、特許調査は競合状況を理解し、潜在的なライセンスや取得の機会を特定し、既存特許の侵害を回避するための重要なツールです。

特許研究は膨大で複雑です。膨大な技術要約を精査して関連するイノベーションを見つけるのは、困難な作業です。従来のキーワード ベースの検索は、正確性に欠け、時間もかかります。要約が長く技術的な内容であるため、主なアイデアをすばやく把握することが難しい。これにより、研究者が重要な特許を見逃したり、関連性のない結果に時間を浪費したりする可能性があります。

この革命の秘密はベクトル検索にあります。ベクトル検索は、単純なキーワードの一致に依存するのではなく、テキストを数値表現(エンベディング)に変換します。これにより、使用された特定の単語だけでなく、クエリの意味に基づいて検索できるようになりました。文献検索の世界では、これは画期的な機能です。ドキュメントで正確なフレーズが使用されていなくても、「ウェアラブル心拍数モニター」の特許を見つけたとします。

目標

この Codelab では、AlloyDB、pgvector 拡張機能、インプレース Gemini 1.5 Pro、エンベディング、ベクトル検索を活用して、特許の検索プロセスをより迅速で直感的かつ非常に正確なものにします。

作成するアプリの概要

このラボでは、次の作業を行います。

  1. AlloyDB インスタンスを作成して、特許公開データセットのデータを読み込む
  2. AlloyDB で pgvector 拡張機能と生成 AI モデル拡張機能を有効にする
  3. 分析情報からエンベディングを生成する
  4. ユーザーの検索テキストに対してリアルタイムで cosine 類似度検索を実行する
  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;

権限を付与

次のステートメントを実行して、「embedding」関数の実行を許可します。

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB サービス アカウントに Vertex AI ユーザーロールを付与する

Google Cloud IAM コンソールから、AlloyDB サービス アカウント(service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com の形式)に「Vertex AI ユーザー」ロールへのアクセス権を付与します。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 特許公開データセットをデータセットとして使用します。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. ユーザーの検索テキストは「新しい自然言語処理関連の機械学習モデル」です。
  2. モデル textembedding-gecko@003 を使用して、embedding() メソッドでエンベディングに変換しています。
  3. "<=>" は、COSINE SIMILARITY 距離メソッドの使用を表します。
  4. エンベディング方法の結果をベクトル型に変換し、データベースに保存されているベクトルと互換性を持たせています。
  5. LIMIT 10 は、検索テキストに最も近い 10 件の一致を選択することを表します。

以下の結果を示します。

8e77af965fc787ae.png

検索結果を見ると、検索テキストにかなり近い一致が見つかります。

7. アプリケーションをウェブに移行する

このアプリをウェブに移行する準備はできていますか?手順は次のとおりです。

  1. Cloud Shell エディタに移動し、エディタの左下(ステータスバー)にある [Cloud Code - ログイン] アイコンをクリックします。課金が有効になっている現在の 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」を持つ入力パラメータとして検索テキストを想定しています。この実装では、データベースから最も近い一致を 1 つだけ返します。

// 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 Functions の関数をデプロイするには、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 Functions コンソールに関数が表示されます。新しく作成した関数を検索して開き、構成を編集して次のように変更します。

  1. [ランタイム、ビルド、接続、セキュリティの設定] に移動します。
  2. タイムアウトを 180 秒に増やす
  3. [接続] タブに移動します。

4e83ec8a339cda08.png

  1. [上り(内向き)設定] で、[すべてのトラフィックを許可する] が選択されていることを確認します。
  2. [下り(外向き)設定] で、[ネットワーク] プルダウンをクリックし、[新しい VPC コネクタを追加] オプションを選択して、ポップアップ ダイアログに表示される手順に沿って操作します。

8126ec78c343f199.png

  1. VPC コネクタの名前を指定し、リージョンがインスタンスと同じであることを確認します。[ネットワーク] の値はデフォルトのままにして、[サブネット] を [カスタム IP 範囲] に設定し、IP 範囲を 10.8.0.0 または使用可能な類似の値に設定します。
  2. [スケーリング設定を表示] を開き、構成が次のように正確に設定されていることを確認します。

7baf980463a86a5c.png

  1. [作成] をクリックすると、このコネクタが下り(外向き)設定に表示されます。
  2. 新しく作成したコネクタを選択します。
  3. すべてのトラフィックをこの VPC コネクタ経由でルーティングするように選択します。

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] タブに移動します。[トリガー イベントの構成] セクションの request json のテキスト ボックスに、次のテキストを入力します。

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

[関数をテスト] ボタンをクリックすると、ページの右側に結果が表示されます。

e21f806d661996ff.png

これで、AlloyDB データでエンベディング モデルを使用して類似ベクトル検索を実行するのは、これほど簡単です。

9. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。

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

10.完了

これで、AlloyDB、pgvector、ベクトル検索を使用した類似検索の実行に成功しました。AlloyDBVertex AIベクトル検索の機能を組み合わせることで、文献検索をアクセスしやすく、効率的で、真に意味のあるものにするための大きな一歩を踏み出しました。