BigQueryの自動エンベディング生成を使ってみた

記事タイトルとURLをコピーする

G-gen の杉村です。BigQuery の自動エンベディング生成機能の概要と、簡単な検証結果を紹介します。自動エンベディング生成を使うと、テーブルの特定列のデータが挿入されたり更新されたりしたときに、自動的にエンベディングが生成され、セマンティック検索や RAG に利用することができます。

はじめに

BigQuery の自動エンベディング生成とは

BigQuery の自動エンベディング生成とは、BigQuery テーブルの特定列のデータが挿入されたり更新されたりしたときに、自動的にエンベディングが生成される機能です。

初期設定後はデータのベクトル化が自動的に行われるため、パイプラインの構築やメンテナンスは不要です。これにより、運用・保守の工数を抑えることができます。

当機能では、特定のソース列を指定してテーブルを作成すると、ソース列のデータの挿入や更新に応じて、バックグランドの非同期処理によってエンベディングが生成されます。生成のステータスを示す列も同時に生成されるため、生成処理の進捗を追跡することもできます。

料金

BigQuery の自動エンベディング生成では、デフォルトではオンデマンドスロットが使用され、処理に使用したスロット分だけのコンピュート料金が発生します。

これに加え、ベクトル化に利用した Vertex AI のモデルの利用料金も発生します。

例として当記事でも使用した text-embedding-005 モデルでは、入力および出力に文字数あたりの料金が発生します。具体的な単価は以下の公式料金表を参照してください。

制限事項

当機能には、例として以下のような制限事項があります。

  • ソース列は STRING 型のみ対応
  • 既存テーブルに、あとから自動生成エンベディング列を追加することは不可
  • 自動生成エンベディング列は、テーブルごとに1つだけ生成可能
  • 自動生成エンベディング列に対して、手動で直接、更新や挿入は不可

制限の全量や詳細は、以下の公式ガイドを参照してください。

接続の作成と設定

接続とは

当機能を使うには、まず Google Cloud プロジェクトに接続(Connection)を作成します。接続とは、BigQuery から外部リソースを利用するために、認証情報や接続情報を保存するための設定オブジェクトです。

接続の新規作成

今回は Vertex AI 経由でエンベディング生成 AI モデルを使用するため、「Google Cloud リソース」種別の接続を作成します。

BigQuery Studio(Google Cloud コンソールの BigQuery 画面)において、画面左側のエクスプローラメニューから「接続」をクリックします。表示された一覧画面上部の、「接続を作成」ボタンを押下します。

接続の作成

接続タイプとして「Vertex AI リモートモデル、リモート関数、BigLake、Spanner(Cloud リソース)」を選択します。接続 ID やわかりやすい名前は任意のものを指定します。ロケーションは、対象データセットのロケーションとあわせます。

設定値の指定

サービスアカウントへの権限付与

接続が作成できたら、詳細画面でサービスアカウント ID を確認します。プロジェクトレベルの IAM 許可ポリシーで、このサービスアカウントに Vertex AI ユーザーroles/aiplatform.user)を付与します。これにより、BigQuery は接続を通じて、Vertex AI のリモートモデル(当記事の場合は text-embedding-005)を呼び出すことができます。

接続の詳細画面

プロジェクトレベルでサービスアカウントにロールを付与

テーブルの作成

テーブルの作成時に、自動エンベディング生成を有効化します。今回は、以下のような DDL でテーブルを作成します。

当記事ではパブリックデータセットとして公開されている Google Cloud のリリースノートをお題のデータとして検証を行います。description 列をソース列として、description_embedding 列にエンベディングを自動生成させます。

CREATE OR REPLACE TABLE
  `my-project.my_dataset.google_cloud_release_notes_search` (
    published_at DATE,
    product_id STRING,
    product_name STRING,
    product_version_name STRING,
    release_note_type STRING,
    description STRING,
    description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
      GENERATED ALWAYS AS (
        AI.EMBED(description, connection_id => 'us.vertex_ai_connection',
          endpoint => 'text-embedding-005')
      )
      STORED OPTIONS( asynchronous = TRUE )
  );

上記のうち description_embedding 列の定義で、GENERATED ALWAYS AS を入れることで、エンベディングの自動生成がセッティングされます。構文については、以下の公式ガイドを参照してください。

レコードの挿入

以下のような DML で、新規作成したテーブルにレコードを挿入します。データは、パブリックデータセットから取得しています。

INSERT INTO
  `my-project.my_dataset.google_cloud_release_notes_search`
  (description, release_note_type, published_at, product_id, product_name, product_version_name)
SELECT
  description,
  release_note_type,
  published_at,
  CAST(product_id AS STRING),
  product_name,
  product_version_name
FROM
  `bigquery-public-data.google_cloud_release_notes.release_notes`
WHERE
  published_at >= "2025-11-01";

なおこのソーステーブルの product_id 列にはレガシーな INTEGER 型が使われており、新しい INT64 型の列には格納できない値が含まれているため、STRING 型に CAST しています。

エンベディング生成状況の追跡

description_embedding.status フィールドには、エンベディングの生成状況が格納されます。status には、未生成であれば NULL が、生成済みであれば空文字列が格納されます。生成がエラーであれば、status フィールドにはエラーメッセージが格納されます。

また description_embedding.result には、生成されたエンベディング([0.012149171903729439, 0.018285524100065231, -0.0325402095913887...])が格納されます。

SELECT
  *
FROM
  `my-project.my_dataset.google_cloud_release_notes_search`
ORDER BY
  description_embedding.status ASC;

今回の検証における元データのデータ量は395 KB、行数は635行です。このデータに対しては、1分も経たずにすべての行のエンベディング生成が完了しました。

生成状況の確認(1)

より大きいサイズのテーブルに対しては、以下のようなクエリで、全行数に対してどこまで生成が完了しているかを確認できます。

SELECT
  COUNT(*) AS total_num_rows,
  COUNTIF(description_embedding IS NOT NULL
    AND description_embedding.status = ''
  ) AS total_num_generated_embeddings
FROM
  `my-project.my_dataset.google_cloud_release_notes_search`;

生成状況の確認(2)

検索の実行

以下のようなクエリで、テーブルに対するセマンティック検索を実施します。このクエリでは、マネージド AI 関数である AI.SEARCH() を使っています。この関数は、自動エンベディング生成が有効になったテーブル専用の関数です。

この関数に検索クエリを与えると、エンベディングのベクトル空間内での距離の近さ、すなわち意味の近さを数字で返します。この関数はセマンティック検索、レコメンデーション、分類、クラスタリング、外れ値検出などに使用できます。数字がゼロに近ければ近いほど、意味が近いことになります。

SELECT
  base.published_at,
  base.product_id,
  base.product_name,
  base.release_note_type,
  base.description,
  distance
FROM
  AI.SEARCH(
    TABLE `my-project.my_dataset.google_cloud_release_notes_search`,
    'description',
    "BigQuery AI functions",
    top_k => 20
  )
ORDER BY
  distance ASC;

上記のクエリでは、リリースノートの description の中から、「BigQuery AI functions」というワードに意味が近いもののうち、上位20行を抽出します。

AI.SEARCH() の詳細な使用方法は以下の公式ガイドを参照してください。

実行結果として、BigQuery の生成 AI 関数のアップデート情報などが上位に表示されました。

検索の実行結果

応用

ベクトルインデックスの作成

オプションで、以下のようにしてベクトルインデックスを作成できます。ベクトルインデックスを作成すると、ベクトル検索が効率化され、スピードが向上します。ただし、ベクトルインデックスは5,000行以上のテーブルに作成できます。

CREATE VECTOR INDEX my_index
ON `my-project.my_dataset.google_cloud_release_notes_search`(description_embedding)
OPTIONS(index_type = 'IVF');

予約の指定

デフォルトでは、エンベディングの生成にはオンデマンドスロットが使用されます。

BigQuery editions のスロットを使用したい場合、job_typeBACKGROUND にして予約をプロジェクトに割り当てます。

杉村 勇馬 (記事一覧)

執行役員 CTO

元警察官という経歴を持つ IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。