PythonでGoogle検索（Vertex AI Search）

PythonでGoogle検索するアプリを作成する手順です。

こちら↓のGoogle公式サイトの手順に従って作成します。
https://cloud.google.com/generative-ai-app-builder/docs/migrate-from-cse?hl=ja

これまでGoogle検索は、カスタム検索サイト制限付き JSON APIを使っていましたが、今後は Vertex AI Agent Builder へ移行する必要があります。

>注: カスタム検索サイト制限付き JSON API エンドポイントは、2025 年 1 月 8 日にトラフィックの配信を停止します。
カスタム検索サイト制限付き JSON API をご利用のすべてのお客様は、Google Cloud の Vertex AI Search への移行を開始していただく必要があります。

Vertex AI Agent Builderの利用には料金がかかります。詳細は、こちら↓のGoogle公式サイトで確認できます。
https://cloud.google.com/generative-ai-app-builder/pricing?hl=ja

1年間は \\$1000 分無料で利用できますが、それ以降は「1000リクエストあたり $4.00 の料金が発生」するようです。

# 環境

Python 3.9.21
pip 25.0.1
google-cloud-discoveryengine 0.13.6
google-auth 2.37.0

# 検索アプリの作成
### プロジェクトの作成
Google Cloud コンソール Agent Builder ページを開く
https://console.cloud.google.com/gen-app-builder/engines?hl=ja

「プロジェクトの作成」をクリックする
![プロジェクトの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/2cf19ead-df8f-47db-bdc6-772e704f1220.png)

プロジェクト名に「vertex-sample」を入力し「作成」をクリックする
![新しいプロジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/bcb14b2c-bd94-41ea-8c26-d39a8381cb4e.png)

課金が有効になっていない場合、「請求先アカウントの作成」をクリックしてカード情報を登録する
![課金.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/0f7157b6-420e-4f7a-8b70-ef79a58e16a5.png)

「Vertex AI Agent Builer ...」をチェックして「CONTINUE AND ACTIVE THE API」をクリックすると、アプリの作成へ移動します
![ようこそ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/f06e5322-9cbd-4893-942d-9b3b1beb23a3.png)


### アプリの作成
ウェブサイト検索の「作成」をクリックする
![アプリを作成する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/b82d0291-2b59-477b-a4c2-8d831c71d1fc.png)

Enterprise エディションの機能のチェックを「オン」、高度な LLM 機能のチェックを「オフ」、アプリ名「vertex-sample」を入力、会社名「sample」を入力して「続行」をクリックする
![ウェブサイト検索アプリの構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/42e308c8-6ee6-4f7b-9841-0d1ec0e6e46b.png)

「データストアを作成」をクリックする
![データストア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/f4bf7845-d397-48c3-90c6-34f8923f2b15.png)

ウェブサイトのコンテンツの「SELECT」をクリックする
![データソースを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/32a6f4e3-ca28-40ef-847a-12db39b4357d.png)

ウェブサイトの高度なインデックス登録のチェックを「オフ」、追加するサイトに「www.amazon.co.jp/*」を入力して「続行」をクリックする ※検索したいサイトに合わせて適時変更してください
![データストアのウェブサイトの指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/5b3a95de-5771-40da-8d5b-4e6caec7b7d2.png)

データストア名に「amazon」を入力して「作成」をクリックする
![データストアの構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/7e5ecf61-7d12-4d04-af4d-7b15ee290302.png)

「作成」をクリックするとアプリが作成されます
![アプリを作成する（完成）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/235b24ce-f8a2-4623-99d5-88ce71158600.png)

# サービスアカウントの作成

### サービスアカウントの作成

IAMと管理から「サービスアカウント」を選択する
![IAMと管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/ef26ad63-c244-42fc-8fcc-18e612c9d38e.png)

「サービスアカウントを作成」をクリックする
![サービスアカウント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/2093f387-bc9b-4629-be0a-e8ad03478155.png)

サービスアカウント名に「vertex-sample」を入力して「作成して続行」をクリックする
![サービスアカウントの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/6a94c66b-a513-4977-bd6e-d24df7f115b2.png)

ロールに「ディスカバリ エンジン サービス エージェント」を選択して「続行」をクリックする
![アクセスを許可する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/0ac31825-43b9-4bac-a775-fdf10d749c46.png)

「完了」をクリックする
![サービスアカウントの作成（完了）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/28137445-55ca-4b11-bfac-79764c0c1a41.png)

### キーの作成

作成したサービスアカウントの操作から「鍵の管理」を選択する
![鍵の管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/8fdb162d-84dc-4c8c-85ba-774289424b32.png)

「キーを追加」をクリックして、「新しい鍵を作成」をクリックする
![新しい鍵を作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/633cd5e1-f965-41c2-af48-e17d61d36a72.png)

「JSON」を選択して「作成」をクリックする
![秘密鍵の作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/92ff42e6-786d-49d8-9f1e-39ea428ce1ed.png)

JSONファイル「vertex-sample-452107-ba0856f4f13a.json」がダウンロードされる
![秘密鍵の保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/9123133c-ef76-42c5-9b69-9266f80bfca9.png)


# パッケージインストール

「google-cloud-discoveryengine」パッケージをインストールする
```
$ pip install google-cloud-discoveryengine
```

# プログラム作成

Google Cloud コンソール Agent Builder ページを開く
https://console.cloud.google.com/gen-app-builder/engines?hl=ja

### プロジェクトIDの確認

トップページ左上のプロジェクト「vertex-sample」をクリックする
![トップページ左上.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/98fa88e3-d5c7-44a3-94c5-316debc4a6af.png)

プロジェクトを選択に表示されている「vertex-sample」のIDがプロジェクトIDになります
![プロジェクトを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/bb9ba271-5202-474f-8284-cdeb2f763133.png)

### エンジンID（アプリID）の確認

アプリのリストにある「vertex-sample」のIDがエンジンID（アプリID）になります
![アプリID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112075/1cb6922c-31fd-4790-9e33-b05a97c0e55e.png)

### ソースコード

Google検索でAmazonから恐竜図鑑を検索するプログラム（vertex_sample.py）を作成する
```vertex_sample.py
from google.cloud import discoveryengine_v1 as discoveryengine
from google.oauth2 import service_account

# サービスアカウントキーのパス ※適時変更してください
SERVICE_ACCOUNT_FILE = 'vertex-sample-452107-ba0856f4f13a.json'

# プロジェクトIDとエンジンID ※適時変更してください
PROJECT_ID = 'vertex-sample-452107'
ENGINE_ID = 'vertex-sample_1740556175969'

# 認証情報の設定
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE)

# Discovery Engineクライアントの作成
client = discoveryengine.SearchServiceClient(credentials=credentials)

# 検索リクエストの作成
request = discoveryengine.SearchRequest(
    serving_config=f'projects/{PROJECT_ID}/locations/global/collections/default_collection/engines/{ENGINE_ID}/servingConfigs/default_config',
    query='恐竜図鑑',
    page_size=5
)

# 検索の実行
response = client.search(request=request)

# 検索結果の表示
for result in response.results:
    print('-----')
    for key, value in result.document.derived_struct_data.items():
        if key == 'link':
            print(f'Link: {value}')
        if key == 'title':
            print(f'Title: {value}')

```

# プログラム実行

ダウンロードしたJSONファイル「vertex-sample-452107-ba0856f4f13a.json」をソースコードと同じフォルダに入れて実行する
```
$ python vertex_sample.py
```

実行結果が表示されたら完成です
```
-----
Link: https://www.amazon.co.jp/%E6%81%90%E7%AB%9C-%E5%9B%B3%E9%91%91/s?k=%E6%81%90%E7%AB%9C+%E5%9B%B3%E9%91%91
Title: 恐竜 図鑑 - Amazon.co.jp
-----
Link: https://www.amazon.co.jp/%E3%82%BB%E3%82%AC%E3%83%88%E3%82%A4%E3%82%BA-SEGA-TOYS-%E3%83%9E%E3%82%A6%E3%82%B9%E3%81%A7%E3%83%90%E3%83%88%E3%83%AB-%E6%81%90%E7%AB%9C%E5%9B%B3%E9%91%91%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/dp/B08DYTJY1R
Title: Amazon.co.jp: マウスでバトル!! 恐竜図鑑パソコン : おもちゃ
-----
Link: https://www.amazon.co.jp/%E3%83%8A%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E3%82%B8%E3%82%AA%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF-%E4%B8%96%E7%95%8C%E4%B8%80%E7%BE%8E%E3%81%97%E3%81%84%E6%81%90%E7%AB%9C%E5%9B%B3%E9%91%91-%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF/dp/4863135556
Title: ナショナル ジオグラフィック 世界一美しい恐竜図鑑 | ライリー ...
-----
Link: https://www.amazon.co.jp/%E3%82%86%E3%82%8B%E3%82%86%E3%82%8B%E6%81%90%E7%AB%9C%E5%9B%B3%E9%91%91-%E5%8A%A0%E8%97%A4%E5%A4%AA%E4%B8%80/dp/4052049225
Title: Amazon.co.jp: ゆるゆる恐竜図鑑 : 加藤太一, かげ: 本
-----
Link: https://www.amazon.co.jp/%E3%82%84%E3%82%8A%E3%81%99%E3%81%8E%E6%81%90%E7%AB%9C%E5%9B%B3%E9%91%91-%E3%81%AA%E3%82%93%E3%81%A7%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E9%80%B2%E5%8C%96%E3%81%97%E3%81%9F-%E5%B0%8F%E6%9E%97-%E5%BF%AB%E6%AC%A1/dp/480028483X
Title: Amazon.co.jp: やりすぎ恐竜図鑑 なんでここまで進化した!? : 小林 快 ...
```