1. 概要
特許調査は、業界を問わず、競争環境を把握し、ライセンス供与や買収の機会を特定し、既存の特許を侵害しないようにするための重要なツールです。
特許調査は広範囲に及び、複雑です。関連するイノベーションを見つけるために無数の技術概要を精査するのは、困難な作業です。従来のキーワードベースの検索は、多くの場合、不正確で時間がかかります。概要は長くて技術的な内容であるため、コアとなるアイデアをすばやく把握することが困難です。これにより、研究者は重要な特許を見逃したり、無関係な結果に時間を費やしたりする可能性があります。
この変革の秘訣は、ベクトル検索にあります。ベクトル検索では、単純なキーワード マッチングに依存するのではなく、テキストを数値表現(エンベディング)に変換します。これにより、使用されている特定の単語だけでなく、クエリの意味に基づいて検索できます。文献検索の世界では、これは画期的な機能です。たとえば、ドキュメントで正確なフレーズが使用されていない場合でも、「ウェアラブル心拍数モニター」の特許を見つけることができます。
目標
この Codelab では、AlloyDB、pgvector 拡張機能、インプレース Gemini 1.5 Pro、エンベディング、ベクトル検索を活用して、特許検索のプロセスをより速く、より直感的で、非常に正確に行えるようにします。
作成するアプリの概要
このラボでは、次のことを行います。
- AlloyDB インスタンスを作成し、特許一般公開データセットのデータを読み込む
- 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 をアクティブにする] ボタンの画像](https://codelabs.developers.google.com/static/patent-search-alloydb-gemini/img/7875ca05ca6f7cab.png?hl=ja)
- 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」に設定します。[CREATE CLUSTER] をクリックします。クラスタを作成する手順については、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(3072);
4. 特許データをデータベースに読み込む
BigQuery の Google 特許検索 一般公開データセットをデータセットとして使用します。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;
このクエリでは、
- ユーザー検索テキストは「新しい自然言語処理関連の機械学習モデル」です。
- モデル gemini-embedding-001 を使用して、embedding() メソッドでエンベディングに変換します。
- 「<=>」は、COSINE SIMILARITY 距離法を使用することを表します。
- エンベディング メソッドの結果をベクトル型に変換して、データベースに保存されているベクトルと互換性を持たせます。
- LIMIT 10 は、検索テキストに最も近い 10 件の一致を選択することを表します。
以下の結果を示します。

結果からわかるように、一致は検索テキストにかなり近いものです。
7. アプリケーションをウェブに移行する
このアプリをウェブに移行する準備はできましたか?手順は次のとおりです。
- Cloud Shell エディタに移動し、エディタの左下隅(ステータスバー)にある [Cloud Code - Sign in] アイコンをクリックします。課金が有効になっている現在の Google Cloud プロジェクトを選択し、Gemini からも同じプロジェクトにログインしていることを確認します(ステータスバーの右隅)。
- Cloud Code アイコンをクリックし、Cloud Code ダイアログが表示されるまで待ちます。[New Application] を選択し、[Create New Application] ポップアップで [Cloud Functions application] を選択します。

[Create New Application] ポップアップの 2/2 ページで、[Java: Hello World] を選択し、任意の場所にプロジェクト名「alloydb-pgvector」を入力して [OK] をクリックします。

- 表示されたプロジェクト構造で pom.xml を検索し、リポジトリ ファイルの内容に置き換えます。これには、次の依存関係に加えて、いくつかの依存関係が必要です。

- HelloWorld.java ファイルを リポジトリ ファイルの内容に置き換えます。
次の値は実際の値に置き換える必要があります。
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 Function をデプロイするには、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 秒に増やす
- [CONNECTIONS] タブに移動します。

- [Ingress settings] で、[Allow all traffic] が選択されていることを確認します。
- [Egress settings] で、[Network] プルダウンをクリックし、[Add New VPC Connector] オプションを選択して、表示されるダイアログ ボックスの手順に沿って操作します。

- VPC コネクタの名前を指定し、リージョンがインスタンスと同じであることを確認します。[Network] の値はデフォルトのままにし、[Subnet] を [Custom IP Range] に設定して、10.8.0.0 などの使用可能な IP 範囲を指定します。
- [SHOW SCALING SETTINGS] を展開し、構成が次のようになっていることを確認します。

- [CREATE] をクリックすると、このコネクタが下り(外向き)設定に表示されます。
- 新しく作成したコネクタを選択します。
- すべてのトラフィックをこの 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 のリストからテストすることもできます。デプロイされた関数を選択し、[TESTING] タブに移動します。[Configure triggering event] セクションの [request json] テキスト ボックスに、次のように入力します。
{"search": "A new Natural Language Processing related Machine Learning Model"}
[TEST THE FUNCTION] ボタンをクリックすると、ページの右側に結果が表示されます。

これで完了です。AlloyDB データでエンベディング モデルを使用して類似ベクトル検索を行うのは簡単です。
9. クリーンアップ
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順に従います。
10. 完了
おめでとうございます!AlloyDB、pgvector、ベクトル検索を使用して類似性検索を正常に実行できました。AlloyDB、Vertex AI、ベクトル検索の機能を組み合わせることで、文献検索をアクセスしやすく、効率的で、真に意味主導型にすることができました。