通过 token 配额控制费用

本文档介绍了如何定义和管理生成式 AI 函数使用的输入和输出 token 数量的每日限额。

BigQuery 生成式 AI 函数使用大语言模型 (LLM) 在 SQL 查询中执行高级分析。由于 LLM 使用量通常根据处理的 token 数量计费,因此 BigQuery 提供了 token 配额,以帮助您管理和控制与使用这些函数相关的费用。

这些 token 配额适用于专为使用 Gemini LLM 的生成式 AI 推理任务而设计的 BigQuery SQL 函数,例如 AI.CLASSIFY 和 AI.GENERATE_TEXT 函数。词元配额不适用于嵌入生成和语义搜索函数(例如 AI.EMBED),这些函数具有不同的结算结构。

配额详细信息

BigQuery 根据 LLM 词元用量提供以下每日配额。对于使用 Gemini 模型的 BigQuery 生成式 AI 函数,其 Vertex AI 结算费用与 token 用量直接相关。这些配额会在全球所有区域进行跟踪。每日配额将在太平洋时间午夜重置。

这些 token 配额用于控制 LLM 为生成式 AI 函数处理的输入和输出 token 数量:

  • 输入 token:发送给模型进行处理的 token。这包括提示文本中的 token 以及作为输入提供给模型的任何其他数据。
  • 输出 token:模型在回答中生成的 token。这包括生成的文本中的 token(候选 token)以及在内部推理步骤中生成的 token(思考 token)。

配额 指标和配额 ID 默认 备注
每天的 AI 输入 token 数 指标: bigquery.googleapis.com/quota/query/ai_input_tokens

配额 ID: GenAiInputTokensPerDay
200,000,000,000 LLM 使用的输入 token。适用于每个项目每天。
每位用户每天的 AI 输入 token 数 指标: bigquery.googleapis.com/quota/query/ai_input_tokens

配额 ID: GenAiInputTokensPerUserPerDay
150,000,000,000 LLM 使用的输入 token。适用于每个项目中的每位用户,每天重置。
每天的 AI 输出 token 数 指标: bigquery.googleapis.com/quota/query/ai_output_tokens

配额 ID: GenAiOutputTokensPerDay
20,000,000,000 LLM 使用的输出和思考 token。适用于每个项目每天。
每位用户每天的 AI 输出 token 数 指标: bigquery.googleapis.com/quota/query/ai_output_tokens

配额 ID: GenAiOutputTokensPerUserPerDay
15,000,000,000 LLM 使用的输出和思考 token。适用于每个项目中的每位用户,每天重置。

这些配额以百万个 token 为增量进行跟踪。虽然您可以设置精确的限制,但由于 token 报告和汇总的性质,小于几百万个 token 的值可能无法准确反映。

缓存的 token 不计入配额。

准备工作

如果您使用 Google Cloud CLI、Cloud Quotas API 客户端库或 Terraform 以编程方式管理令牌配额,请在 Google Cloud项目中启用 Cloud Quotas API (cloudquotas.googleapis.com):

gcloud services enable cloudquotas.googleapis.com --project=PROJECT_ID

将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

所需的角色

如需获得查看和更新 token 配额所需的权限,请让管理员向您授予项目的 Cloud Quotas Admin (roles/cloudquotas.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含查看和更新令牌配额所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

您需要具备以下权限才能查看和更新 token 配额:

  • cloudquotas.quotas.get
  • cloudquotas.quotas.update

您也可以使用自定义角色或其他预定义角色来获取这些权限。

管理配额

根据您的资源用量,您可能需要查看或上下调整 token 配额值:

  • 如果您的工作负载需要的容量超过默认限制,您可以申请增加配额。
  • 如果您想对用量设置更严格的限制以防止预算超支,可以创建配额替换值来限制用量。

如需查看和更新每日 token 配额,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往 IAM 和管理 > 配额和系统限制页面。

    进入“配额和系统限制”

  2. 输入 Service: BigQuery API 以过滤配额。

  3. 从配额列表中搜索特定配额,例如每天的 AI 输入 token 数 (GenAiInputTokensPerDay),或对名称列进行排序,将 AI token 配额置于列表顶部。

  4. 点击 more_vert 更多操作 > 修改配额。

  5. 如需增加或减少配额,请在配额更改窗格的新值字段中输入新值,然后点击完成。降低配额会立即生效,无需审批。

  6. 点击提交请求。

gcloud

使用 gcloud CLI 管理令牌配额时,请将 bigquery.googleapis.com 指定为服务名称,并使用以下区分大小写的配额 ID:

  • 每天的 AI 输入 token 数:GenAiInputTokensPerDay
  • 每位用户每天的 AI 输入 token 数:GenAiInputTokensPerUserPerDay
  • 每天的 AI 输出 token 数:GenAiOutputTokensPerDay
  • 每位用户每天的 AI 输出 token 数:GenAiOutputTokensPerUserPerDay
  1. 可选:如需列出 BigQuery 生成式 AI 词元配额及其当前值,请使用 gcloud quotas info list:

    gcloud quotas info list \
        --service=bigquery.googleapis.com \
        --project=PROJECT_ID \
        --filter="quotaId:GenAi*"
    
  2. 如需为每日 token 限额创建或更新配额偏好设置,请使用 gcloud quotas preferences update。以下示例会检查每个配额是否已存在配额偏好设置(例如,之前是否在Google Cloud 控制台中修改过),并更新或创建偏好设置:

    PROJECT_ID="PROJECT_ID"
    
    for ITEM in \
      "GenAiInputTokensPerDay:INPUT_TOKEN_LIMIT" \
      "GenAiOutputTokensPerDay:OUTPUT_TOKEN_LIMIT"; do
      QUOTA_ID="${ITEM%:*}"
      NEW_LIMIT="${ITEM#*:}"
    
      PREF_ID=$(gcloud quotas preferences list \
        --project="${PROJECT_ID}" \
        --filter="quotaId:${QUOTA_ID}" \
        --format="value(name.basename())")
      PREF_ID="${PREF_ID:-custom-${QUOTA_ID}}"
    
      gcloud quotas preferences update "${PREF_ID}" \
        --project="${PROJECT_ID}" \
        --service=bigquery.googleapis.com \
        --quota-id="${QUOTA_ID}" \
        --preferred-value="${NEW_LIMIT}" \
        --allow-high-percentage-quota-decrease \
        --allow-missing
    done
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • INPUT_TOKEN_LIMIT:目标每日输入 token 限制(例如 754000000)。
    • OUTPUT_TOKEN_LIMIT:您的目标每日输出 token 限制(例如 8000000)。

    您还可以将以下可选标志与 gcloud quotas preferences update 搭配使用:

    • --allow-quota-decrease-below-usage:允许将配额限制降低到低于当天的当前用量。
    • --email:指定联系邮箱,在请求将配额提高到默认上限以上时,必须提供此邮箱。
    • --justification:提供配额调整的原因。
  3. 如需验证配额偏好设置的状态,请使用 gcloud quotas preferences list:

    gcloud quotas preferences list \
        --project=PROJECT_ID \
        --filter="quotaId:GenAiInputTokensPerDay OR quotaId:GenAiOutputTokensPerDay"
    

    当 reconciling 为 false 时,系统会主动强制执行 grantedValue 中的值。

Python

使用适用于 Python 的 Cloud Quotas 客户端库管理 token 配额时,请将 bigquery.googleapis.com 指定为服务名称,并使用以下区分大小写的配额 ID:

  • 每天的 AI 输入 token 数:GenAiInputTokensPerDay
  • 每位用户每天的 AI 输入 token 数:GenAiInputTokensPerUserPerDay
  • 每天的 AI 输出 token 数:GenAiOutputTokensPerDay
  • 每位用户每天的 AI 输出 token 数:GenAiOutputTokensPerUserPerDay
  1. 安装 Python 版 Cloud Quotas 客户端库:

    pip install --user google-cloud-quotas
    
  2. 如需检查现有配额偏好设置资源并创建或更新每日 token 限制,请运行以下 Python 脚本:

    from google.cloud import cloudquotas_v1
    
    PROJECT_ID = "PROJECT_ID"
    QUOTA_LIMITS = {
        "GenAiInputTokensPerDay": INPUT_TOKEN_LIMIT,
        "GenAiOutputTokensPerDay": OUTPUT_TOKEN_LIMIT,
    }
    
    # Initialize the client with quota_project_id (required by the Cloud Quotas API).
    client = cloudquotas_v1.CloudQuotasClient(
        client_options={"quota_project_id": PROJECT_ID}
    )
    parent = f"projects/{PROJECT_ID}/locations/global"
    
    for quota_id, new_limit in QUOTA_LIMITS.items():
        # Check for an existing preference ID, or fall back to a default name.
        list_request = cloudquotas_v1.ListQuotaPreferencesRequest(
            parent=parent,
            filter=f"quotaId:{quota_id}",
        )
        prefs = list(client.list_quota_preferences(request=list_request))
        pref_name = (
            prefs[0].name
            if prefs
            else f"{parent}/quotaPreferences/custom-{quota_id}"
        )
    
        # Update the existing preference or create it if missing (allow_missing=True).
        update_request = cloudquotas_v1.UpdateQuotaPreferenceRequest(
            quota_preference=cloudquotas_v1.QuotaPreference(
                name=pref_name,
                service="bigquery.googleapis.com",
                quota_id=quota_id,
                quota_config=cloudquotas_v1.QuotaConfig(preferred_value=new_limit),
            ),
            allow_missing=True,
            ignore_safety_checks=[
                cloudquotas_v1.QuotaSafetyCheck.QUOTA_DECREASE_PERCENTAGE_TOO_HIGH
            ],
        )
        response = client.update_quota_preference(request=update_request)
        print(f"Quota ID: {quota_id}")
        print(f"Preference Name: {response.name}")
        print(f"Preferred Value: {response.quota_config.preferred_value}")
        print(f"Granted Value: {response.quota_config.granted_value}")
        print(f"Reconciling: {response.reconciling}\n")
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • INPUT_TOKEN_LIMIT:目标每日输入 token 限制,以整数表示(例如 754000000)。
    • OUTPUT_TOKEN_LIMIT:目标每日输出 token 限制,以整数表示(例如 8000000)。

Terraform

使用 Terraform 管理令牌配额时,请将 bigquery.googleapis.com 指定为服务名称,并使用以下区分大小写的配额 ID:

  • 每天的 AI 输入 token 数:GenAiInputTokensPerDay
  • 每位用户每天的 AI 输入 token 数:GenAiInputTokensPerUserPerDay
  • 每天的 AI 输出 token 数:GenAiOutputTokensPerDay
  • 每位用户每天的 AI 输出 token 数:GenAiOutputTokensPerUserPerDay
  1. 检查您的项目是否已存在配额偏好设置。 Cloud Quotas 仅允许每个项目的每个配额有一个偏好设置资源。如果之前在Google Cloud 控制台或其他工具中修改过配额,则必须使用其现有的偏好设置 ID:

    gcloud quotas preferences list \
        --project=PROJECT_ID \
        --filter="quotaId:GenAiInputTokensPerDay OR quotaId:GenAiOutputTokensPerDay" \
        --format="table(quotaId, name.basename():label=PREFERENCE_ID, quotaConfig.preferredValue)"
    
  2. 如需在 Terraform 配置(例如 main.tf)中配置每日令牌限额,请使用 google_cloud_quotas_quota_preference 资源:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = ">= 5.30.0"
        }
      }
    }
    
    locals {
      project_id = "PROJECT_ID"
    
      # If you previously modified a quota in the console or another
      # tool, replace `name` with the existing PREFERENCE_ID from
      # `gcloud quotas preferences list` and uncomment the `import` block.
      bq_genai_quotas = {
        GenAiInputTokensPerDay = {
          name            = "custom-GenAiInputTokensPerDay"
          preferred_value = "INPUT_TOKEN_LIMIT" # Default: 200,000,000,000
        }
        GenAiOutputTokensPerDay = {
          name            = "custom-GenAiOutputTokensPerDay"
          preferred_value = "OUTPUT_TOKEN_LIMIT" # Default: 20,000,000,000
        }
      }
    }
    
    # If quota preferences already exist on your project, uncomment this `import`
    # block so that Terraform imports the existing preferences instead of
    # attempting to create duplicates.
    #
    # import {
    #   for_each = local.bq_genai_quotas
    #   to       = google_cloud_quotas_quota_preference.bq_genai[each.key]
    #   id       = "projects/${local.project_id}/locations/global/quotaPreferences/${each.value.name}"
    # }
    
    resource "google_cloud_quotas_quota_preference" "bq_genai" {
      for_each      = local.bq_genai_quotas
      parent        = "projects/${local.project_id}"
      name          = each.value.name
      service       = "bigquery.googleapis.com"
      quota_id      = each.key
      justification = "Managing BigQuery GenAI daily token budget"
    
      # Allows decreases greater than 10% when setting a stricter cost cap.
      ignore_safety_checks = "QUOTA_DECREASE_PERCENTAGE_TOO_HIGH"
    
      quota_config {
        preferred_value = each.value.preferred_value
      }
    }
    
    output "quota_status" {
      value = {
        for k, v in google_cloud_quotas_quota_preference.bq_genai : k => {
          preferred_value = v.quota_config[0].preferred_value
          granted_value   = v.quota_config[0].granted_value
          reconciling     = v.reconciling
        }
      }
    }
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • INPUT_TOKEN_LIMIT:目标每日输入 token 限制(例如 754000000)。
    • OUTPUT_TOKEN_LIMIT:您的目标每日输出 token 限制(例如 8000000)。
  3. 初始化并应用 Terraform 配置:

    terraform init
    terraform apply
    

监控配额

为防止意外的查询失败、检测用量高峰并管理费用,请在 Google Cloud 控制台中监控令牌配额消耗情况,具体操作如下:

  1. 在 Google Cloud 控制台中,前往 IAM 和管理 > 配额和系统限制页面。

    进入“配额和系统限制”

  2. 输入 Service: BigQuery API 以过滤配额。

  3. 查看当前用量百分比和当前用量列,了解项目在每天的 AI 输入 token 数 (GenAiInputTokensPerDay) 和每天的 AI 输出 token 数 (GenAiOutputTokensPerDay) 配额方面的每日 token 消耗量。

  4. 如需查看一段时间内的历史 token 消耗量,请在项目级 token 配额对应的行中,点击监控 显示用量图表。

    用量卡片会显示您配置的上限、当前用量百分比和峰值用量百分比,以及可选择 7 天、14 天、30 天和自定义时间范围的历史消耗量图表:

     Google Cloud 控制台中的“每天的 AI 输入 token 数”配额用量图表。

  5. 可选:设置基本的配额用量提醒,以便在 token 消耗量达到每日限额的指定百分比时,通过电子邮件、短信或 Pub/Sub 向您发送通知。

  6. 可选:在 Cloud Monitoring 中创建图表,以直观呈现 token 使用趋势并构建自定义信息中心。如需详细了解如何监控配额和配置提醒政策,请参阅设置配额提醒和监控。

如需在运行查询之前估算输入 token 用量,请使用 AI.COUNT_TOKENS 函数。您还可以在查询结果窗格的作业信息标签页中查看单个查询处理的 token 数量。

配额强制执行行为

BigQuery 会在查询执行的多个阶段监控您的 token 消耗情况:

  • 执行前检查:BigQuery 会在执行包含生成式 AI 函数的查询之前检查可用的词元配额。如果相关配额(例如项目每日输入 token 数)已用尽,则查询会被拒绝,并返回 QuotaExceeded 错误。
  • 执行期间:如果查询正在运行,并且消耗的 token 耗尽了任何已配置的配额(输入或输出,每个项目或每个用户),则该查询中的新 LLM 调用将被拒绝。
    • 依赖于 LLM 调用的任何剩余行都会遇到配额耗尽错误。
    • 如果查询在 AI.IF 等函数中使用,则其结果取决于 max_error_ratio 实参。如果错误率保持在允许的限值内,则可能会返回部分结果。否则,整个查询都会失败。
    • 在每日配额重置之前,后续尝试使用生成式 AI 函数的查询将失败,并显示 QuotaExceeded 错误。

重要注意事项

  • 全球配额:定义的配额是全球配额。系统会汇总项目运营所在的所有区域的 token 用量,从而提供统一的费用控制机制。这样可以防止因在不同区域使用而产生意外费用。
  • 预配吞吐量:如果您使用的是具有预配吞吐量的 Gemini Enterprise Agent Platform 模型,则结算不基于 token 用量。您应将这些 BigQuery 令牌配额设置为较高的值,以避免不必要地阻止查询。
  • 配额缩减安全检查:默认情况下,Cloud Quotas API 会阻止任何一次性将有效配额限制缩减超过 10% 的程序化更新。由于默认词元上限为数千亿,因此设置更严格的每日上限通常会超过 10% 的降幅,并因 QUOTA_DECREASE_PERCENTAGE_TOO_HIGH 错误而失败,除非您替换此安全检查:
    • gcloud CLI:添加 --allow-high-percentage-quota-decrease 标志。
    • Python 客户端库:传递 ignore_safety_checks=[cloudquotas_v1.QuotaSafetyCheck.QUOTA_DECREASE_PERCENTAGE_TOO_HIGH]。
    • Terraform:设置 ignore_safety_checks = "QUOTA_DECREASE_PERCENTAGE_TOO_HIGH"。

后续步骤