2024.09.05 コラム
Vertex AI Search の検索フィルタ機能を使ってみた

DataCurrent の金子です。Vertex AI Search の検索フィルタ機能を利用してみました。
検索フィルタを実装することで以下のような検索が可能になります。
- 特定のユーザーが作成したドキュメントのみを検索する
- 特定の日付範囲に作成されたドキュメントのみを検索する
- 特定のカテゴリに属するドキュメントのみを検索する
事前準備
Vertex AI Search で検索フィルタ機能を利用するには、構造化データまたはメタデータを含む非構造化データで取り込む必要があります。
インデックス化したいデータが PDF などのメタデータを含む非構造化データの場合は、Cloud Storage を直に指定するのではなく、BigQuery 上にあらかじめメタデータを定義してからデータを取り込むとよいでしょう。
BigQuery を使った取り込み例
インデックス化したい PDF のメタデータが以下のように BigQuery テーブル上にあるとします。
| document_id | title | modified_by_name | modified_at |
|---|---|---|---|
| 1 | 顧客分析_特別価格用_縦柄チラシ_ver2.pptx | 佐藤花子 | 2023-09-08 |
| 2 | 20200730_データ保護・ プライバシー対応 支援サービス ご紹介.pptx | 伊藤あや子 | 2023-07-03 |
| 3 | 20230816_AI活用トライアルパッケージ_v1.pptx | 山田太郎 | 2023-08-15 |
| 4 | 202405_DataCurrentケイパ資料.pptx | 佐藤花子 | 2024-06-18 |
このテーブルを Vertex AI Search に取り込む際は、テーブルを以下の形に変換します。
| id | jsonData | content.mimeType *1 | content.uri *1,2 |
|---|---|---|---|
| 1 | {“title”: “顧客分析_特別価格用_縦柄チラシ_ver2.pptx”, “modified_by_name”: “佐藤花子”, “modified_at”: “2023-09-08”} | application/pdf | gs://my_google_bucket/pdf/document_1.pdf |
| 2 | {“title”: “20200730_データ保護・ プライバシー対応 支援サービス ご紹介.pptx”, “modified_by_name”: “伊藤あや子”, “modified_at”: “2023-07-03”} | application/pdf | gs://my_google_bucket/pdf/document_2.pdf |
| 3 | {“title”: “20230816_AI活用トライアルパッケージ_v1.pptx”, “modified_by_name”: “山田太郎”, “modified_at”: “2023-08-15”} | application/pdf | gs://my_google_bucket/pdf/document_3.pdf |
| 4 | {“title”: “202405_DataCurrentケイパ資料.pptx”, “modified_by_name”: “佐藤花子”, “modified_at”: “2024-06-18”} | application/pdf | gs://my_google_bucket/pdf/document_4.pdf |
*1 content. は Struct (Record) 型を表します。
*2 content.uri は PDF の Cloud Storage URI を指定します。
このテーブルを Vertex AI Search で指定することで、メタデータを含む非構造化データをインデックス化することができます。
※ 詳しくは 公式ドキュメントの BigQuery の章 を参照してください。
検索フィルタを使った検索
Python を使って Vertex AI Search の検索フィルタを使った検索を行う方法を以下に示します。
from typing import List
from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine
# TODO(developer): サンプルコードを実行する前に、以下の変数を適切な値に置き換えてください。
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global", "us", "eu"
# engine_id = "YOUR_DATA_STORE_UD"
# search_query = "YOUR_SEARCH_QUERY"
# search_filter = "modified_by_name: ANY(\"山田太郎\")"
def search_sample(
project_id: str,
location: str,
engine_id: str,
search_query: str,
search_filter: str,
) -> List[discoveryengine.SearchResponse]:
client_options = (
ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
if location != "global"
else None
)
client = discoveryengine.SearchServiceClient(client_options=client_options)
serving_config = client.serving_config_path(
project=project_id,
location=location,
data_store=engine_id,
serving_config="default_search",
)
request = discoveryengine.SearchRequest(
serving_config=serving_config,
query=search_query,
filter=search_filter,
)
response = client.search(request)
return response
いくつかサンプルコードの出力例を見てみましょう。
山田太郎 が作成したドキュメントのみを検索する場合
response = search_sample(
project_id="YOUR_PROJECT_ID",
location="YOUR_LOCATION",
engine_id="YOUR_DATA_STORE_UD",
search_query="DataCurrent",
search_filter="modified_by_name: ANY(\"山田太郎\")", # 山田太郎に絞って検索します。
)
modified_by_name = set()
for result in response.results:
struct_data = result.document.struct_data
modified_by_name.add(struct_data["modified_by_name"])
print(modified_by_name)
# {'山田太郎'} ← modified_by_name が山田太郎のもののみが検索されたことを示す
2024 年以降に更新されたドキュメントのみを検索する場合
response = search_sample(
project_id="YOUR_PROJECT_ID",
location="YOUR_LOCATION",
engine_id="YOUR_DATA_STORE_UD",
search_query="DataCurrent",
search_filter="modified_at > \"2024-01-01\"", # 2024 年以降に更新されたドキュメントのみを返すようにします。
)
title = set()
for result in response.results:
struct_data = result.document.struct_data
title.add(struct_data["title"])
print(title)
# {'202405_DataCurrentケイパ資料.pptx'} ← 2024-06-18 に更新されたドキュメントのみが検索されたことを示す
まとめ
Vertex AI Search の検索フィルタ機能を使って、検索結果を絞り込むことができました。ドキュメントのメタデータをうまく使うことで、ユーザーが求める情報をより効率的に見つけることができそうですね。
自社に専門人材がいない、リソースが足りない等の課題をお持ちの方に、エンジニア領域の支援サービス(Data Engineer Hub)をご提供しています。
お困りごとございましたら是非お気軽にご相談ください。
【本件またはリリースに関するお問い合わせ先】
DataCurrent 広報
E-mail:info@datacurrent.co.jp