【Vertex AI】BigQueryの非構造化データ&メタデータをVertex AI Searchで検索する
データ事業本部の川中子(かわなご)です。
以前、ObjectRef
型を持つBigQueryテーブルをデータストアとして設定した
Vertex AI Search
の検索アプリケーションの検証を行いました。
しかし結果として、データの中身まで見に行くような検索はできていませんでした。
今回はその課題に再チャレンジして、改めて非構造化のデータ検索をやってみました。
前回のブログはこちらをご覧ください。
検証準備
テーブルスキーマの作成
まず、データストアとなる非構造データの情報を持つテーブルを作成します。
スキーマは公式ドキュメントに記載されている通りにしました。
CREATE TABLE `cm_kawanago_useast1.tbl_custom_search` (
id STRING NOT NULL,
jsonData STRING,
content STRUCT
<
mimeType STRING,
uri STRING
>
);
サンプルデータの投入
次に検証用のデータを投入します。
ここで投入しているデータは前回の検証時とほぼ同じ内容で、
工場の生産情報と健康エッセイのPDFファイルを紐づけているようなデータです。
INSERT INTO `cm_kawanago_useast1.tbl_custom_search` (id, jsonData, content)
VALUES
(
'FAC001_20241201_001',
'{"factory_code":"TOK001","prefecture":"東京都","data_type":"CSV","generated_datetime":"2024-12-01 08:15:30","production_line":"LINE_A","equipment_id":"HEALTH_001","process_stage":"ASSEMBLY"}',
STRUCT(
'application/pdf' AS mimeType,
'gs://cm-kawanago-unstructured-data-useast1/balanced_diet_healthy_future.pdf' AS uri
)
),
(
'FAC002_20241201_002',
'{"factory_code":"OSA001","prefecture":"大阪府","data_type":"JSON","generated_datetime":"2024-12-01 09:22:15","production_line":"LINE_B","equipment_id":"FOOD_02","process_stage":"INSPECTION"}',
STRUCT(
'application/pdf' AS mimeType,
'gs://cm-kawanago-unstructured-data-useast1/exercise_habits_mind_body_transformation.pdf' AS uri
)
),
(
'FAC003_20241201_003',
'{"factory_code":"NGY001","prefecture":"愛知県","data_type":"LOG","generated_datetime":"2024-12-01 10:45:00","production_line":"LINE_C","equipment_id":"CHICKEN_03","process_stage":"PREP"}',
STRUCT(
'application/pdf' AS mimeType,
'gs://cm-kawanago-unstructured-data-useast1/quality_sleep_changes_life.pdf' AS uri
)
);
これでデータストアになるテーブルの準備が完了しました。
bq query --use_legacy_sql=false "SELECT * FROM cm_kawanago_useast1.tbl_custom_search order by id"
id | jsonData | content |
---|---|---|
FAC001_20241201_001 | {"factory_code":"TOK001","prefecture":"東京都","data_type":"CSV","generated_datetime":"2024-12-01 08:15:30","production_line":"LINE_A","equipment_id":"HEALTH_001","process_stage":"ASSEMBLY"} | {"mimeType":"application/pdf","uri":"gs://cm-kawanago-unstructured-data-useast1/balanced_diet_healthy_future.pdf"} |
FAC002_20241201_002 | {"factory_code":"OSA001","prefecture":"大阪府","data_type":"JSON","generated_datetime":"2024-12-01 09:22:15","production_line":"LINE_B","equipment_id":"FOOD_02","process_stage":"INSPECTION"} | {"mimeType":"application/pdf","uri":"gs://cm-kawanago-unstructured-data-useast1/exercise_habits_mind_body_transformation.pdf"} |
FAC003_20241201_003 | {"factory_code":"NGY001","prefecture":"愛知県","data_type":"LOG","generated_datetime":"2024-12-01 10:45:00","production_line":"LINE_C","equipment_id":"CHICKEN_03","process_stage":"PREP"} | {"mimeType":"application/pdf","uri":"gs://cm-kawanago-unstructured-data-useast1/quality_sleep_changes_life.pdf"} |
データストアの作成
AI Applications
のコンソールからデータストアを作成していきます。
実際の手順は、冒頭で紹介した以前のブログを参照いただければと思います。
データソースにBigQuery
を選択するところまでは同じですが、
今回はインポート方法にUnstructured - BigQuery table with metadata
を選択します。
あとは、事前に作成したテーブルを指定してデータストアを作成すればOKです。
前回と異なるのは インポート方法とテーブルの形式のみ です。
検証
複数キーワードでの検索
まず前回検証時と同じ、複数のキーワードで検索してみました。
しかし一切検索に引っかからず、少し不安になりましたが、
どうやらこの組み合わせだと検索に引っかからなかっただけのようでした。
単一キーワードでの検索
すこし検索をシンプルにするために、単一のキーワードで検索してみると、
PDFファイルの中身も含めて検索されていることが確認できました。
メタデータでの検索
jsonData
に格納しているメタデータでも検索が効いているか確認してみます。
メタデータでもしっかり検索が有効になっているようです。
返答は空になっていましたが、このあたりは構成設定によっても異なるかも知れません。
複数キーワードでの検索(再検証)
組み合わせによっては、複数ワードの検索も有効であることが確認できました。
メタデータでもファイルの中身でも検索できるので、直感的に活用できそうです。
オブジェクトテーブルを活用したメタデータ登録
上記の検証ではjsonData
や content
などのオブジェクトメタデータを、
直接BigQueryのテーブルに対してINSERTしていました。
しかし実際の運用では、Cloud Storageのオブジェクトメタデータと、
オブジェクトに紐づくオブジェクトテーブルを活用することでより現実的な実装が可能です。
コンソールからのメタデータ登録
Cloud Storageのコンソール画面から対象のオブジェクトを選択し、
メニューからメタデータを編集
を選択します。
カスタムメタデータに任意のキーと値を登録することで、
即時オブジェクトテーブルにもメタデータが反映されます。
オブジェクトテーブルにメタデータが反映されていることが確認できました。
bq query --use_legacy_sql=false "SELECT * FROM cm_kawanago_useast1.tbl_custom_search_obj"
uri | generation | content_type | size | md5_hash | updated | metadata | ref |
---|---|---|---|---|---|---|---|
gs://cm-kawanago-unstructured-data-useast1/balanced_diet_healthy_future.pdf | 1756169799115693 | application/pdf | 104626 | d1c6e12ff3c2f5422d10d3276369442b | 2025-10-08 00:56:25 | [{"name":"equipment_id","value":"HEALTH_001"},{"name":"factory_code","value":"TOK001"},{"name":"generated_datetime","value":"2024-12-01 08:15:30"},{"name":"prefecture","value":"東京都"},{"name":"process_stage","value":"ASSEMBLY"},{"name":"production_line","value":"LINE_A"},{"name":"data_type","value":"CSV"}] | {"uri":"gs://cm-kawanago-unstructured-data-useast1/balanced_diet_healthy_future.pdf","version":"1756169799115693","authorizer":"cm-da-bs-yamahamotor.us-east1.object-tables-connection-useast1","details":"{\"gcs_metadata\":{\"content_type\":\"application/pdf\",\"md5_hash\":\"d1c6e12ff3c2f5422d10d3276369442b\",\"size\":104626,\"updated\":1759884985351000}}"} |
gs://cm-kawanago-unstructured-data-useast1/exercise_habits_mind_body_transformation.pdf | 1756169799114594 | application/pdf | 104030 | f0b1761dd12ba5c948966e25a8020d68 | 2025-10-08 00:59:06 | [{"name":"factory_code","value":"OSA001"},{"name":"equipment_id","value":"FOOD_02"},{"name":"generated_datetime","value":"2024-12-01 09:22:15"},{"name":"process_stage","value":"INSPECTION"},{"name":"data_type","value":"JSON"},{"name":"prefecture","value":"大阪府"},{"name":"production_line","value":"LINE_B"}] | {"uri":"gs://cm-kawanago-unstructured-data-useast1/exercise_habits_mind_body_transformation.pdf","version":"1756169799114594","authorizer":"cm-da-bs-yamahamotor.us-east1.object-tables-connection-useast1","details":"{\"gcs_metadata\":{\"content_type\":\"application/pdf\",\"md5_hash\":\"f0b1761dd12ba5c948966e25a8020d68\",\"size\":104030,\"updated\":1759885146561000}}"} |
gs://cm-kawanago-unstructured-data-useast1/quality_sleep_changes_life.pdf | 1759884398993368 | application/pdf | 106389 | 8ef7f84d67246d8e72f6c1add8e09550 | 2025-10-08 01:00:15 | [{"name":"production_line","value":"LINE_C"},{"name":"generated_datetime","value":"2024-12-01 10:45:00"},{"name":"process_stage","value":"PREP"},{"name":"data_type","value":"LOG"},{"name":"prefecture","value":"愛知県"},{"name":"equipment_id","value":"CHICKEN_03"},{"name":"factory_code","value":"NGY001"}] | {"uri":"gs://cm-kawanago-unstructured-data-useast1/quality_sleep_changes_life.pdf","version":"1759884398993368","authorizer":"cm-da-bs-yamahamotor.us-east1.object-tables-connection-useast1","details":"{\"gcs_metadata\":{\"content_type\":\"application/pdf\",\"md5_hash\":\"8ef7f84d67246d8e72f6c1add8e09550\",\"size\":106389,\"updated\":1759885215447000}}"} |
CLIコマンドからのメタデータ登録
CLIを利用する場合は、以下の形式でアップロード時にメタデータを登録できます。
gcloud storage cp {コピー元ファイル} {コピー先GSパス} --custom-metadata={key1}={val1},{key2}={val2}
上記のようなメタデータの登録時に再帰的な方法で登録をしてしまうと、
処理された オブジェクト全てに同じメタデータが付与される ので注意してください。
詳細は公式ドキュメントをご参照ください。
構成案
実際の運用を考えると、以下のような構成が現実案になりそうです。
- ファイルのアップロード時にメタデータを登録
- 登録されたメタデータがオブジェクトテーブルに反映される
uri
、content_type
、metadata
列のデータをデータストア用のテーブルに連携する- データストア用のテーブルを
Vertex AI Search
の検索アプリケーションから参照する
オブジェクトテーブルからデータストア用テーブルへのデータ連携だけ実装が必要ですが、
メタデータの登録さえ徹底されていれば、十分実用的な検索システムになりそうです。
さいごに
今回はVertex AI Search
にて非構造化データと任意のメタデータで検索を行う場合に、
データストアとしてBigQueryテーブルを利用する方法を検証しました。
オブジェクトテーブルと連携すれば、必要な情報が簡単に揃いますし、
メタデータは コンソールからの編集や、CLIコマンドにて簡単に登録 ができます。
BigQueryを中心に非構造データの検索機能を実現 することができるので、
学習コストも低く、直感的で非常に使いやすいサービスだと思いました。
少しでも参考になれば幸いです。
最後まで記事を閲覧頂きありがとうございました。