📌 本文讲 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——同样重要。