Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20260323_データ分析基盤でGeminiを使う話

Avatar for yuichi yuichi
March 23, 2026

 20260323_データ分析基盤でGeminiを使う話

Avatar for yuichi

yuichi

March 23, 2026
Tweet

More Decks by yuichi

Other Decks in Technology

Transcript

  1. BigQuery からVertex AI 経由でGemini を呼び出せる関数 BigQuery テーブル AI.GENERATE 関数 Vertex

    AI Gemini 評価結果 型付き 1. SQL だけで完結 BigQuery の中で処理実行が完結する 2. 全件一括処理 テーブルの全レコードをGemini が1 行ずつ評価 3. 型付き出力 output_schema でSTRUCT 型として受け取れるので後続処理がシンプル AI.GENERATE 関数 とは 4 / 16
  2. SQL だけで完結できる with base as ( select text_column, ai.generate( 'レビューから感情スコアと評価理由を分析して'

    || text_column, output_schema => 'score INT64, reason STRING' ) as ai_res from reviews ) select text_column, ai_res.score, ai_res.reason from base こんな結果が得られる レビュー文 score reason 「デザインが非常に洗練されていて… 初期設定に少し時間がかかったのが残念で す。 」 80 デザインは高評価だが、セットアップの難易度がマイナス 要因 「注文してから届くまでが遅すぎます… 二度と利用しません。 」 15 配送遅延・梱包の不満、リピート意向も低い 「コスパ最高です!この価格でこの機能性は文句なし。 」 95 価格・機能・操作性すべてにポジティブな評価 実際にやってみた 5 / 16
  3. テキスト ⾮構造化 AI.GENERATE 関数 評価テーブル score 列など BI ダッシュボード ▶︎

    ネガティブレビューの急増をすぐ検知できる ネガティブレビュー⽐率(⽉次推移) 1 ⽉ 2 ⽉ 3 ⽉ 4 ⽉ 5 ⽉ 6 ⽉ 50 45 40 35 30 25 20 15 10 5 0 ネガティブ率 (%) 4 月に急増 → アラートで即検知・対応できる AI ラベリング前は「なんとなく悪い気がする」で終わっていたものが、数値で追えるようになる ラベリング後のデータをBI ダッシュボードに繋げると 6 / 16
  4. 旧(ML.GENERATE_TEXT 関数) 出力は固定のJSON 文字列 型が不確定 → パース処理が必要 新(AI.GENERATE 関数) ai.generate(

    prompt, output_schema => 'sentiment STRING, score INT64' ) → 指定した型のSTRUCT で返ってくる 対応型:STRING 、INT64 、FLOAT64 、BOOL 、ARRAY 、STRUCT 型付きで返ってくるから後処理が楽 7 / 16
  5. SQL の中で、使用モデルを指定可能 select ai.generate( ~, endpoint => 'gemini-2.5-flash', 状況に応じたモデル選択 モデル

    コスト 速度 おすすめ用途 gemini-2.5-pro 高 遅い 複雑な推論が必要な場合 gemini-2.5-flash 低 速い 通常の分類・ラベリング 分類・ラベリング用途なら flash で十分 モデルのライフサイクルは注視 用途に応じてGemini モデルを指定可能 8 / 16
  6. 汎用 関数 用途 AI.GENERATE 要約・翻訳・抽出・分類。output_schema で型指定 AI.GENERATE_TEXT テーブル→ テーブル。Claude 等も利用可

    AI.GENERATE_TABLE 複数項目の構造化抽出 AI.GENERATE_BOOL/INT/DOUBLE 型を絞ったシンプル版 マネージド(軽量) 関数 用途 AI.IF WHERE / JOIN に直書き AI.SCORE スコアリング(内部最適化あり) AI.CLASSIFY ラベルリストを渡すだけ エンベディング 関数 用途 AI.EMBED テキスト/ 画像→ ベクトル AI.SIMILARITY 類似度スコア AI.SEARCH セマンティック検索 目的別に使い分けるAI 関数 9 / 16
  7. with customer_reviews as ( select 101 as review_id, 'デザインが洗練されていて最高です!ただ、バッテリーの持ちがもう少し良ければ完璧でした。' as

    review_text union all select 102, '期待外れ。動作が重すぎて使い物になりません。返品を検討しています。' union all select 103, '普通の製品です。可もなく不可もなくといったところ。' ) select review_id, ai.generate( concat('このレビューの感情を分析してください: ', review_text), output_schema => 'sentiment STRING, confidence_score FLOAT64, key_points ARRAY<STRING>', endpoint => 'gemini-2.5-flash' ).* from customer_reviews 非構造化テキストが型付きの構造化データに変わる。 sentiment 列でそのままBI のフィルタ・集計に使える id sentiment confidence_score key_points 101 mixed 0.95 [" 洗練されたデザイン", " バッテリーの持ち"] 102 negative 0.95 [" 期待外れ", " 動作が重すぎる", " 返品を検討"] 103 neutral 0.95 [" 普通の製品", " 可もなく不可もなく"] ユースケース①:レビュー感情分析 10 / 16
  8. with user_comments as ( select 1 as comment_id, 'この記事、非常に参考になりました!ありがとうございます。' as

    comment_text union all select 2, '【限定】スマホで月収100万円!?今すぐこちらのURLをクリック! http://example.com' union all select 3, 'この作者はアホなのか?レベルが低すぎて話にならない。' ) select comment_id, ai.generate( concat('このコメントがスパム・誹謗中傷・不適切な内容かどうか判定してください: ', comment_text), output_schema => 'is_anomalous BOOL, reason STRING, severity INT64', endpoint => 'gemini-2.5-flash' ).* from user_comments reason で判定根拠も取得。 severity でモデレーション優先度をBI 上に可視化できる id is_anomalous reason severity 1 false 肯定的なフィードバック。問題なし 0 2 true 高収入を謳いURL クリックを促す典型的なスパム 5 3 true 誹謗中傷・侮辱・攻撃的な言葉を含む 5 ユースケース②:異常コメント抽出 11 / 16
  9. 評価対象データのみ プロンプト管理テーブル ソーステーブル AI.GENERATE 関数 AI 評価ディメンションテー ブル ファクトテーブル BI

    ダッシュボード 責務の切り出し プロンプト管理テーブル: プロンプトをSQL にハードコードせず、マスタとして管理 AI 評価ディメンションテーブル: AI の出力結果を格納するテーブルを独立 メリット: 後続のBI で「新しい評価項目を追加したい」という要望が出た際も、システム全体を作り直す ことなく、プロンプトや評価テーブルの拡張のみで柔軟に対応可能 データパイプラインに組み込む 12 / 16
  10. よかった SQL だけで完結。Python スクリプト不要 output_schema で型付き出力が想像以上に便利 flash でも分類精度は十分実用的 パイプラインに組み込んで定期実行できる 気をつけポイント

    プロンプトが甘いと出力がブレる → 3 点セット(指示・フォーマット・判断基準)が必要 コストのトラッキングがわかりにくい 増分更新を最初から設計しておかないと後で痛い目を見る 生成AI が判定できないケースも許容する 実際に触れてみて 14 / 16