這一課的目標很單純:把 Gemini 從網頁上的試玩介面,接進一支能重複執行的 Python 程式。
我們會固定使用目前為 GA 的 gemini-3.5-flash。如果你在較晚的時間閱讀,請先查看官方模型版本與生命週期,確認 Model ID 和可用區域仍相同。
完成後會有什麼?
你會依序做到:
- 用 Vertex AI 驗證身分
- 傳送第一個文字請求
- 查看 Token 用量
- 加入圖片
- 串流顯示較長的回答
- 建立多輪對話
- 把這些能力組成一個需求澄清助手
所有範例都使用官方建議的 google-genai 套件。
步驟一:準備專案
你需要一個已啟用計費功能的 Google Cloud 專案。先打開 Cloud Shell,確認目前專案:
gcloud config get-value project
如果不是要使用的專案,改成自己的 Project ID:
gcloud config set project YOUR_PROJECT_ID
啟用 Vertex AI API:
gcloud services enable aiplatform.googleapis.com
目前帳號至少要能使用 Vertex AI。公司專案通常由管理員授予 Vertex AI User(roles/aiplatform.user)或等效的自訂角色。
Cloud Shell 和本機登入方式不同
Cloud Shell 已經帶有目前登入帳號的憑證,通常不必再跑登入指令。
如果你改在本機終端機操作,除了先安裝並登入 Google Cloud CLI,還要建立 Application Default Credentials(ADC):
gcloud auth application-default login
gcloud auth login 是讓 CLI 登入;gcloud auth application-default login 則是讓本機應用程式取得 ADC。兩者用途不同,是常見的卡關點。
步驟二:建立 Python 環境
在 Cloud Shell 或本機建立虛擬環境:
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade google-genai
設定 SDK 會讀取的環境變數:
export GOOGLE_CLOUD_PROJECT="$(gcloud config get-value project)"
export GOOGLE_CLOUD_LOCATION="global"
export GOOGLE_GENAI_USE_VERTEXAI="true"
這三個設定分別告訴 SDK:
- 使用哪個 Google Cloud 專案
- 從哪個位置呼叫模型
- 使用 Vertex AI,而不是 Gemini Developer API
若組織政策不允許 global,請改用模型支援且公司核准的區域。
步驟三:送出第一個請求
建立 app.py:
from google import genai
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
response = client.models.generate_content(
model=MODEL_ID,
contents="用三個重點說明 Cloud Run 適合什麼工作負載。",
)
print(response.text)
執行:
python app.py
如果看到三個重點,代表 API、憑證、專案與模型位置都能正常配合。
也可以在程式中明確指定 Vertex AI
正式服務有時不希望依賴本機環境變數,可以明確建立 Client:
from google import genai
client = genai.Client(
vertexai=True,
project="YOUR_PROJECT_ID",
location="global",
)
不要把服務帳戶金鑰直接寫進程式。部署到 Cloud Run 等 Google Cloud 服務時,應替執行環境配置服務帳戶與最小必要權限。
步驟四:查看 Token 用量
回應物件包含這次呼叫的用量資訊:
usage = response.usage_metadata
print(f"輸入 Token:{usage.prompt_token_count}")
print(f"輸出 Token:{usage.candidates_token_count}")
print(f"總 Token:{usage.total_token_count}")
欄位可能隨回應類型或 SDK 版本而略有差異,正式程式最好先判斷值是否存在。
Token 用量不只是帳單問題。當輸入突然變長,可能代表你把過多對話歷史、重複文件或不必要的資料送進模型。把用量記進監控,通常能比月底看帳單更早發現問題。
步驟五:加入圖片
Gemini 可以同時看文字和圖片。準備一張 architecture.png,再把下面程式加入 app.py:
from pathlib import Path
from google import genai
from google.genai import types
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
image_bytes = Path("architecture.png").read_bytes()
response = client.models.generate_content(
model=MODEL_ID,
contents=[
types.Part.from_bytes(
data=image_bytes,
mime_type="image/png",
),
"請描述這張架構圖的資料流,並列出兩個需要確認的風險。"
],
)
print(response.text)
如果檔案是 JPEG,mime_type 要改成 image/jpeg。副檔名與 MIME type 對不上時,API 可能無法正確解析。
模型可以幫忙看圖,但它不知道圖中沒有畫出的網路政策、流量與復原需求。比較安全的問法是請它列出「需要確認的資訊」,而不是要求它直接宣告架構一定安全。
步驟六:串流顯示回答
較長的回答如果等全部生成完才顯示,使用者會覺得介面卡住。可以改用串流:
from google import genai
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
for chunk in client.models.generate_content_stream(
model=MODEL_ID,
contents="用條列方式比較 Cloud Run、GKE 與 Compute Engine 的選擇條件。",
):
if chunk.text:
print(chunk.text, end="", flush=True)
print()
串流改善的是感受時間,不會縮短模型實際完成整段回答所需的計算,也不代表費用變少。
步驟七:加入系統指示
當應用程式需要固定角色、語言或行為,可以放在 system_instruction:
from google import genai
from google.genai import types
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
response = client.models.generate_content(
model=MODEL_ID,
contents="我們的 API 偶爾出現 503,應該先看什麼?",
config=types.GenerateContentConfig(
system_instruction=(
"你是雲端維運助理。使用繁體中文回答。"
"先詢問缺少的環境資訊,再提供檢查順序;"
"不要在沒有證據時直接判定根因。"
),
),
)
print(response.text)
系統指示能穩定行為,但不是安全邊界。應用程式的權限、資料過濾與工具核准,仍要由程式和雲端權限控制。
步驟八:建立多輪對話
Chat 介面會替目前程式保存對話歷史:
from google import genai
from google.genai import types
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
chat = client.chats.create(
model=MODEL_ID,
config=types.GenerateContentConfig(
system_instruction="你是需求澄清助手。資訊不足時先提問,不要自行補完。",
),
)
first = chat.send_message(
"我們想把一個內部 API 搬到 Google Cloud。"
)
print(first.text)
second = chat.send_message(
"目前每天約一萬次請求,容器已經可以在本機執行。"
)
print(second.text)
SDK 會把歷史訊息送回模型,所以對話越長,輸入 Token 通常也會增加。
這個 Chat 物件也不是永久的對話資料庫。程式關閉後若要繼續同一段對話,應用程式必須自行保存必要歷史,並決定何時摘要或捨棄舊訊息。
綜合練習:需求澄清助手
把前面的概念組成一支小工具。它的任務不是直接推薦架構,而是先把缺少的資訊問完整。
from google import genai
from google.genai import types
MODEL_ID = "gemini-3.5-flash"
client = genai.Client()
SYSTEM_INSTRUCTION = """
你是 Google Cloud 需求澄清助手,使用繁體中文。
收到需求後:
1. 先整理已知條件。
2. 列出最多五個會影響架構選擇、但目前缺少的問題。
3. 如果資訊不足,不要直接選產品或估算費用。
4. 若提到價格,提醒使用者回到官方定價頁確認。
"""
request = """
我們要把現有網站搬上雲端。
平常流量不大,但每月活動日會突然增加。
團隊只有兩位工程師。
"""
response = client.models.generate_content(
model=MODEL_ID,
contents=request,
config=types.GenerateContentConfig(
system_instruction=SYSTEM_INSTRUCTION,
),
)
print(response.text)
print(f"總 Token:{response.usage_metadata.total_token_count}")
接著替它補上三種測試:
- 完全沒有流量、資料庫與合規資訊
- 已提供流量,但沒有可接受的停機時間
- 資訊看似完整,卻要求模型保證每月費用
觀察它是否會先問問題,以及是否避免做出沒有根據的保證。這就是最小型的模型行為測試。
常見錯誤怎麼查?
401 或 ADC 相關錯誤
本機通常是 ADC 尚未建立或已失效。重新執行:
gcloud auth application-default login
部署環境則要檢查服務帳戶,不要在正式環境使用個人憑證。
403 Permission denied
依序確認:
- Vertex AI API 是否已啟用
- SDK 使用的專案是否正確
- 目前身分是否具備 Vertex AI 使用權限
- 組織政策是否限制該區域或服務
404 找不到模型
通常是 Model ID 打錯、模型已換版,或目前位置不支援。查看模型文件後,再一起確認 GOOGLE_CLOUD_LOCATION。
429 Resource exhausted
可能碰到配額或速率限制。正式程式要加入指數退避與重試,也要避免對不可重試的錯誤一直重送。若流量穩定超過配額,再依官方流程申請調整。
清理環境
這個練習不會建立 VM 或資料庫,但 API 呼叫仍可能產生費用。做完後可以離開虛擬環境:
deactivate
若這是專門練習用、之後不再使用的專案,也可以停用 Vertex AI API:
gcloud services disable aiplatform.googleapis.com
共用專案不要隨意停用服務,因為可能影響其他工作負載。
課後檢查
你現在應該能回答:
- 為什麼 Vertex AI Client 需要專案、位置與 ADC?
- 串流和一般回應的差別是什麼?
- Chat 歷史為什麼會讓 Token 用量增加?
- 系統指示為什麼不能取代 IAM 和應用程式驗證?
下一課會處理 Prompt。重點不會是背「神奇咒語」,而是把任務規格寫清楚,再用測試案例反覆確認輸出。