追蹤第三方模型詞元用量

您可以使用 Cloud Logging 和 Observability Analytics,依模型、日期和使用者,計算 AI 開發人員工具中第三方模型的詞元消耗量,例如 Anthropic Claude Opus 5.5 和 Anthropic Claude Sonnet 5.5。

快速入門導覽課程

如果專案的 _Default 記錄檔 bucket 已升級為 Observability Analytics,請在「Logging」>「Observability Analytics」中執行下列查詢 (將 [PROJECT_ID] 替換為 Google Cloud 專案 ID),取得第三方 Anthropic 模型 30 天內的權杖用量:

SELECT
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
  IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  model
ORDER BY
  total_tokens DESC

事前準備

執行教學課程步驟前,請確認專案符合下列規定:

  • 中繼資料記錄功能已啟用。AI 開發人員工具管理員控制項必須啟用「Metadata logging」(中繼資料記錄),inference_response 記錄才會包含 jsonPayload.metadata 權杖區塊。
  • 您至少具備記錄檢視器角色 (roles/logging.viewer)。標準 roles/logging.viewer 角色會授予 SQL 存取權,可存取本指南中使用的 _Default._Default 記錄檢視表。如要查詢 _Default._AllLogs 檢視表,必須具備 roles/logging.privateLogViewer 或 roles/logging.viewAccessor。
  • _Default 記錄檔 bucket 已升級,可使用 Observability Analytics。
    1. 在 Google Cloud 控制台中,依序前往「Logging」>「Logs Storage」,找到 _Default bucket,然後查看「Observability Analytics」欄。
    2. 如果尚未啟用,請依序點選 「More」(更多) >「Upgrade to use Observability Analytics」(升級以使用 Observability Analytics)。升級會直接修改 _Default,且無法復原。
    3. 允許初始傳播:升級 bucket 後,Cloud Logging 需要 30 到 60 分鐘才能重新整理新記錄項目的轉送快取,並需要數小時才能補充歷來記錄 (補充作業會在升級完成 1 小時後開始)。

記錄檔記錄的結構

每次推論呼叫都會向 businessaicode.googleapis.com%2Finference_response 記錄發出單一 InferenceResponseLog 項目。模型身分會記錄在 labels,權杖數量則記錄在 jsonPayload.metadata:

{
  "logName": "projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response",
  "timestamp": "2026-10-07T17:23:03.495323480Z",
  "labels": {
    "model": "claude-sonnet-5-5",
    "model_provider": "Anthropic",
    "client_name": "antigravity_cli",
    "user_id": "user:user@example.com",
    "trajectory_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d",
    "request_id": "25cd0b58-58ea-4beb-b2d7-42e0d3fdd96d-19"
  },
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.businessaicode.logging.v1.InferenceResponseLog",
    "metadata": {
      "promptTokenCount": "70825",
      "cachedContentTokenCount": "69079",
      "candidatesTokenCount": "14215",
      "totalTokenCount": "85040"
    }
  }
}

欄位參考資料和計算規則

LogEntry 欄位 (Logs Explorer 和記錄指標) SQL 運算式 (Observability Analytics) 說明
labels.model JSON_VALUE(labels.model) 模型 ID (例如 Anthropic Claude Sonnet 5.5 的 claude-sonnet-5-5,或 Anthropic Claude Opus 5.5 的 claude-opus-5-5)。
labels.model_provider JSON_VALUE(labels.model_provider) 供應商名稱 (例如 Anthropic 或 Google)。
labels.user_id JSON_VALUE(labels.user_id) 已驗證的主體 (例如 user:user@example.com)。
labels.trajectory_id JSON_VALUE(labels.trajectory_id) 對話或代理軌跡 ID。一個使用者回合通常會在單一 trajectory_id 下,涵蓋多個 request_id 呼叫。
jsonPayload.metadata.promptTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64) 呼叫的輸入詞元總數 (包含快取詞元)。
jsonPayload.metadata.cachedContentTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64) promptTokenCount 的部分由提示快取提供。如果為零,則會省略。請勿新增至 promptTokenCount 或 totalTokenCount。
jsonPayload.metadata.candidatesTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64) 模型生成的輸出詞元。
jsonPayload.metadata.thoughtsTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64) 推論詞元 (如適用)。Anthropic 模型會省略這項設定。
jsonPayload.metadata.totalTokenCount SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64) 呼叫的權威總數。等於 promptTokenCount + candidatesTokenCount (如有,則加上 thoughtsTokenCount)。

步驟 1:在 Logs Explorer 中驗證傳入的記錄

執行 SQL 查詢前,請確認含有權杖中繼資料的 inference_response 記錄已傳入專案:

  1. 在 Google Cloud 控制台中,依序開啟「Logging」>「Logs Explorer」。
  2. 將下列查詢貼到查詢編輯器中,並將 [PROJECT_ID] 替換為您的專案 ID:

    logName="projects/[PROJECT_ID]/logs/businessaicode.googleapis.com%2Finference_response"
    labels.model_provider="Anthropic"
    
  3. 點選「執行查詢」。

  4. 在「Log fields」(記錄欄位) 窗格中,按一下「model」(模型),查看 Anthropic 模型的請求分布情形。這個檢視畫面會計算要求數,而非權杖數。

步驟 2:在 Observability Analytics 中依模型加總詞元

  1. 在 Google Cloud 控制台,依序開啟「Logging」>「Observability Analytics」。
  2. 將「日期範圍選取器」設為「過去 30 天」 (日期範圍選取器會限制查詢結果,以及 SQL WHERE 子句)。
  3. 貼上並執行下列查詢,將 [PROJECT_ID] 替換為您的專案 ID:

    SELECT
      JSON_VALUE(labels.model) AS model,
      COUNT(*) AS requests,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.promptTokenCount) AS INT64)) AS input_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.candidatesTokenCount) AS INT64)) AS output_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.cachedContentTokenCount) AS INT64)), 0) AS cached_tokens,
      IFNULL(SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.thoughtsTokenCount) AS INT64)), 0) AS thoughts_tokens,
      SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
    FROM
      `[PROJECT_ID].global._Default._Default`
    WHERE
      log_id = "businessaicode.googleapis.com/inference_response"
      AND JSON_VALUE(labels.model_provider) = "Anthropic"
      AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
    GROUP BY
      model
    ORDER BY
      total_tokens DESC
    

步驟 3:常見 SQL 方案

在「Logging」>「Observability Analytics」中,使用下列 SQL 查詢分析每日權杖趨勢和每位使用者的權杖歸因。

各模型的每日詞元趨勢

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  day, model
ORDER BY
  day DESC, total_tokens DESC

依使用者和模型歸因

SELECT
  JSON_VALUE(labels.user_id) AS user_id,
  JSON_VALUE(labels.model) AS model,
  COUNT(*) AS requests,
  SUM(SAFE_CAST(JSON_VALUE(json_payload.metadata.totalTokenCount) AS INT64)) AS total_tokens
FROM
  `[PROJECT_ID].global._Default._Default`
WHERE
  log_id = "businessaicode.googleapis.com/inference_response"
  AND JSON_VALUE(labels.model_provider) = "Anthropic"
  AND JSON_VALUE(labels.user_id) IS NOT NULL
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  user_id, model
ORDER BY
  total_tokens DESC

步驟 4:釘選至 Cloud Monitoring 資訊主頁

您可以選擇兩種資訊主頁,具體取決於您需要歷來或臨時 SQL 細目,還是輕量級連續指標:

做法 適用情境 保留超過 30 天的記錄? 是否支援user_id分組?
方法 A:從 Observability Analytics 儲存 SQL 圖表 依模型、每日和每位使用者劃分的表格和圖表,不需設定指標 受限於記錄檔 bucket 保留期限 (預設為 30 天) 是 (無基數限制)
方法 B:記錄檔分布指標 持續監控時間序列,並針對低基數標籤發出快訊 是 (儲存在 Monitoring 中) 否 (高基數會耗盡指標配額)

方法 A:直接從 Observability Analytics 儲存

  1. 在 Observability Analytics 中,執行步驟 2 的查詢,或「Daily token trend by model」(各模型的每日權杖趨勢) 查詢。
  2. 如要查看視覺化的時間序列或長條圖,請將結果窗格從「Table」(表格) 切換為「Chart」(圖表)。
  3. 在結果窗格工具列中,按一下「Save to dashboard」(儲存至資訊主頁),然後選擇現有的 Monitoring 資訊主頁或建立新的資訊主頁。

做法 B:建立記錄檔分布指標

  1. 在 Google Cloud 控制台中,依序前往「Logging」>「Log-based metrics」(記錄指標),然後點選「Create metric」(建立指標)。
  2. 選取「Distribution」(分布) 做為指標類型。
  3. 將步驟 1 的查詢貼到「Filter」(篩選器) 欄位,並將「Field name」(欄位名稱) 設為 jsonPayload.metadata.totalTokenCount。
  4. 新增兩個標籤:
    • model對應到「labels.model」
    • model_provider對應到「labels.model_provider」

後續步驟