用 Google AI Studio 拿到 API Key,几小时内做出一个 AI 原型已经非常容易。但从“能跑”走向“有人使用、需要付费、必须稳定运行”,真正的难点往往不在模型调用代码,而在身份、容量、成本和代理行为控制。
一个泄露的 API Key 可能在两天内带来巨额账单;一次从 AI Studio 迁移到 Gemini Enterprise Agent Platform 的“快速改造”,也可能因为没人负责 IAM 而停滞数周。下面的 10 个问题,按 Onboard、Scale、Govern 三个阶段整理,帮助团队在获得真实用户之前补齐生产基础。
Onboard:第一小时把基础打好
1. 应该从 Google AI Studio 还是 Gemini Enterprise Agent Platform 开始?
两者都能访问 Gemini 模型,但定位不同。
Google AI Studio 配合 Gemini Developer API,适合验证想法:浏览器环境、API Key、免费额度和较少的云配置,让团队可以快速得到第一个可运行版本。Gemini Enterprise Agent Platform(原 Vertex AI)则提供 IAM、服务账号、区域端点、日志与监控、VPC Service Controls、合规能力以及预留容量,更适合生产环境。
对大多数创业公司来说,合理的路径不是二选一,而是按顺序使用:先在 AI Studio 验证产品,再在出现真实用户之前迁移到 Agent Platform。google-genai SDK 可以同时支持这两种模式:
from google import genai
# 原型阶段:使用 Google AI Studio API Key。
# 仅用于本地开发,不要把 Key 放进前端代码或提交到代码仓库。
prototype_client = genai.Client(api_key="YOUR_AI_STUDIO_KEY")
# 生产阶段:使用 Google Cloud ADC,不在应用代码中保存密钥。
production_client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="us-central1",
)
response = production_client.models.generate_content(
model="gemini-2.5-pro",
contents="Summarize this contract in three bullets.",
)
print(response.text)
一个实用判断标准是:当用户不再只是创始人和同事时,生产调用就应该采用企业级身份模型。
2. 怎样创建 Google Cloud 项目,而不用先成为 IAM 专家?
迁移的主要工作通常不是修改模型调用,而是建立项目、账单、服务账号、日志和权限。团队可以采用经过约束的项目模板,而不是临时在控制台里点击:生产、非生产和开发环境分开,集中管理日志和监控,并启用基础安全策略。
启用付费 API 前,要先把项目关联到 Billing Account。下面是一个可以改造的最小命令示例,运行前替换项目名和账单账号:
gcloud projects create my-startup-prod --name="My Startup (prod)"
gcloud config set project my-startup-prod
# 用 gcloud billing accounts list 查看可用的账单账号。
gcloud billing projects link my-startup-prod \
--billing-account=012345-6789AB-CDEF01
gcloud services enable \
aiplatform.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com \
secretmanager.googleapis.com
授予权限时,可以让 Gemini 帮忙生成角色建议,但要明确要求“least privilege”或“narrowest access”。默认的 Admin、Editor、Viewer 往往过于宽泛。调用模型的服务账号通常只需要类似 roles/aiplatform.user 的权限,而不是项目级管理员权限。
3. 生产代码应该用 API Key、服务账号还是用户凭证?
可以按照运行环境区分:
- 本地原型:API Key 可以接受,但必须限制使用范围并定期轮换。
- 开发者电脑上的 CLI 或交互工具:使用 OAuth 和 Application Default Credentials。
- Cloud Run、GKE、Compute Engine 或定时任务:使用绑定了最小 IAM 权限的服务账号。
目标是让应用代码完全看不到长期密钥。ADC 会从本地登录状态或云资源绑定的服务账号中获取短期凭证:
# 开发者本地验证 ADC
gcloud auth application-default login
# Cloud Run 部署时绑定运行时服务账号,不上传 JSON Key 文件。
gcloud run deploy my-agent \
--image=us-docker.pkg.dev/my-startup-prod/agents/api:v1 \
--service-account=agent-runtime@my-startup-prod.iam.gserviceaccount.com \
--region=us-central1
应用代码只需要初始化客户端:
from google import genai
client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="us-central1",
)
4. 什么时候必须从 AI Studio 的 API Key 迁移?
不要等到调用失败或账单失控才迁移。出现以下任一情况,就应当安排切换:
- API Key 离开了个人电脑,例如进入 Git 仓库、Slack、日志或移动端包。
- 团队中有多名成员需要调用模型。
- 月度 AI 支出已经达到几百美元级别。
- 产品即将接入付费客户。
切换日可以按这个清单执行:
# 检查生产代码中是否还存在硬编码 API Key。
rg -n "api_key|GEMINI_API_KEY|AIza" src/ notebooks/
# 启用 Agent Platform API,并在本地验证 ADC。
gcloud services enable aiplatform.googleapis.com
gcloud auth application-default login
python -c 'from google import genai; c=genai.Client(vertexai=True, project="my-startup-prod", location="us-central1"); print(c.models.generate_content(model="gemini-2.5-flash", contents="ping").text)'
确认 ADC 调用成功后,撤销所有曾经离开个人电脑的旧 Key,并检查构建产物、笔记本和部署配置。
Scale:获得容量,而不是被 429 追着跑
5. 为什么上线后会收到 HTTP 429?
Agent Platform 的 429 通常表示动态共享配额(Dynamic Shared Quota,DSQ)发生暂时性争用,也可能与使用全局端点时的全球流量高峰有关。新项目的共享容量通常较小,因此一次发布带来的突发流量就可能暴露问题。
两项改动通常值得优先尝试:使用区域端点,并为 429、408、5xx 添加带抖动的指数退避。google-genai SDK 可以配置重试:
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="us-central1",
http_options=types.HttpOptions(
retry_options=types.HttpRetryOptions(
attempts=5,
initial_delay=1.0,
max_delay=60.0,
exp_base=2.0,
jitter=1.0,
http_status_codes=[408, 429, 500, 502, 503, 504],
)
),
)
不要把旧版 google.api_core.retry 装饰器直接套在新的 google.genai 错误类型上。应使用当前 SDK 的重试选项,并通过 Cloud Monitoring 观察请求数、Token 吞吐、首 Token 延迟和错误类别。
DSQ 没有一个稳定的“80% 配额”可供报警。429 更多代表共享容量的瞬时竞争,而不是固定上限被精确用完。因此,容量错误告警比百分比配额告警更有意义。
6. Standard PayGo、Priority PayGo 和 Provisioned Throughput 怎么选?
三种模式对应三类工作负载:
| 模式 | 适合场景 | 主要风险 |
|---|---|---|
| Standard PayGo(DSQ) | 早期、低 QPS、流量突发的产品 | 高峰期间可能收到 429 |
| Priority PayGo | 收入关键、不能接受短时拒绝的突发请求 | 单价通常更高,且需要使用指定端点和请求头 |
| Provisioned Throughput | 基线流量稳定、规模较大的生产系统 | 使用率低时仍需付费 |
比较稳妥的演进方式是:前几周使用 Standard PayGo,测量 p50/p99 的 Token Per Minute、突发峰值以及实时与异步请求的比例;发生真实的容量问题后,只为关键流量启用 Priority PayGo;当基线流量可预测时,再用 Provisioned Throughput 覆盖稳定部分,并让峰值溢出到 PayGo。
可以这样构造 Priority PayGo 请求。具体模型、端点和请求头应以当前平台文档及项目资格为准:
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="global",
)
response = client.models.generate_content(
model="gemini-2.5-pro",
contents="Rank these support tickets by urgency: ...",
config=types.GenerateContentConfig(
http_options=types.HttpOptions(
headers={
"X-Vertex-AI-LLM-Request-Type": "shared",
"X-Vertex-AI-LLM-Shared-Request-Type": "priority",
}
)
),
)
print(response.text)
7. 哪些请求必须实时返回,哪些应该改成批处理?
很多所谓的实时功能,其实只是产品暂时把结果放在了同步请求里。可以用用户等待时间分类:一秒内必须看到结果的是实时推理;几秒内能接受加载状态的可以使用实时流式调用;允许稍后查看或通过邮件通知的,则适合 Batch API。
夜间摘要、新用户批量分类、批量翻译、Embedding 回填和评测任务,通常都可以移出交互链路。批处理使用独立队列,不占用交互式 DSQ,并且通常比按需推理便宜:
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="us-central1",
)
job = client.batches.create(
model="gemini-2.5-flash",
src="gs://my-startup-prod-batch/inputs/nightly-summaries.jsonl",
config=types.CreateBatchJobConfig(
dest="gs://my-startup-prod-batch/outputs/",
),
)
print(job.name, job.state)
Govern:让成本、密钥和 Agent 可控
8. 怎样设置真正能降低损失的预算上限?
普通预算往往只是发邮件提醒,不能自动阻止费用继续增长。可以按风险分层:使用项目级 spend cap 作为第一道限制;对于需要覆盖多个服务或暂不支持 spend cap 的场景,再使用 Billing Budget 加 Pub/Sub 触发器;同时为模型和区域设置明确的配额上限,让泄露的凭证无法无限加速消耗。
创建预算时务必限定项目,否则一个项目的异常可能触发整个 Billing Account 的保护逻辑:
gcloud billing budgets create \
--billing-account=012345-6789AB-CDEF01 \
--display-name="my-startup-prod hard stop" \
--budget-amount=2000USD \
--filter-projects=projects/my-startup-prod \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.9 \
--threshold-rule=percent=1.0,basis=current-spend \
--notifications-rule-pubsub-topic=projects/my-startup-prod/topics/budget-alerts
预算执行并非瞬时,也可能产生超过上限的实际费用。自动解绑 Billing Account 是更强硬的熔断方式,会影响项目中的所有可计费资源,因此需要充分测试恢复流程。
9. Secret 应该放在哪里?
生产环境不要把第三方 API Key 放在 .env 文件、环境变量、镜像层或代码仓库里。可以使用 Secret Manager,并只向确实需要读取它的运行时服务账号授予 roles/secretmanager.secretAccessor:
echo -n "sk_live_xxx" | gcloud secrets create stripe-live-key --data-file=-
gcloud secrets add-iam-policy-binding stripe-live-key \
--member=serviceAccount:agent-runtime@my-startup-prod.iam.gserviceaccount.com \
--role=roles/secretmanager.secretAccessor
代码在启动或需要时读取 Secret:
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
response = client.access_secret_version(
name="projects/my-startup-prod/secrets/stripe-live-key/versions/latest"
)
stripe_key = response.payload.data.decode("utf-8")
Secret 版本应当按计划轮换,也应当在怀疑泄露时立即滚动更新。若 Agent 代表用户访问 Gmail、Drive 或第三方 SaaS,不要保存长期用户 Token,应使用带刷新流程的 OAuth 2.0 短期访问令牌。
10. 怎样防止刚上线的 AI Agent 做出不该做的事?
能够调用工具、访问网络或执行代码的 Agent,需要多层防护:
- 为 Agent 使用独立服务账号,只授予所需资源和工具的最小权限。
- 生成代码必须在隔离沙箱中运行,不能直接进入应用进程或接触生产数据。
- 在模型调用前后进行提示注入、越权、敏感信息外泄和越狱检测。
- 通过日志、Security Command Center 和行为告警观察异常调用,例如突然访问陌生 API 或大量执行高权限操作。
对于数据分析类任务,可以启用服务端代码执行能力,但仍需根据数据敏感度、网络访问和执行时限配置隔离策略:
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="my-startup-prod",
location="us-central1",
)
response = client.models.generate_content(
model="gemini-2.5-pro",
contents="Compute the correlation between these two columns: ...",
config=types.GenerateContentConfig(
tools=[types.Tool(code_execution=types.ToolCodeExecution())]
),
)
print(response.text)
代码执行、工具调用和用户授权必须分别审计。模型输出不是安全边界,Agent 的每项高风险动作都应经过权限检查、参数校验和必要的人工确认。
上线前的一页检查清单
- [ ] 原型和生产项目分离,生产调用使用 ADC 和最小权限服务账号。
- [ ] 所有曾经离开个人电脑的 API Key 已撤销并完成代码、仓库和镜像扫描。
- [ ] 生产调用固定到合适的区域端点,并配置带抖动的重试。
- [ ] 实时请求、批处理请求和高优先级请求已经分流。
- [ ] 已观察 Token 吞吐、延迟、容量错误和实际成本,而不只是 HTTP 状态码。
- [ ] 预算、项目配额和必要的熔断恢复流程已经验证。
- [ ] Secret 存放在 Secret Manager,用户授权使用短期 OAuth Token。
- [ ] Agent 拥有独立身份、沙箱、输入输出过滤和行为审计。
迁移到生产并不意味着一次性买下最昂贵的容量或搭建完整的企业平台。更实际的做法是:在出现真实用户前完成身份迁移,在流量增长后用指标决定容量模式,在成本和 Agent 行为失控前设置可执行的边界。这样,原型的速度仍然保留,但生产风险不会被推迟到最昂贵的那一天。