📌 本文讲 SDK 用法。访问 OpenAI 等海外服务请遵守你所在地区的网络法规。
装 SDK
pip install openai
配置 API Key
export OPENAI_API_KEY="sk-..."
或在代码里:
from openai import OpenAI
client = OpenAI(api_key="sk-...")
⚠️ 永远不要把 key 写死在代码里——用环境变量或
.env文件。
第一个对话
from openai import OpenAI
client = OpenAI()
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是简洁的助手。"},
{"role": "user", "content": "Python 的 list 和 tuple 区别?"},
],
)
print(resp.choices[0].message.content)
messages 角色
| 角色 | 用途 |
|---|---|
system |
设定整体行为(最先) |
user |
用户输入 |
assistant |
模型上一轮回复(多轮对话用) |
多轮对话
history = [{"role": "system", "content": "你是 Python 老师。"}]
while True:
user_input = input("你: ")
history.append({"role": "user", "content": user_input})
resp = client.chat.completions.create(model="gpt-4o-mini", messages=history)
answer = resp.choices[0].message.content
print(f"AI: {answer}")
history.append({"role": "assistant", "content": answer})
长对话要注意 token 数限制——历史太长要截断或摘要。
流式输出(聊天体验关键)
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "讲个长故事"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
print()
逐字打印——用户体验大幅提升。
控制随机性
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[...],
temperature=0.0, # 0 = 几乎确定性,1 = 默认,2 = 很随机
max_tokens=500, # 最多生成多少
top_p=0.9, # 核采样
seed=42, # 可重现(不保证 100%)
)
数据提取 / 测试:temperature=0。
创作 / 头脑风暴:temperature=0.7~1.0。
JSON 模式
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "返回 JSON:{\"sentiment\":\"...\",\"keywords\":[...]}"},
{"role": "user", "content": "这个产品超好用!"},
],
response_format={"type": "json_object"},
)
import json
data = json.loads(resp.choices[0].message.content)
结构化输出(更强)
from pydantic import BaseModel
class Review(BaseModel):
sentiment: str
keywords: list[str]
resp = client.beta.chat.completions.parse(
model="gpt-4o-mini",
messages=[...],
response_format=Review,
)
review = resp.choices[0].message.parsed # 直接是 Review 对象
print(review.sentiment, review.keywords)
Function Calling(工具调用)
让模型决定调哪个函数 + 传什么参数:
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"],
},
},
}]
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "深圳今天天气怎么样?"}],
tools=tools,
)
call = resp.choices[0].message.tool_calls[0]
print(call.function.name) # 'get_weather'
print(call.function.arguments) # '{"city":"深圳"}'
# 实际调你的函数,把结果再喂给模型继续对话
异步并发
from openai import AsyncOpenAI
import asyncio
async_client = AsyncOpenAI()
async def chat(prompt):
resp = await async_client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return resp.choices[0].message.content
async def main():
prompts = ["问题1", "问题2", "问题3"]
answers = await asyncio.gather(*[chat(p) for p in prompts])
return answers
asyncio.run(main())
看 token 用量
print(resp.usage)
# CompletionUsage(prompt_tokens=15, completion_tokens=80, total_tokens=95)
按 token 计费——监控开销很重要。
下一篇讲 Claude API——同样重要。