ChatGPT API使用指南:用Python调用GPT

OpenAI 在 3 月初开放了 ChatGPT API(gpt-3.5-turbo),价格只有之前 text-davinci-003 的十分之一。这篇记录完整的接入流程和常用技巧。

API Key 申请

  1. 注册 OpenAI 账号(需要海外手机号验证)
  2. platform.openai.com 创建 API Key
  3. 新用户有 $5 免费额度,3 个月有效期

建议把 key 放在环境变量里,不要硬编码:

export OPENAI_API_KEY="sk-xxxxxxxxxxxx"

安装与基本调用

pip install openai

最基本的调用:

import openai

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "你是一个有帮助的助手。"},
        {"role": "user", "content": "用一句话解释什么是REST API"}
    ]
)

print(response.choices[0].message.content)

消息角色

ChatCompletion API 用消息列表而非单个 prompt,有三种角色:

  • system:设定助手的行为和角色,在对话开头设置一次
  • user:用户的输入
  • assistant:模型之前的回复,用于提供对话上下文

多轮对话需要把历史消息都传进去:

messages = [
    {"role": "system", "content": "你是一个Python编程助手。"},
    {"role": "user", "content": "怎么读取CSV文件?"},
    {"role": "assistant", "content": "可以用pandas的read_csv函数..."},
    {"role": "user", "content": "如果文件很大呢?"}
]

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages
)

关键参数

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    temperature=0.7,   # 0-2,越高越随机,代码生成建议用0
    max_tokens=1000,    # 最大生成token数
    top_p=1.0,          # nucleus sampling,通常和temperature二选一调
    n=1,                # 生成几个回复
    stop=None,          # 停止词
)

temperature 的选择:

  • 代码生成 / 事实问答:0 或 0.1
  • 通用对话 / 写作:0.7
  • 创意写作:1.0 - 1.5

流式输出

对于长回复,流式输出体验更好——用户不用等全部生成完:

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    stream=True
)

for chunk in response:
    delta = chunk.choices[0].delta
    if "content" in delta:
        print(delta["content"], end="", flush=True)

流式模式下,响应是一个 generator,每个 chunk 包含增量内容。

Token 计算与费用

gpt-3.5-turbo 的价格是 $0.002 / 1K tokens。一个中文字大约 2 个 token,一个英文单词大约 1-2 个 token。

用 tiktoken 库可以预估 token 数:

import tiktoken

enc = tiktoken.encoding_for_model("gpt-3.5-turbo")
tokens = enc.encode("你好,世界!")
print(len(tokens))  # 大约 6 个 token

一些参考数据:

  • 一条普通对话(500 字):约 300 tokens,费用 $0.0006
  • 一篇文章摘要(2000 字输入 + 200 字输出):约 1500 tokens,费用 $0.003

按这个价格,个人项目基本不用担心费用。

错误处理

import openai
from openai.error import RateLimitError, APIError
import time

def chat_with_retry(messages, max_retries=3):
    for i in range(max_retries):
        try:
            return openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=messages
            )
        except RateLimitError:
            wait = 2 ** i  # 指数退避
            print(f"Rate limited, waiting {wait}s...")
            time.sleep(wait)
        except APIError as e:
            print(f"API error: {e}")
            if i == max_retries - 1:
                raise
            time.sleep(1)

常见错误:

  • RateLimitError:超出频率限制,需要等待重试
  • InvalidRequestError:通常是 token 超出模型上限(4096),需要截断消息
  • AuthenticationError:API Key 无效

小结

ChatGPT API 的发布是个里程碑事件——之前 LLM 能力被锁在聊天界面里,现在开发者可以自由地集成到自己的应用中。$0.002/1K tokens 的价格也足够便宜,个人开发者完全用得起。接下来打算用它做一些有意思的小工具。