OpenAI 在 3 月初开放了 ChatGPT API(gpt-3.5-turbo),价格只有之前 text-davinci-003 的十分之一。这篇记录完整的接入流程和常用技巧。
API Key 申请
- 注册 OpenAI 账号(需要海外手机号验证)
- 在 platform.openai.com 创建 API Key
- 新用户有 $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 的价格也足够便宜,个人开发者完全用得起。接下来打算用它做一些有意思的小工具。