送出第一個請求
用十幾行 Python 程式呼叫大型語言模型,看懂請求要帶哪些參數、回應裡又裝了什麼。
上一堂課你已經把金鑰安全地放進 .env,那是最需要小心的一步,現在可以輕鬆一點了。這堂課要做一件很單純的事:用程式問模型一個問題,把答案印出來。
聽起來和在聊天視窗打字差不多,但用程式呼叫有個很大的好處:你可以把它接到任何地方。讀一百封信件做摘要、幫表單自動分類、在你自己的網站加上問答功能,起點都是這一個請求。
先理解:請求與回應
API 呼叫就像寄一封信給模型,再收到一封回信。信裡要寫清楚三件事:
- model:要請哪個模型回答。
- max_tokens:回答最多能有多長。token 是模型計算文字的單位,大約可以想成「一小段字」。
- messages:對話內容,是一個清單,每一則訊息都標明是誰說的。
每次呼叫都是一來一回。回應裡除了答案,還有停止原因與用量。
安裝與第一支程式
如果還沒安裝,先在虛擬環境裡執行:
pip install anthropic python-dotenv
建立 first_call.py:
from dotenv import load_dotenv
import anthropic
load_dotenv() # 從 .env 載入 ANTHROPIC_API_KEY
MODEL = "claude-sonnet-5-5" # 可以換成其他模型 ID
client = anthropic.Anthropic() # 自動讀取環境變數裡的金鑰
response = client.messages.create(
model=MODEL,
max_tokens=16000,
messages=[
{"role": "user", "content": "用三句話向國中生解釋什麼是 API。"}
],
)
for block in response.content:
if block.type == "text":
print(block.text)
執行:
python first_call.py
幾秒後,終端機就會出現模型的回答。恭喜,你完成了第一次 API 呼叫。
看懂回應物件
把回應印出來看看,會更清楚它的結構:
print(response.stop_reason) # 例如 end_turn
print(response.usage.input_tokens) # 你送進去的 token 數
print(response.usage.output_tokens) # 模型產生的 token 數
幾個重點:
content 是清單,不是字串。 回應可能包含好幾種區塊,例如文字、模型的思考過程、或之後會學到的工具呼叫。所以範例程式用迴圈逐一檢查,只印出 type 為 text 的區塊。直接寫 response.content[0].text 有時會出錯,因為第一個區塊不一定是文字。
stop_reason 說明為什麼停下來。 最常見的值:
| 值 | 意思 |
|---|---|
end_turn |
模型自然說完了 |
max_tokens |
撞到長度上限被切斷,考慮調高 max_tokens |
refusal |
模型基於安全理由拒絕回答 |
usage 是你的帳單依據。 費用就是依照輸入與輸出的 token 數計算,第六堂課會詳細教你怎麼估算。
模型不會記得上一次
這是新手最容易誤會的地方:每次呼叫都是獨立的。你再執行一次程式,問「我剛剛問了什麼?」,模型不會知道。想要多輪對話,必須自己把歷史訊息一起送回去,這就是下一堂課的主題。
換成其他供應商
OpenAI、Google 的 API 長相很接近:同樣是建立用戶端、指定模型、送出一個訊息清單、從回應裡取出文字。參數名稱略有不同,但「請求帶什麼、回應有什麼」的觀念完全一樣。
這是我的 first_call.py。請幫我改成可以從命令列輸入問題,例如 python first_call.py "什麼是 token?",並在答案後面印出這次用了多少輸入與輸出 token。
- 執行
first_call.py,確認拿到回答。 - 把問題改成你工作上真的會問的問題,例如「幫我把這段會議紀錄整理成三個重點」,並把一段文字貼進
content。 - 印出
stop_reason與usage,記下輸入與輸出各用了多少 token。 - 把
max_tokens改成50再執行一次,觀察stop_reason變成什麼、回答是否被切斷。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。