チュートリアル:ユーザー、チーム、プロジェクトごとの財団モデル支出の追跡

このチュートリアルでは、 Unity AI Gatewayでの基礎モデル投資の要因を分析します。 管理するモデルサービスごとにユーザーごとにコストを割り当て、システムテーブルを使ってチーム、プロジェクト、ユースケースごとに支出を追跡するためのタグを追加します。

Prerequisites

Note

このチュートリアルでのドル見積もりは リスト価格に基づいています。 交渉による割引や請求額控除は除外されています。 帰属やトレンド分析に使い、請求書の照合に活用しましょう。

ステップ1:どのユーザーが支出を主導しているか確認

Tip

Genie Code (エージェント モード) でこれを行うことができます。 次のプロンプトの例を試してください。

Query system.billing.usage for MODEL_SERVING records from the past 30 days where usage_metadata.ai_gateway.endpoint_name is set. Convert DBUs to list-price USD using system.billing.list_prices at the price effective for each record, break down by model service, destination model, and requesting user, and sort by cost.

AI Gatewayにアクセスし>Govern > Usage Dashboard>コスト分析)にアクセスしてください。これはDatabricks提供または外部プロバイダーモデル、エンドポイント、ユーザーごとに支出を分解し、SQLを書かずに分析できます。 コスト内訳の「コスト別ユーザー(USD)」チャートは、上位の支出者をランキングしています。

あるいは、システムテーブルを直接クエリして、誰が最も多く、どこで消費しているかを調べる方法もあります。 クエリするテーブルはモデルタイプによって異なります:

Databricks提供モデル

system.billing.usage をクエリし、system.billing.list_prices を結合して、DBU 使用量をドルに換算します。 identity_metadata.run_byフィールドは各リクエストを発行したプリンシパルを示します:

SELECT
 u.usage_metadata.ai_gateway.endpoint_name AS model_service_name,
 u.usage_metadata.ai_gateway.destination_model AS destination_model,
 u.identity_metadata.run_by AS run_by,
 SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
FROM system.billing.usage u
JOIN system.billing.list_prices lp
 ON  u.sku_name  = lp.sku_name
 AND u.cloud     = lp.cloud
 AND u.usage_unit = lp.usage_unit
 AND u.usage_end_time >= lp.price_start_time
 AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
WHERE u.billing_origin_product = 'MODEL_SERVING'
 AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
 AND u.identity_metadata.run_by IS NOT NULL
 AND u.usage_unit = 'DBU'
 AND lp.currency_code = 'USD'
 AND u.usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY model_service_name, destination_model, run_by
ORDER BY list_cost_usd DESC;

外部モデル

モデルプロバイダーサービスを通じて外部プロバイダーにルーティングされるリクエストについては、トークン使用料とプロバイダーの公表価格をAzure Databrickssystem.ai_gateway.external_model_spendに記録したUSD単位のコストを推定します。 このクエリは、Azure Databricksが提供するモデルプロバイダーサービスのクエリと同じ内訳を返します。

SELECT
  usage_metadata.endpoint_name AS model_provider_service_name,
  identity_metadata.run_by AS run_by,
  SUM(usage_quantity) AS estimated_provider_cost_usd
FROM system.ai_gateway.external_model_spend
WHERE identity_metadata.run_by IS NOT NULL
  AND usage_start_time >= current_timestamp() - INTERVAL 30 DAYS
GROUP BY run_by, model_provider_service_name
ORDER BY estimated_provider_cost_usd DESC;

ステップ2:チームやプロジェクトごとに使用量と支出の追跡を設定する

ユーザー別支出は 誰が誰かを教えてくれますが、 どのチームやプロジェクトかはわかりません。 トークン使用をチームやプロジェクトに割り当てるには、モデルサービスがチームやプロジェクトにどのようにマッピングされているかに基づいてトラフィックにタグ付けしてください。

  • サービス(エンドポイント)タグ:各チームやプロジェクトが独自のモデルサービスを持つ場合。 タグはそのモデルサービスを経由するすべてのリクエストに適用されるので、一度だけ設定します。
  • リクエストタグ:多くのチームやプロジェクトが同じモデルサービスを共有している場合。 呼び出し元はリクエストごとにタグを設定するので、共有サービス 内で の使用状況を割り当てます。

サービス タグ

モデルサービスに teamproject などのタグを追加します。 このルートを経由するすべてのリクエストはタグを継承します。

  1. ワークスペースUIで AI Gateway にアクセスし、モデルサービスを開きます。
  2. モデルサービス 概要 ページの タグ セクションの下に、 team = ml-platformのようなタグを追加します。

サービスタグはendpoint_tagsではsystem.ai_gateway.usageフィールドに現れ、custom_tagsではsystem.billing.usageフィールドに伝播します。 モデルサービスの作成および設定の詳細については、「 モデルAPIの作成および管理(モデルサービス)」をご覧ください。

リクエスト タグ

project HTTPヘッダー(文字列キーを文字列値にマッピングするJSONオブジェクト)で、個別リクエストに「Databricks-Ai-Gateway-Request-Tags」のようなタグを付けます。

Databricks-Ai-Gateway-Request-Tags: {"project": "chatbot", "team": "ml-platform"}

リクエストタグはrequest_tagssystem.ai_gateway.usageフィールドに表示されます。 OpenAI SDK、Anthropic SDK、REST APIでヘッダーを設定する例については、「利用状況追跡のためのタグリクエスト」を参照してください。

Note

どのタグをコスト帰属にするかはモデルによって異なります:

  • Azure Databricks 提供モデル: サービス タグ を使用します。 サービスタグのみが system.billing.usageに伝播します。
  • 外部プロバイダーモデル:サービスタグまたはリクエストタグを使用します。 両方とも system.ai_gateway.external_model_spendに伝播し、外部モデルの支出推定値を捉えます。

ステップ3:チームまたはプロジェクトごとの利用状況を分析する

Tip

Genie Code (エージェント モード) でこれを行うことができます。 次のプロンプトの例を試してください。

Query system.ai_gateway.usage for the past 30 days to show request count and total tokens by the 'team' service tag in endpoint_tags, model service, and destination model. Sort by total tokens, highest first.

タグが設定されると、system.ai_gateway.usageで使用を集約し、Azure Databricks提供および外部プロバイダーモデルにルーティングされるすべてのリクエストのリクエストおよびトークンメトリクスを捉えます。 サービスタグは endpoint_tags['team'] ごとにグループ化し、リクエストタグは request_tags['project'] ごとに分けられます。

サービス タグ

SELECT
  endpoint_tags['team'] AS team,
  endpoint_name,
  destination_model,
  COUNT(*) AS request_count,
  SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE endpoint_tags['team'] IS NOT NULL
GROUP BY endpoint_tags['team'], endpoint_name, destination_model
ORDER BY total_tokens DESC;

リクエスト タグ

SELECT
  request_tags['project'] AS project,
  endpoint_name,
  destination_model,
  COUNT(*) AS request_count,
  SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE request_tags['project'] IS NOT NULL
GROUP BY request_tags['project'], endpoint_name, destination_model
ORDER BY total_tokens DESC;

SQLなしでいずれかの内訳を探すには、 コスト分析ページのタグフィルターを使ってください。

ステップ4:チームやプロジェクトごとの支出を分析する

Tip

Genie Code (エージェント モード) でこれを行うことができます。 次のプロンプトの例を試してください。

Query system.billing.usage for MODEL_SERVING records from the past 30 days where usage_metadata.ai_gateway.endpoint_name is set. Convert DBUs to list-price USD using system.billing.list_prices at the price effective for each record, group by the 'team' service tag in custom_tags, and sort by cost.

タグを設定して、USDで支出をチームやプロジェクトに割り当てます。 SQLを書かずにタグごとに支出をグループ化するには、 AI Gateway > Govern > Usage Dashboard >Cost Analysis )にアクセスし、「 Tag-based Cost Analysis 」セクションをご利用ください。 エンドポイントタグまたはリクエストタグでフィルタリングすると、 エンドポイントタググループ別 コストおよび リクエストタググループ別推定コストが表示されます。

SQLで属性支出を計算するには、クエリするテーブルの種類がモデルタイプによって異なります:

Databricks提供モデル

サービスタグはcustom_tagssystem.billing.usageフィールドに伝播するため、Step 1でユーザーランク付けと同じ方法でUSDでリストプライスの支出をチームに割り当てることができます。 DBU利用をドルに換算するために system.billing.list_prices に参加してください:

SELECT
  u.custom_tags['team'] AS team,
  SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
FROM system.billing.usage u
JOIN system.billing.list_prices lp
  ON  u.sku_name   = lp.sku_name
  AND u.cloud      = lp.cloud
  AND u.usage_unit = lp.usage_unit
  AND u.usage_end_time >= lp.price_start_time
  AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
WHERE u.billing_origin_product = 'MODEL_SERVING'
  AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
  AND u.custom_tags['team'] IS NOT NULL
  AND u.usage_unit = 'DBU'
  AND lp.currency_code = 'USD'
  AND u.usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY team
ORDER BY list_cost_usd DESC;

外部モデル

外部モデルの場合、system.ai_gateway.external_model_spendすでにUSDで推定コストを記録し、サービスタグとリクエストタグの両方をcustom_tags含んでいるため、プロジェクトやチームごとにサービス間で支出を付与するために、custom_tags.request_tagsごとにグループ化できます。

SELECT
  custom_tags.request_tags['team'] AS team,
  SUM(usage_quantity) AS estimated_provider_cost_usd
FROM system.ai_gateway.external_model_spend
WHERE custom_tags.request_tags['team'] IS NOT NULL
  AND usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY team
ORDER BY estimated_provider_cost_usd DESC;

ステップ5:チームまたはプロジェクトごとのトークンごとのコストを分析する

Tip

Genie Code (エージェント モード) でこれを行うことができます。 次のプロンプトの例を試してください。

Query system.billing.usage and system.ai_gateway.usage for the past 30 days to show list-price USD per million tokens by model service, destination model, and the 'team' service tag. Convert DBUs to dollars using system.billing.list_prices at the price effective for each record, and join the two tables on usage date.

総支出は予算の使い方を示すもので、公正な料金を支払っているかどうかはわかりません。 推論支出を100万トークンあたりのコストで追跡することで、宛先モデルを比較したり、ルーティング変更後の回帰を検出したり、より安価なモデルにトラフィックを移す正当化が可能になります。 コストテーブルを、モデルサービス、対象モデル、チームで system.ai_gateway.usage に結合してください。 両方のタブは team サービスタグでグループ化されるため、結果はステップ3に一致します:

Databricks提供モデル

定価ベースのコストとトークンを対象期間全体で集計し、その後、モデルサービス、対象モデル、チームで結合します。 DBU利用をドルに換算するために system.billing.list_prices に参加してください:

WITH cost AS (
  SELECT
    u.usage_metadata.ai_gateway.endpoint_name AS endpoint_name,
    u.usage_metadata.ai_gateway.destination_model AS destination_model,
    u.custom_tags['team'] AS team,
    SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
  FROM system.billing.usage u
  JOIN system.billing.list_prices lp
    ON  u.sku_name   = lp.sku_name
    AND u.cloud      = lp.cloud
    AND u.usage_unit = lp.usage_unit
    AND u.usage_end_time >= lp.price_start_time
    AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
  WHERE u.billing_origin_product = 'MODEL_SERVING'
    AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
    AND u.custom_tags['team'] IS NOT NULL
    AND u.usage_unit = 'DBU'
    AND lp.currency_code = 'USD'
    AND u.usage_date >= current_date() - INTERVAL 30 DAYS
  GROUP BY ALL
),
tokens AS (
  SELECT
    endpoint_name,
    destination_model,
    endpoint_tags['team'] AS team,
    SUM(total_tokens) AS total_tokens
  FROM system.ai_gateway.usage
  WHERE endpoint_tags['team'] IS NOT NULL
    AND endpoint_name IS NOT NULL
    AND event_time >= current_timestamp() - INTERVAL 30 DAYS
  GROUP BY ALL
)
SELECT
  c.endpoint_name,
  c.destination_model,
  c.team,
  c.list_cost_usd,
  t.total_tokens,
  1000000 * c.list_cost_usd / NULLIF(t.total_tokens, 0) AS list_cost_usd_per_1m_tokens
FROM cost c
JOIN tokens t
  ON  c.endpoint_name     = t.endpoint_name
  AND c.destination_model = t.destination_model
  AND c.team              = t.team
ORDER BY list_cost_usd_per_1m_tokens DESC;

外部モデル

支出とトークンを全期間にわたって集計し、モデルプロバイダーサービス、デスティネーションモデル、チームに参加します。 両方のテーブルは同じリクエストをカバーしているため、期間レベルの合計は結合に時間キーを必要としません。

WITH spend AS (
  SELECT
    usage_metadata.endpoint_name AS endpoint_name,
    usage_metadata.model AS destination_model,
    custom_tags.endpoint_tags['team'] AS team,
    SUM(usage_quantity) AS estimated_provider_cost_usd
  FROM system.ai_gateway.external_model_spend
  WHERE custom_tags.endpoint_tags['team'] IS NOT NULL
    AND usage_date >= current_date() - INTERVAL 30 DAYS
  GROUP BY ALL
),
tokens AS (
  SELECT
    endpoint_name,
    destination_model,
    endpoint_tags['team'] AS team,
    SUM(total_tokens) AS total_tokens
  FROM system.ai_gateway.usage
  WHERE endpoint_tags['team'] IS NOT NULL
    AND destination_model IS NOT NULL
    AND event_time >= current_timestamp() - INTERVAL 30 DAYS
  GROUP BY ALL
)
SELECT
  s.endpoint_name,
  s.destination_model,
  s.team,
  s.estimated_provider_cost_usd,
  t.total_tokens,
  1000000 * s.estimated_provider_cost_usd / NULLIF(t.total_tokens, 0) AS estimated_cost_usd_per_1m_tokens
FROM spend s
JOIN tokens t
  ON  s.endpoint_name     = t.endpoint_name
  AND s.destination_model = t.destination_model
  AND s.team              = t.team
ORDER BY estimated_cost_usd_per_1m_tokens DESC;

チーム帰属にリクエストタグを使う場合は、トークンロールアップでcustom_tags.endpoint_tags['team']custom_tags.request_tags['team']に、endpoint_tags['team']に置き換えてrequest_tags['team']してください。

Note

Unity AI Gatewayは、ストリーミングや埋め込みなしの応答で1 MiBを超えるトークン使用を記録しないため、そのような応答が多い場所ではトークンあたりのコストが高くなることがあります。 無関係な業務量間ではなく、仕事量内の料金を比較しましょう。

次のステップ