1. 概要
特許調査は、さまざまな業界で競争環境を把握し、ライセンス供与や買収の可能性を特定し、既存の特許を侵害しないようにするための重要なツールです。
特許調査は広範囲にわたる複雑な作業です。関連するイノベーションを見つけるために、無数の技術概要を精査するのは大変な作業です。従来のキーワードベースの検索は、多くの場合、不正確で時間がかかります。要約が長くて技術的であるため、要点をすぐに把握することが難しい。これにより、研究者が重要な特許を見逃したり、無関係な結果に時間を費やしたりする可能性があります。
この革命の裏にある秘訣は、ベクトル検索にあります。ベクトル検索は、単純なキーワード マッチングに依存するのではなく、テキストを数値表現(エンベディング)に変換します。これにより、使用された特定の単語だけでなく、クエリの意味に基づいて検索できます。文献検索の世界では、これは画期的な機能です。たとえば、ドキュメントに「ウェアラブル心拍数モニター」というフレーズがなくても、その特許を見つけることができます。
目標
この Codelab では、AlloyDB、pgvector 拡張機能、インプレース Gemini 1.5 Pro、エンベディング、ベクトル検索を活用して、特許検索のプロセスをより迅速かつ直感的で、非常に正確なものにする方法について説明します。
作成するアプリの概要
このラボでは、次の作業を行います。
- AlloyDB インスタンスを作成して Patents Public Dataset のデータを読み込む
- 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;
権限を付与
次のステートメントを実行して、「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"
テーブルを変更して、エンベディングを格納する Vector 列を追加する
次の DDL を実行して、作成したテーブルに abstract_embeddings フィールドを追加します。この列では、テキストのベクトル値を保存できます。
ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);
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( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');
これにより、クエリ内のサンプル テキストのエンベディング ベクトル(浮動小数点数の配列のようなもの)が返されます。次のように表示されます。
abstract_embeddings ベクトル フィールドを更新する
次の DML を実行して、テーブル内の特許の要約を対応するエンベディングで更新します。
UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);
6. ベクトル検索を実行する
テーブル、データ、エンベディングの準備が整ったので、ユーザーの検索テキストに対してリアルタイムのベクトル検索を実行しましょう。これをテストするには、次のクエリを実行します。
SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
このクエリでは、
- ユーザーの検索テキストは「A new Natural Language Processing related Machine Learning Model」です。
- モデル gemini-embedding-001 を使用して、embedding() メソッドでエンベディングに変換しています。
- "<=>" は、COSINE SIMILARITY 距離メソッドの使用を表します。
- エンベディング メソッドの結果をベクトル型に変換して、データベースに保存されているベクトルと互換性を持たせています。
- LIMIT 10 は、検索テキストの最も近い一致を 10 個選択することを表します。
以下の結果を示します。
結果を見ると、検索テキストとかなり近い一致が見つかっています。
7. アプリケーションをウェブに移行する
このアプリをウェブに移行する準備はできていますか?手順は次のとおりです。
- Cloud Shell エディタに移動し、エディタの左下隅(ステータスバー)にある [Cloud Code - Sign in] アイコンをクリックします。課金が有効になっている現在の Google Cloud プロジェクトを選択し、Gemini からも同じプロジェクトにログインしていることを確認します(ステータスバーの右下)。
- Cloud Code アイコンをクリックし、Cloud Code ダイアログが表示されるまで待ちます。[新しいアプリケーション] を選択し、[新しいアプリケーションの作成] ポップアップで [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」を持つ入力パラメータとして検索テキストを想定しています。この実装では、データベースから最も近い一致を 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('tgemini-embedding-001', '" + 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 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 コンソールで関数を確認できるようになります。新しく作成した関数を検索して開き、構成を編集して次の変更を行います。
- [ランタイム、ビルド、接続、セキュリティの設定] に移動する
- タイムアウトを 180 秒に増やします
- [接続] タブに移動します。
- [上り(内向き)設定] で、[すべてのトラフィックを許可する] が選択されていることを確認します。
- [下り(外向き)設定] で、[ネットワーク] プルダウンをクリックし、[新しい VPC コネクタを追加] オプションを選択して、ポップアップ表示されるダイアログ ボックスに表示される手順に沿って操作します。
- VPC コネクタの名前を指定し、リージョンがインスタンスと同じであることを確認します。[ネットワーク] の値はデフォルトのままにして、[サブネット] を [カスタム IP 範囲] に設定し、使用可能な IP 範囲(10.8.0.0 など)を指定します。
- [SHOW SCALING SETTINGS] を展開し、構成が次のとおりに設定されていることを確認します。
- [作成] をクリックすると、このコネクタが下り(外向き)設定に表示されます。
- 新しく作成したコネクタを選択します。
- すべてのトラフィックがこの 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"}'
結果:
Cloud Functions リストからテストすることもできます。デプロイされた関数を選択し、[テスト] タブに移動します。[トリガー イベントの構成] セクションの [リクエスト JSON] テキスト ボックスに、次のテキストを入力します。
{"search": "A new Natural Language Processing related Machine Learning Model"}
[関数をテスト] ボタンをクリックすると、ページの右側に結果が表示されます。
これで、AlloyDB データでエンベディング モデルを使用して類似ベクトル検索を実行するのは、これほど簡単です。
9. クリーンアップ
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
10. 完了
これで、AlloyDB、pgvector、ベクトル検索を使用して類似性検索を正常に実行しました。AlloyDB、Vertex AI、ベクトル検索の機能を組み合わせることで、文献検索をアクセスしやすく、効率的で、真に意味主導型にするという点で大きな進歩を遂げました。