自律型エンベディング生成

このドキュメントでは、データの自律型エンベディング生成を使用する方法について説明します。これにより、BigQuery はソース列に基づいてテーブルのエンベディング列を維持できます。ソース列でデータを追加または変更すると、BigQuery は Vertex AI エンベディング モデルを使用して、そのデータのエンベディング列を自動的に生成または更新します。これは、ソースデータが定期的に更新されるときに BigQuery でエンベディングを維持する場合に役立ちます。

エンベディングは、検索拡張生成(RAG)などの最新の生成 AI アプリケーションに役立ちますが、作成、管理、クエリが複雑になる可能性があります。自律型エンベディング生成を使用すると、類似性検索や他の生成 AI アプリケーションで使用するエンベディングの作成、維持、クエリのプロセスを簡素化できます。

たとえば、次のようなクエリを使用して、自律型エンベディング生成が有効になっているテーブルを作成し、データを挿入して、セマンティック検索を実行できます。

CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(description, connection_id => 'us.example_connection',
        endpoint => 'text-embedding-005'))
    STORED OPTIONS( asynchronous = TRUE ));

# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Super slingers"), ("An exciting board game for the whole family"), ...;

SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

始める前に

テーブルで自律型エンベディング生成を有効にするには、必要な権限と接続が必要です。

必要なロール

自律型エンベディング生成を有効にするために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

  • 接続リソースを使用するには: 接続に対する BigQuery Connections ユーザー roles/bigquery.connectionUser
  • テーブルを作成するには: テーブルに対する BigQuery データ編集者 roles/bigquery.dataEditor
  • 接続のサービス アカウントに次のロールを付与して、Vertex AI エンドポイントでホストされているモデルにアクセスできるようにします。 接続があるプロジェクトに対する Vertex AI ユーザー roles/aiplatform.user

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

接続を作成してサービス アカウントに権限を付与する

テーブルで自律型エンベディング生成を有効にするには、Cloud リソース接続を作成する必要があります。次に、接続の作成時に作成されたサービス アカウントに Vertex AI ユーザーロールroles/aiplatform.user)を付与します。

自律型エンベディング生成を使用してテーブルを作成する

自律型エンベディング生成を使用すると、CREATE TABLE ステートメントAI.EMBED 関数を使用してエンベディングを生成できます。

CREATE TABLE DATASET_ID.TABLE (
  [COLUMN, ...]
  STRING_COL STRING,
  EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        STRING_COL,
        connection_id => CONNECTION_ID,
        endpoint => ENDPOINT)
    )
    STORED OPTIONS (asynchronous = TRUE)
);

次のように置き換えます。

  • DATASET_ID: テーブルを作成するデータセットの名前。
  • TABLE: 自律型エンベディング生成を作成するテーブルの名前。
  • COLUMN, ...: 自動的に埋め込む列の他に、テーブルに含める必要がある列。
  • STRING_COL: 自動的にエンベディングする STRING 列の名前。
  • EMBEDDING_COL_NAME: 自動的に生成されるエンベディング列の名前。
  • CONNECTION_ID: 使用する接続の名前(my_project.us.example_connection など)を含む STRING 値。テーブルを作成するプロジェクトの接続のサービス アカウントに Vertex AI ユーザーロールを付与する必要があります。
  • ENDPOINT: テキスト エンベディング モデルに使用する、サポートされている Vertex AI テキスト エンベディング モデル エンドポイントを指定する STRING 値。指定するエンドポイント値には、モデル バージョン(text-embedding-005 など)を含める必要があります。URL ではなくモデル名を指定すると、BigQuery ML はモデルを自動的に識別し、モデルの完全なエンドポイントを使用します。

バックグラウンド エンベディング生成ジョブは、テーブルの作成直後、またはソース列のデータを更新した直後に開始されます。

エンベディング生成の進行状況を追跡するには、次のようなクエリを使用します。

SELECT
  COUNT(*) AS total_num_rows,
  COUNTIF(description_embedding IS NOT NULL
          AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
  PROJECT_ID.DATASET_ID.TABLE;

エンベディングを含むテーブルを作成したら、自動生成されたエンベディングを含む STRUCT 列にベクトル インデックスを作成できます。

さまざまな商品を販売している大手小売業者を例に考えてみましょう。商品名と説明のテーブルがあり、ユーザーが探している商品を見つけられるようにしたい。次のクエリは、商品の説明のセマンティック検索を支援するために、自律型エンベディング生成を設定する方法を示しています。

まず、データセットを作成します。

CREATE SCHEMA mydataset;

次に、自律型エンベディング生成が有効になっているテーブルを作成して、商品情報を保持します。自動的に生成される列は description_embedding と呼ばれ、description 列に基づいています。

# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (AI.EMBED(
      description,
      connection_id => 'us.example_connection',
      endpoint => 'text-embedding-005'
    ))
    STORED OPTIONS( asynchronous = TRUE )
);

次のクエリは、テーブルに商品名と説明を挿入します。description_embedding は自動的に生成されるため、値を指定しません。

# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Lounger chair", "A comfortable chair for relaxing in."),
  ("Super slingers", "An exciting board game for the whole family."),
  ("Encyclopedia set", "A collection of informational books.");

必要に応じて、テーブルにベクトル インデックスを作成して検索を高速化できます。ベクトル インデックスには 3 行以上のデータが必要なため、次のクエリでは追加のデータが挿入されていることを前提としています。データを挿入するたびに、description_embedding 列が自動的に更新されます。

CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');

最後に、AI.SEARCH 関数を使用して、楽しいおもちゃのセマンティック検索を商品に対して実行できます。

# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

/*------------------+----------------------------------------------+----------------------+
 | name             | description                                  | distance             |
 +------------------+----------------------------------------------+----------------------+
 | Super slingers   | An exciting board game for the whole family. | 0.80954913893618929  |
 | Lounger chair    | A comfortable chair for relaxing in.         | 0.938933930620146    |
 | Encyclopedia set | A collection of informational books.         | 1.1119297739353384   |
 +------------------+----------------------------------------------+----------------------*/

自動生成されたエンベディング列に関する情報を取得する

列が自動生成されたエンベディング列であることを確認するには、INFORMATION_SCHEMA.COLUMNS ビューをクエリします。

次のクエリは、自動的に生成されたすべてのエンベディング列に関する情報を表示します。

SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';

generation_expression フィールドには、列のエンベディングの生成に使用される AI.EMBED 関数の呼び出しが表示されます。

独自の予約を使用する

デフォルトでは、BigQuery はオンデマンド スロットを使用して、生成されたエンベディング列の維持に必要な処理を処理します。予測可能で一貫したパフォーマンスを確保するために、必要に応じて予約を作成し、job_typeBACKGROUND に設定できます。バックグラウンド予約が存在する場合、BigQuery はそれを使用して、生成されたエンベディング列を維持します。

トラブルシューティング

生成されたエンベディング列には、resultstatus の 2 つのフィールドが含まれています。BigQuery がテーブルの特定の行のエンベディングを生成しようとしたときにエラーが発生すると、result フィールドは NULL になり、status フィールドにエラーの説明が記述されます。たとえば、ソース列が NULL の場合、result エンベディングも NULL で、ステータスは NULL value is not supported for embedding generation になります。

より重大なエラーが発生すると、エンベディングの生成が停止する可能性があります。この場合は、INFORMATION_SCHEMA.JOBS ビューでバックグラウンド ジョブをクエリし、error_result フィールドの情報を確認します。バックグラウンド エンベディング ジョブのジョブ ID には、gc_ という接頭辞が付いています。たとえば、次のクエリは、エラー結果が NULL ではないすべてのバックグラウンド ジョブを抽出します。

SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
  SELECT 1
  FROM unnest(j.referenced_tables) t
  WHERE
    j.project_id = 'PROJECT_ID'
    AND t.dataset_id = 'DATASET_ID'
    AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;

費用を追跡する

自律型エンベディング生成は Vertex AI にリクエストを送信するため、費用が発生する可能性があります。バックグラウンド エンベディング ジョブで発生した Vertex AI の費用を追跡する手順は次のとおりです。

  1. Cloud Billing で請求レポートを表示します
  2. フィルタを使用すると、結果を絞り込むことができます。

    サービスで、[Vertex AI] を選択します。

  3. 特定のジョブの料金を確認するには、ラベルでフィルタします。

    キーに bigquery_ml_job を設定し、値にエンベディング ジョブのジョブ ID を設定します。バックグラウンド エンベディング ジョブにはすべて gc_ という接頭辞が付いています。

一部の請求が Cloud Billing に表示されるまでに、最長で 24 時間ほどかかることがあります。

制限事項

  • 各テーブルでサポートされる自動生成されたエンベディング列は 1 つだけです。
  • Google Cloud コンソール、bq show コマンド、INFORMATION_SCHEMA.TABLES ビューの ddl フィールドを使用してテーブルのスキーマを表示しても、列が自動的に生成されたことを示す表示はありません。
  • ALTER TABLE ADD COLUMN を使用して、生成されたエンベディング列を既存のテーブルに追加することはできません。
  • 生成されたエンベディング列を含むテーブルのコピー、クローン、スナップショットを作成すると、データのみがコピーされます。生成構成は新しいテーブルには適用されません。新しいテーブルのソース列を更新しても、新しいエンベディングは生成されません。
  • 自律型エンベディング生成が有効になっているテーブルをスナップショットから復元しても、エンベディング生成構成は復元されません。
  • 生成されたエンベディング列は、SQL を使用してのみ作成できます。bq mk コマンドまたは bq update コマンドを使用して、生成されたエンベディング列を作成することはできません。
  • 生成された列のソース列は STRING 列である必要があります。
  • 生成されたエンベディング列を作成すると、次の制限が適用されます。

    • ソース列は削除または名前変更できませんが、生成されたエンベディング列は削除または名前変更できます。エンベディング列を削除すると、ソース列を削除または名前変更できます。
    • ソース列または生成されたエンベディング列のデータ型は変更できません。
  • 自動生成されたエンベディング列のデフォルト値を指定することはできません。

  • 次の方法で、生成されたエンベディング列に直接書き込むことはできません。

    • DML
    • ストリーミング書き込み
    • bq insert
    • bq copy -a
  • 生成されたエンベディング列を含むテーブルは、ポリシータグなどの列レベルのセキュリティ ポリシーをサポートしていません。

  • VECTOR_SEARCHAI.SEARCH などの検索関数を呼び出すと、ベーステーブルでエンベディングが欠落している行は検索時にスキップされます。

  • 自律型エンベディング生成が有効になっているテーブルにパーティション分割ベクトル インデックスを作成することはできません。

  • 自動生成されたエンベディング列にベクトル インデックスを作成すると、行の 80% 以上でエンベディングが生成された後にインデックス トレーニングが開始されます。次のクエリを使用すると、テーブルのエンベディングの生成率を確認できます。

    SELECT
      COUNTIF(description_embedding IS NOT NULL
      AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent
    FROM PROJECT_ID.DATASET_ID.TABLE;
    

次のステップ