openai.ChatCompletion.create()不能裸用,因为它仅发起单次请求、不维护对话上下文、不处理token限制、错误重试及历史截断,导致多轮后因context_length_exceeded、RateLimitError等异常而崩溃。

直接用 openai.ChatCompletion.create() 就能跑起来,但不处理 token 限制、错误重试和历史管理,几轮对话后必崩。
为什么 openai.ChatCompletion.create() 不能裸用?
它本身只是发一次请求,不维护上下文。你每次调用都像“重启对话”,模型根本不知道前一句说了啥。更麻烦的是:RateLimitError、InvalidRequestError、Timeout 这些错误一出现,程序就停了——而 OpenAI 的 rate limit 是按 key+窗口时间动态算的,不是固定每分钟多少次。
- 对话历史必须手动拼进
messages列表,且总 token 数不能超模型上限(比如gpt-3.5-turbo是 4096,实际得留 200+ 给响应) - 遇到
openai.error.RateLimitError时,硬等 1 秒不如用指数退避:第一次等 1s,失败再等 2s、4s… -
temperature=0.7适合聊天,但设成 0 容易答得生硬;设成 1.0 又可能胡说——多数场景用 0.7~0.9 更稳
怎么安全地维护多轮对话上下文?
别存整个字符串,用 messages 列表逐条追加,并在每次请求前做截断。关键不是“删最早那条”,而是按 token 数倒着删——因为用户最新消息最重要,系统提示词通常放最前面也不能动。
- 用
tiktoken库(OpenAI 官方推荐)算 token:encoding = tiktoken.encoding_for_model("gpt-3.5-turbo"),再用encoding.encode(text) - 保留 system message 不删;user/assistant 消息从旧到新遍历,累计 token 超限时,从最老的 user+assistant 对开始删
- 建议硬性限制
messages长度 ≤ 10 条(含 system),避免 token 算错导致context_length_exceeded
如何捕获并处理常见 API 错误?
OpenAI Python SDK 的异常类型很具体,别全用 except Exception: 吞掉——那样你连 key 写错还是网络挂了都分不清。
立即学习“Python免费学习笔记(深入)”;
-
openai.error.AuthenticationError→ 检查OPENAI_API_KEY环境变量是否漏设或值错误 -
openai.error.InvalidRequestError→ 大概率是messages格式错(比如少了role字段)或 model 名写成gpt35这种不存在的值 -
openai.error.APIConnectionError→ 本地网络或代理问题,不是服务端故障,重试意义不大 - 所有可重试错误(
RateLimitError、APIError、Timeout)统一用tenacity库做 3 次指数退避,比手写 while 循环干净
真正难的不是第一次 echo 出 response,而是让机器人连续聊 10 轮不丢上下文、不炸 token、不错过错误信号。token 计算不准、system message 被误删、重试时把 history 重复塞进去——这些细节错一点,表现就是“突然答非所问”或者“死循环报错”。


















