📊

BigQuery の Object テーブルと Gemini-pro-vision リモートモデルを使って pdf を要約してみる

2024/03/31に公開

概要

pdf などの非構造化データを GCS に配置した際に BQ で分析するってどうすんねんというところをやってみる

流れとしては以下を実施する

  1. pdf などを gcs に配置する
  2. BigQuery Connection の作成する
  3. 必要な権限付与を行う
  4. BQ で Object テーブルを作成する
  5. BQ でリモートモデルを作成する
  6. Object テーブルを使って pdf の要約をする

必要なこと

手順

pdf などを GCS に配置する

ここは何も考えないで GCS に pdf を配置する

例えば、今回は前職の決算説明資料をおいてみる。他意はないのであしからず。

https://www.furyu.jp/ir/document.html

BigQuery Connection の作成する

以下の感じで実行でok

$ bq mk --connection --location=asia-northeast1 --project_id=project_id --connection_type=CLOUD_RESOURCE sample_object_table_connection

Setting project_id project_id as the default.

BigQuery configuration complete! Type "bq" to get started.

Connection project_id.asia-northeast1.sample_object_table_connection successfully created
  • connection_type の値は固定
  • Google Cloud の console では作成できず bq command でしか作成できないっぽい(2024/03/30現在)

必要な権限付与を行う

さっき作成した connection の Service Account を特定する

$ bq show --connection project_id.asia-northeast1.sample_object_table_connection

                             name                               friendlyName   description    Last modified         type        hasCredential                                            properties                                            
 ------------------------------------------------------------- -------------- ------------- ----------------- ---------------- --------------- ----------------------------------------------------------------------------------------------- 
  project_id.asia-northeast1.sample_object_table_connection                                30 Mar 22:36:33   CLOUD_RESOURCE   False           {"serviceAccountId": "bqcxproject_id-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}  

ということで serviceAccountId がわかったので、こいつに権限を与える

まず vertex ai を使えるようにする

gcloud projects add-iam-policy-binding project_id \
    --member="serviceAccount:bqcxproject_id-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com" \
    --role="roles/aiplatform.user"

次に gcs を参照できるようにする

gcloud projects add-iam-policy-binding project_id \
    --member="serviceAccount:bqcxproject_id-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

BQ で Object テーブルを作成する

とりあえず vertexai という dataset を作成しているものとする

CREATE OR REPLACE EXTERNAL TABLE project_id.vertexai.sample_object_table
WITH CONNECTION `asia-northeast1.sample_object_table_connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://hogehoge/vertexai/*'],
  max_staleness = INTERVAL 7 DAY,
  metadata_cache_mode = 'MANUAL');
  • object_metadata は SIMPLE で固定

  • metadata_cache は自動更新したいかどうかで決める

  • connection の region と datastore の region と gcs の region は合わせておく必要がある

    • 以下のエラーが出たら gcs のリージョンがずれてそう
    Cannot read and write in different locations: source: US, destination: asia-northeast1
    

以下のようなテーブルが出来上がる

リモートモデルの作成

CREATE MODEL project_id.vertexai.gemini_provision_model
 REMOTE WITH CONNECTION `asia-northeast1.sample_object_table_connection`
 OPTIONS(ENDPOINT = 'gemini-pro-vision');
  • connection の名前は object テーブルを作ったときのと同じものを使う
  • endpoint を gemini-pro-vision にする

以下のような感じでモデルが見えるようになる

Object テーブルとリモートモデルを使って pdf の要約をする

さっき作った gemini_provision_model を使って要約をする

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL project_id.vertexai.gemini_provision_model,
  Table project_id.vertexai.sample_object_table,
  STRUCT(
    '内容を要約してください. \n 出力は日本語で、そして、 list にして出力してください' as prompt,
    0.9 AS temperature,
    1024 AS max_output_tokens,
    0.9 AS top_p,
    15 AS top_k
  )
);

普通にやったらerrorが出た

Unsupported endpoint: Read Object's size exceeds max allowed value..

  • gemini は16の画像しか受け付けないようである
    • pdf の 1ページを画像として認識しているようである

仕方ないので pdf を16ページになるように調整したところ問題なく出力できた

ml_generate_text_result ml_generate_text_status uri generation content_type size md5_hash updated metadata
{"candidates":[{"content":{"parts":[{"text":" フリュー株式会社の2024年3月期第1四半期の決算概要は以下の通りです。\n\n- 売上高は前年同期比122.5%の99億7,400万円\n- 営業利益は前年同期比193.4%の13億1,500万円\n- 経常利益は前年同期比197.6%の12億6,200万円\n- 親会社株主に帰属する当期純利益は前年同期比201.8%の8億4,000万円\n\nセグメント別に見ると、\n\n- 世界観ビジネスの売上高は前年同期比150.4%の55億7,200万円\n- 営業利益は前年同期比316.7%の7億2,600万円\n- ガールズトレンドビジネスの売上高は前年同期比107.5%の36億1,700万円\n- 営業利益は前年同期比114.5%の10億7,200万円\n- フリューニュービジネスの売上高は前年同期比73.3%の7億8,500万円\n- 営業利益は前年同期比▲100.0%の▲2億3,900万円\n\n通期業績予想に対する進捗率は、売上高、営業利益、経常利益、親会社株主に帰属する当期純利益ともに順調に進捗しています。\n\nKPI(プレイ数、値上げ機種プレイ数構成比、有料会員数)も想定路線で推移しています。\n\n当期のプレイ回数とピクトリンク有料会員数の見通しは、直近の実績を元に、プレイ回数、会員数を算定したところ、順調に回復しています。"}],"role":"model"},"finish_reason":1,"safety_ratings":[{"category":1,"probability":1,"probability_score":0.14903529,"severity":1,"severity_score":0.17681369},{"category":2,"probability":1,"probability_score":0.082253955,"severity":1,"severity_score":0.14718707},{"category":3,"probability":1,"probability_score":0.1991522,"severity":1,"severity_score":0.16653982},{"category":4,"probability":1,"probability_score":0.15115306,"severity":1,"severity_score":0.16844618}]}],"usage_metadata":{"candidates_token_count":409,"prompt_token_count":4148,"total_token_count":4557}} gs://hogehoge/vertexai/01.pdf 1711810637303487 application/pdf 658275 a49d838b928cef74969886ff75cc6879 2024-03-30 14:57:17.305000 UTC {  "metadata": []}
{"candidates":[{"content":{"parts":[{"text":" フリュー株式会社の2024年3月期第2四半期決算短信です。\n\n-連結売上高は前年同期比112.8%増の111億円で、過去最高を更新しました。\n-連結営業利益は前年同期比123.0%増の11億円で、こちらも過去最高を更新しました。\n-セグメント別に見ると、世界観ビジネスが好調で、売上高は前年同期比143.1%増の42億8600万円、営業利益は前年同期比398.1%増の8億3700万円となりました。\n-ガールズトレンドビジネスは、売上高が前年同期比99.8%の39億6000万円、営業利益が前年同期比108.7%の12億4200万円でした。\n-フリューニュービジネスは、売上高が前年同期比63.9%の15億8800万円、営業利益が前年同期比▲1億円の▲7100万円でした。\n-通期業績予想は、売上高を390億円から420億円に、営業利益を25億円から33億円に上方修正しました。"}],"role":"model"},"finish_reason":1,"safety_ratings":[{"category":1,"probability":1,"probability_score":0.14414884,"severity":1,"severity_score":0.16762704},{"category":2,"probability":1,"probability_score":0.075448431,"severity":1,"severity_score":0.14033625},{"category":3,"probability":1,"probability_score":0.1884733,"severity":1,"severity_score":0.15469497},{"category":4,"probability":1,"probability_score":0.14829372,"severity":1,"severity_score":0.18053968}]}],"usage_metadata":{"candidates_token_count":288,"prompt_token_count":3374,"total_token_count":3662}} gs://hogehoge/vertexai/02.pdf 1711810637293911 application/pdf 731706 e0de1fb38c99bc1957e838403e53cbc1 2024-03-30 14:57:17.295000 UTC {  "metadata": []}
{"candidates":[{"content":{"parts":[{"text":" - 2024年3月期は増収増益を予想\n- 世界観ビジネスの好調と、固定費改善により、利益を上方修正\n- ガールズトレンドビジネスは、シール紙値上げ比率向上も、その他コンテンツサービスの縮小により売上利益共に横ばい\n- フリューニュービジネスは、家庭用ゲームソフト、アニメが好調により増収し赤字圧縮\n- ピクトリンクの有料会員数は横ばい、プレイ回数は減少傾向"}],"role":"model"},"finish_reason":1,"safety_ratings":[{"category":1,"probability":1,"probability_score":0.15443976,"severity":1,"severity_score":0.17823958},{"category":2,"probability":1,"probability_score":0.069921836,"severity":1,"severity_score":0.14854057},{"category":3,"probability":1,"probability_score":0.19728975,"severity":1,"severity_score":0.16776334},{"category":4,"probability":1,"probability_score":0.15027806,"severity":1,"severity_score":0.19345193}]}],"usage_metadata":{"candidates_token_count":106,"prompt_token_count":3890,"total_token_count":3996}} gs://hogehoge/vertexai/03.pdf 1711810637289339 application/pdf 725825 69ccd677c1c2edb9fd37c9fa550b5d73 2024-03-30 14:57:17.291000 UTC {  "metadata": []}

まとめ

BigQuery の Object テーブルを使えば ML 処理に投げることができるのが見えたと思う。
その中でも Gemini のマルチモーダルを利用した処理というのは prompt を考えたりすると、かなり面白い分析や処理ができるのではないかと考える。

Gemini-pro-vision が16枚しか見れないのも Gemini 1.5 Pro(限定公開プレビュー) が最大画像数: 300となっているので、そこが使えれば行けるはず、乞うご期待。

最後に、以前自分で pipeline を作ってやっていた部分を BigQuery のインタフェースから実施できるのは面白いと思った。
例えば、 ML.UNDERSTAND_TEXT の分類処理を使ってメタデータを自動的に作っていくというのも面白いと思われる。そして、長期バッチ処理には向かないのでユースケースは限られるかもしれないが、データを Cloud Run などに連結することができるため、ロジックが複雑な変換処理であれば BigQuery のリモート関数を考慮にいれてもよいかもしれない

料金

  • object table の料金
  • Vertex AI の料金
    • 利用料分

参考

Discussion