モデルの抽出により AI 関数の費用を最適化する

このドキュメントでは、BigQuery でマネージド AI 関数の最適化モードを使用する方法について説明します。最適化モードを使用すると、数千行、さらには数十億行を含む大規模なデータセットを処理できます。標準の行ごとの LLM 推論と比較して、大規模言語モデル(LLM)のトークン消費量とクエリ レイテンシが大幅に削減されます。この最適化は、AI.IF 関数と AI.CLASSIFY 関数にのみ適用されます。

クエリのトークン効率を最適化するのではなく、予算超過を防ぐためにトークンの合計消費量に上限を設定する場合は、トークン割り当てで費用を管理するをご覧ください。

トークンの消費量をより詳しく把握するには、Google Cloud コンソールでクエリで使用されたトークンの数を確認します。クエリを実行する前にこの使用量を見積もるには、AI.COUNT_TOKENS 関数を使用します。

次の例は、text-embedding-005 をエンベディング モデルとして使用し、最適化モードで AI.IF 関数を使用して、自然災害に関するニュース記事を特定する方法を示しています。

SELECT
  title,
  body,
  AI.IF(
    ('The following news story is about a natural disaster: ', body),
    embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
    -- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
    optimization_mode => 'MINIMIZE_COST'
   ) AS is_natural_disaster
FROM
  `bigquery-public-data.bbc_news.fulltext`;

optimization_mode => 'MINIMIZE_COST' 引数を指定すると、最適化モードが有効になります。これは、エンベディングが指定されている場合のデフォルト設定であるため、この引数は省略できます。

この例では、エンベディングはオンザフライで生成されます。実際には、再利用できるようにエンベディングを実体化することをおすすめします。

最適化モードの仕組み

マネージド AI 関数 AI.IF と AI.CLASSIFY は、通常、データセットの行ごとにリモート LLM を呼び出します。最適化モードを使用すると、BigQuery はクエリの実行中に軽量の蒸留モデルを自動的にトレーニングします。

このプロセスは次のように動作します。

最適化モードが有効な場合の AI 関数のワークフロー

  • サンプリングとラベル付け: BigQuery は、データの小さな代表サンプルを選択し、Gemini を呼び出してラベルを提供します。
  • 抽出モデルのトレーニング: LLM ラベルとデータ エンベディングを特徴として使用して、ローカル抽出モデルがジャストインタイムでトレーニングされます。
  • 品質チェック: BigQuery は、LLM の結果と比較して、抽出されたモデルの精度を評価します。デフォルトでは、抽出されたモデルが必要な品質しきい値を満たしていない場合、クエリは失敗し、モデルが破棄された理由を説明するエラーが返されます。モデルの品質が許容範囲内であっても、BigQuery は、一貫した品質を維持するため、または有効なエンベディングがない行に対して、特定の行でリモート LLM にフォールバックすることがあります。
  • 推論: 抽出されたモデルがほとんどの行を処理するため、Gemini 呼び出しの数が大幅に削減されます。

制限事項

最適化モードには次の制限があります。

  • 最小行数: AI 関数への入力には、モデルのトレーニングに十分なデータを確保するため、約 3,000 行が含まれている必要があります。
  • 関数のサポート: AI.IF 関数と AI.CLASSIFY 関数のみが最適化モードをサポートしています。ただし、AI.CLASSIFY で最適化モードを使用する場合、抽出されたモデルの品質が不十分な場合、クエリが失敗することがあります。
  • エラー率: max_error_ratio 引数は最適化モードではサポートされていません。

始める前に

BigQuery でマネージド AI 関数を実行するために必要な権限を取得するには、Gemini Enterprise Agent Platform LLM を呼び出す生成 AI 関数の権限を設定するをご覧ください。

エンベディング モデルを選択する

最適化モードを使用するには、データのエンベディングを計算して AI 関数に渡す必要があります。入力列に関連付けられたエンベディングがある場合、すべての行でエンベディング ディメンションが一致し、同じエンベディング モデルによって生成されている必要があります。

費用対効果とスケーラビリティを最適化するには、英語または多言語タスクに text-embedding-005 や Gemini エンベディングなどのエンベディング モデルを使用して、データのエンベディングを計算することをおすすめします。マルチモーダル データ(テキストと画像)の場合は、Gemini Embedding 2(gemini-embedding-2)などのマルチモーダル エンベディング モデルを使用することをおすすめします。

エンベディングを生成する

データのエンベディングを計算するには、BigQuery で管理される自律生成を使用するか、エンベディング列を手動で作成します。以降のセクションでは、AI.CLASSIFY 関数と AI.IF 関数で両方のアプローチを使用する方法について説明します。

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

自律型エンベディング生成を使用すると、AI.IF または AI.CLASSIFY が呼び出されたときに、BigQuery はエンベディングを自動的に使用します。これは推奨される方法ですが、テーブルごとに 1 つのエンベディング列に制限されます。

次の例では、text-embedding-005 をエンベディング モデルとして使用して、自律的に生成されたエンベディング列を含むテーブルを作成し、AI.CLASSIFY 関数を使用してデータを分類します。

-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
  title STRING,
  body STRING,
  body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        body,
        connection_id => '<my_connection_id>',
        task_type => 'CLASSIFICATION',
        endpoint => 'text-embedding-005')
    ) STORED
    OPTIONS(asynchronous = TRUE)
);

-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other']
  ) AS category
FROM
  my_dataset.bbc_news;

列の手動指定

既存のエンベディング列がある場合は、AI.IF または AI.CLASSIFY の embeddings 引数で指定します。これは、AI.EMBED 関数を使用して生成できます。

次の例は、text-embedding-005 をエンベディング モデルとして使用して、エンベディング列を含むテーブルを作成し、その列を AI.CLASSIFY クエリで使用する方法を示しています。

-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
  title,
  body,
  AI.EMBED(
    body,
    endpoint => 'text-embedding-005',
    task_type => 'CLASSIFICATION'
  ).result AS body_embedding
FROM
  `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other'],
    embeddings => body_embedding,
  ) AS category
FROM
  my_dataset.bbc_news;

プロンプトで複数の列を参照する場合は、embeddings 引数に列名とその対応するエンベディングのリストを指定します。例: embeddings => [('body', body_embedding), ('title', title_embedding)]。

クエリの最適化をモニタリングする

クエリの実行中に最適化された行数を確認するには、 Google Cloud コンソールまたは API で実行の統計情報を表示します。

コンソール

最適化された行数と、最適化ステータスに関するシステム メッセージを表示するには、次の操作を行います。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. ナビゲーション メニューで [ジョブ エクスプローラ] をクリックします。

  3. ジョブ ID をクリックして、[ジョブの詳細] ペインを表示します。

  4. [ジョブ情報] タブをクリックし、[生成 AI 関数の最適化] フィールドで指標とステータスを確認します。

    [ジョブ情報] タブの [生成 AI 関数の最適化] フィールド

API

ジョブ メタデータの GenAIFunctionStats オブジェクトの FunctionGenAiCostOptimizationStats を確認します。このオブジェクトには、最適化されたワークフローによって推論された行数と、最適化の状態に関する分析情報を提供するシステム生成メッセージが含まれます。

トラブルシューティング

以降のセクションでは、最適化モードの使用に関する一般的な問題を診断して解決する方法について説明します。

データサイズが小さすぎる

問題: モデルのトレーニングに十分なデータがない。次のエラー メッセージが表示されることがあります。 Fail to apply cost optimizations because the number of rows to process is too small.

解決策: 入力のサイズを、エラー メッセージに表示される行数以上に増やし、すべての行に対して有効なエンベディングが適切に生成されていることを確認します。

一部のクラスにサンプルがほとんどまたはまったくない

問題: サンプリング フェーズで特定のカテゴリまたはケースのサンプル数が不足しているため、モデルのトレーニングが妨げられます。

  • AI.CLASSIFY 関数の場合、エラー メッセージ Failed to apply cost optimizations because the random training sample did not contain enough examples of all categories. が表示されることがあります。
  • AI.IF 関数の場合、エラー メッセージ Failed to apply cost optimizations because the random training sample did not include enough examples of both true/false cases. が表示されることがあります。

解決策:

  • AI.CLASSIFY 用:
    • AI.CLASSIFY 関数呼び出しから、まれなカテゴリまたは空のカテゴリを削除します。
    • まれなカテゴリをより広範なカテゴリにグループ化して、サンプルサイズを増やします。OTHER カテゴリを使用すると、より具体的なカテゴリに該当しないアイテムをグループ化できます。ただし、カテゴリのリストがすでに完成している場合は、OTHER を追加しないでください。この用語は曖昧で、混乱を招く可能性があります。
  • AI.IF の場合: true と false の両方のケースが入力行に適切に表示されるように、プロンプトのフィルタ条件を更新します。ほとんどすべての行に一致する条件、またはほとんど一致しない条件が、このエラーの原因となる可能性があります。

エンベディングのディメンションが一致していません

問題: 行間でエンベディング ディメンションに不整合がある。「Failed to apply cost optimizations because the embeddings have inconsistent dimensions.」というエラー メッセージが表示されることがあります。

解決策: すべてのエンベディングが同じモデルによって生成され、同じエンベディング ベクトル長であることを確認します。次のような SQL クエリを使用して、列内のエンベディングの長さが同じであることを確認できます。

SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;

プロンプトの複雑さが高すぎる

問題: 抽出されたモデルが高い精度しきい値を達成できない。以下のエラー メッセージのいずれかが表示される場合があります。

  • Fail to apply cost optimizations because the distilled model does not approximate LLM behavior well enough for some categories.
  • Fail to apply cost optimization because the prompt complexity is too high.

解決策:

  • エラー メッセージに F1 スコアが低いカテゴリが一覧表示されている場合は、まずそれらのカテゴリに焦点を当てます。名前と説明を調整して、他のカテゴリと明確に区別できるようにします。

  • パーティションを形成する一連のカテゴリを使用します。カテゴリの重複を最小限に抑え、考えられるすべての入力をカバーするようにします。

    • 入力が複数のカテゴリに同時に属する可能性がある、重複するカテゴリは避けてください。たとえば、['terrible', 'bad', 'okay', 'good', 'excellent'] などのカテゴリは避けてください。
    • どのカテゴリにも該当しない空白期間が生じないようにしてください。たとえば、カテゴリ ['bad', 'average'] のリストには、称賛を表すレビューは含まれていません。
    • カテゴリの説明を指定して、カテゴリ間のあいまいさを解決するように LLM をガイドします。次に例を示します。

      AI.CLASSIFY(
        review,
        categories => [
          ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'),
          ('bad', 'Review where customer was not happy but suggested improvements to the product'),
          ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'),
          ('good', 'Review where customers were happy using this product but had minor critiques'),
          ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')],
        embeddings => review_embeddings)
      
  • text-embedding-005 や gemini-embedding-2 などのより高度なエンベディング モデルを試す。

  • デバッグに関するサポートが必要な場合は、bqml-feedback@google.com までお問い合わせください。

LLM によって処理された行数が想定外

問題: クエリ実行統計によると、抽出モデルではなくリモート LLM によって処理された行数が予想外に多い。これは、次のいずれかの理由による可能性があります。

  • 抽出されたモデルは正常にトレーニングされましたが、一部の行にエンベディングがありませんでした。これらの行はリモート LLM によって処理されます。
  • 抽出されたモデルを各行に適用できず、一貫した品質を維持するためにリモート LLM にフォールバックする必要がありました。

解決策: エンベディングが適切に生成され、データのすべての行で有効であることを確認します。問題が解決しない場合は、bqml-feedback@google.com までお問い合わせください。

自律型エンベディング列が検出されない

問題: BigQuery が自律型エンベディング列を検出できない。これは、スクリプトで一時テーブルが使用され、元のテーブルへの参照が失われた場合に発生することがあります。

解決策: embeddings パラメータを使用して、自律型エンベディング列(embeddings => content_embedding.result など)を明示的に渡します。これにより、費用の最適化がトリガーされます。

次のステップ