3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】BigQueryの生成AI機能を使ってみた!

Last updated at Posted at 2025-10-12

SQLが書けなくても大丈夫!BigQueryの生成AIでデータ分析の強い味方

対象読者

  • SQLは苦手だけど、自分でデータを分析してみたいビジネスパーソン(企画、マーケターなど)
  • データ分析の生産性を上げたいデータアナリスト、エンジニア
  • Google Cloudの生成AI機能に興味がある方

TL;DR
BigQueryに搭載された生成AI「Gemini in BigQuery」がすごい。①日本語の指示(プロンプト)でSQLを自動生成したり、②SQL関数(ML.GENERATE_TEXT)でテキストの要約や分類をしたりと、データ分析のハードルを劇的に下げてくれます。この記事では、その具体的な使い方を実践形式で解説します!


1. BigQueryと強力な助っ人「Gemini in BigQuery」

まず、今回利用する技術について簡単に見ていきましょう。

BigQueryとは?

BigQueryは、Google Cloudが提供するフルマネージドでサーバーレスなデータウェアハウスです。ペタバイト級の巨大なデータに対しても、数秒から数十秒という驚異的な速さで分析処理を実行できるのが特徴です。

Googleの公式ドキュメントでは、以下のように説明されています。

BigQuery は、超並列クエリ処理と高帯域幅のネットワーク接続を使用して、ペタバイト規模のデータを数秒で、ギガバイト規模のデータをミリ秒単位で処理します。(中略)使い慣れた SQL 言語を使用して、データをクエリできます。
BigQuery の概要 | Google Cloud

膨大なデータを蓄積し、高速に分析するための強力な基盤と言えます。

Gemini in BigQueryとは?

Gemini in BigQueryは、そのBigQueryにGoogleの高性能な生成AIモデル「Gemini」を統合した機能群の総称です。これにより、これまでSQLの専門知識が必要だったデータ分析作業を、自然言語(日本語)で行えるようになります。

Gemini in BigQuery は、データチームが生産性を高め、費用を最適化し、ビジネス価値を高めるのに役立つ AI 活用支援機能を提供します。(中略)SQL と Python のコード生成、コード補完、コードの説明、BigQuery のデータ検出とデータ準備を支援します。
Gemini in BigQuery の概要 | Google Cloud

今回は、このGemini in BigQueryが持つ2つの強力な機能、「自然言語からのSQL生成」と「SQL関数によるテキスト生成」を試していきます。


2. 実践①:日本語の指示でSQLを自動生成する

ここからは、実際の機能を使って試していきます。今回は、BigQueryで一般公開されているeコマースのデモデータセットthelook_ecommerceを使って、様々なレベルのSQLを生成させてみます。

Step 0: 前提

  • Google Cloudアカウント、プロジェクトが作成済みであること。
  • 分析を行いたいGoogle Cloudプロジェクトで Cloud AI Companion API が有効になっていること。

Step 1: BigQuery Studioへのアクセス

まず、Google Cloudコンソールにログインします。
画面上部の検索窓から BigQuery を検索し、BigQuery Studioに遷移します。
BigQuery Studioを開き、「クエリを新規作成」をクリックします。

Step 2: 日本語で指示を入力し、SQLを生成する

クエリエディタが開いたら、SQLで行いたい処理を**コメント形式(#から始める)**で記述します。入力後、エディタの下に表示される「生成」ボタンをクリックします。

【レベル1:初級】単一テーブルからの基本的な集計

まずは小手調べ。ユーザーテーブルから特定の州のユーザー数を数えてもらいます。

▼ 鉛筆ボタンをクリックし、ポップアップにプロンプトを入力し生成ボタンをクリックすると、SQLが生成される
bigquery_querybuilder.png

prompt.png

query生成.png

入力した日本語の指示:

# 「bigquery-public-data.thelook_ecommerce.users」テーブルから、「state」列が「California」のユーザー数をカウントして

生成想定のSQL:

SELECT
    count(*) as California_count
  FROM
    `bigquery-public-data.thelook_ecommerce.users` AS t
  WHERE t.state = 'California'

想定結果:

California_count
1 3701

すると、Geminiがコメントを解釈し、即座に対応するSQLを生成してくれます。

生成されたSQL:

-- # 「bigquery-public-data.thelook_ecommerce.users」テーブルから、「state」列が「California」のユーザー数をカウントして
SELECT
  COUNT(DISTINCT users.id) AS count_of_users
FROM
  `bigquery-public-data`.`thelook_ecommerce`.`users` AS users
WHERE
  users.state = 'California';

実行結果:
実行結果.png

生成されたSQLに問題がなければ、「実行」ボタンを押して結果を確認します。

【レベル2:中級】複数テーブルの結合

次は、2つのテーブルを結合して、カテゴリごとの売上を集計させてみます。

入力した日本語の指示:

# 「bigquery-public-data.thelook_ecommerce.products」テーブルと「bigquery-public-data.thelook_ecommerce.order_items」テーブルを結合して、各商品カテゴリ(products.category)ごとの総売上(order_items.sale_price)を計算し、売上が高い順に並べて

生成想定のSQL:

SELECT
    p.category,
    SUM(oi.sale_price) AS total_revenue
  FROM
    `bigquery-public-data.thelook_ecommerce.order_items` AS oi
    INNER JOIN `bigquery-public-data.thelook_ecommerce.products` AS p ON oi.product_id = p.id
  GROUP BY
    p.category
  ORDER BY
    total_revenue DESC

想定結果:

category total_revenue
1 Outerwear & Coats 1328738.2389774323
2 Jeans 1254118.5016040802
3 Sweaters 837602.110159874
4 Swim 654086.87071990967
5 Suits & Sport Coats 639064.94005298615

生成されたSQL:

-- # 「bigquery-public-data.thelook_ecommerce.products」テーブルと「bigquery-public-data.thelook_ecommerce.order_items」テーブルを結合して、各商品カテゴリ(products.category)ごとの総売上(order_items.sale_price)を計算し、売上が高い順に並べて
SELECT
  t1.category,
  SUM(t2.sale_price) AS total_sales
FROM
  `bigquery-public-data`.`thelook_ecommerce`.`products` AS t1
INNER JOIN
  `bigquery-public-data`.`thelook_ecommerce`.`order_items` AS t2
ON
  t1.id = t2.product_id
GROUP BY
  t1.category
ORDER BY
  SUM(t2.sale_price) DESC;

実行結果:
level2実行結果.png

JOINやGROUP BY、ORDER BYといった句も適切に使いこなしてくれていることがわかります。

【レベル3:上級】ウィンドウ関数を含む複雑な分析

最後に、少し複雑な時系列分析に挑戦します。日々の売上に加え、その日までの累積売上を計算するよう指示してみます。

入力した日本語の指示:

# 2024年1月における日毎の売上と、その日までの累積売上を計算して。
# 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。

生成想定のSQL:

SELECT
    sale_date,
    daily_sales,
    SUM(daily_sales) OVER (ORDER BY sale_date) AS cumulative_sales
  FROM (
    SELECT
        EXTRACT(DATE FROM created_at) AS sale_date,
        SUM(sale_price) AS daily_sales
      FROM
        `bigquery-public-data.thelook_ecommerce.order_items`
      WHERE
        EXTRACT(YEAR FROM created_at) = 2024
        AND EXTRACT(MONTH FROM created_at) = 1
      GROUP BY
        sale_date
  )
  ORDER BY
    sale_date

想定結果:

sale_date daily_sales cumulative_sales
1 2024-01-01 6773.0800094604492 6773.0800094604492
2 2024-01-02 4162.1500182151794 10935.230027675629
3 2024-01-03 5862.2700090408325 16797.500036716461
4 2024-01-04 6344.9100141525269 23142.410050868988
5 2024-01-05 7543.7899961471558 30686.200047016144

生成されたSQL:

-- # 2024年1月における日毎の売上と、その日までの累積売上を計算して。
-- # 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。
SELECT 
 sale_date,
 daily_sales,
 SUM(daily_sales) OVER (ORDER BY sale_date) AS cumulative_sales
FROM
  (SELECT
    DATE(order_items.created_at) AS sale_date,
    SUM(order_items.sale_price) AS daily_sales
  FROM
    `bigquery-public-data.thelook_ecommerce.order_items` AS order_items
  WHERE
    DATE_TRUNC(DATE(order_items.created_at), MONTH) = DATE '2024-01-01'
  GROUP BY
    sale_date
  )
ORDER BY
  sale_date

実行結果:
level3.png

サブクエリ(WITH句)やウィンドウ関数 OVER() を使った高度なSQLも見事に生成できました。SQLに不慣れな人にとっては、このようなクエリをゼロから書くのは大変ですが、Geminiを使えば一瞬です。

※ちなみに、私が実践した際には何度かそもそも実行できないSQLが生成されることがありました。
やはりSQL生成に特化しているからといってもやりたいことを明確にし、表現を工夫すること、そして、何度か生成は試してみることが必要です。

生成された失敗SQL:

-- Window ORDER BY expression references order_items.created_at which is neither grouped nor aggregated at [4:56]

-- # 2024年1月における日毎の売上と、その日までの累積売上を計算して。
-- # 日付(created_at)は「bigquery-public-data.thelook_ecommerce.order_items」テーブルから取得して。
SELECT
  DATE(order_items.created_at) AS sale_date,
  SUM(order_items.sale_price) AS daily_sales,
  SUM(SUM(order_items.sale_price)) OVER (ORDER BY DATE(order_items.created_at)) AS cumulative_sales
FROM
  `bigquery-public-data`.`thelook_ecommerce`.`order_items` AS order_items
WHERE
  DATE_TRUNC(DATE(order_items.created_at), MONTH) = DATE '2024-01-01'
GROUP BY
  sale_date
ORDER BY
  sale_date

3. 実践②:SQL関数でテキストを生成・要約する ML.GENERATE_TEXT

BigQueryの生成AI機能はこれだけではありません。ML.GENERATE_TEXT というSQL関数を使うと、クエリ内で直接、テキスト生成AIモデルを呼び出すことができます。

ML.GENERATE_TEXT 関数を使用すると、BigQuery に保存されているデータに対して、Google Cloud でホストされている大規模言語モデル(LLM)で推論を実行できます。
ML.GENERATE_TEXT 関数 | Google Cloud

これにより、データの要約、分類、感情分析、さらには新しい文章の作成といった高度な処理をSQLだけで完結できます。

ユースケース例:商品名からキャッチコピーを生成する

thelook_ecommerce.productsテーブルにある商品名とカテゴリを元に、AIに魅力的なキャッチコピーを考えてもらいましょう。

実行するSQL:

SELECT
  name,
  category,
  ml_generate_text_result['predictions'][0]['content'] AS catch_copy
FROM
  ML.GENERATE_TEXT(
    MODEL `bqml_llm_model`,
    (
      SELECT
        CONCAT('商品名:「', name, '」、カテゴリ:「', category, '」 この商品の魅力が伝わる30文字程度のキャッチコピーを考えてください。') AS prompt,
        name,
        category
      FROM
        `bigquery-public-data.thelook_ecommerce.products`
      WHERE category = 'Tops & Tees' -- カテゴリを絞って試す
      LIMIT 5
    ),
    STRUCT(
      0.8 AS temperature,
      256 AS max_output_tokens
    )
  );

(※注: このクエリを実行するには、事前にLLMを参照するBigQuery MLモデルを作成しておく必要があります)

このクエリは、Tops & Teesカテゴリの商品5つについて、prompt列に「キャッチコピーを考えて」という指示を作成し、それをML.GENERATE_TEXT関数に渡しています。結果として、各商品の横にAIが生成したキャッチコピーが新しい列として追加されます。

このように、SQLの処理結果を動的にプロンプトに組み込めるため、大量のデータに対して一括でテキスト生成タスクを実行できるのが大きな魅力です。


4. まとめ

  • BigQueryの「Gemini in BigQuery」は、データ分析の強力なサポーターとなります。
  • 日本語のコメントを書くだけで、初心者には難しい複雑なSQLも自動で生成してくれます。
  • ML.GENERATE_TEXT関数を使えば、SQL内でデータの要約や分類、文章作成といった高度なテキスト処理が可能になります。
  • これらの機能により、SQLの専門家でなくてもデータからインサイトを引き出しやすくなり、まさにデータ分析の民主化が進むと言えるでしょう。

この記事が、皆さんのデータ分析ライフの新たな一歩となれば幸いです!


5. 参考ドキュメント

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?