共计 2606 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点
刚开始接触 ChatGPT API 时,很多开发者会遇到一些共性问题。我自己在项目开发过程中也踩过不少坑,总结下来主要有三个痛点:

-
Token 计算问题:ChatGPT 按 token 收费,但开发者经常难以准确预估对话长度。一次我发送的 prompt 意外包含了大量文本,导致 API 调用费用飙升。
-
对话状态维护:简单的单次问答容易实现,但当需要保持多轮对话的上下文时,如何有效管理历史消息成为难题。
-
响应处理:流式响应和普通响应的处理方式不同,刚开始容易混淆,特别是需要实时显示生成内容的时候。
技术对比:Python vs Node.js
OpenAI 为不同语言提供了 SDK,这里比较下 Python 和 Node.js 两种主流选择:
- Python SDK 优势:
- 语法简洁,适合快速原型开发
- 丰富的科学计算生态,方便后续扩展
-
同步 / 异步 API 都支持
-
Node.js SDK 优势:
- 更适合 Web 应用集成
- 原生支持异步 IO
- 与前端技术栈更契合
对于初学者,我推荐从 Python 开始,因为错误信息和调试会更友好。下面我们都以 Python 为例讲解。
核心实现
1. 环境准备
首先安装必要的包:
pip install openai python-dotenv
2. API 密钥安全存储
永远不要将 API 密钥硬编码在代码中!推荐使用 .env 文件管理:
# .env 文件
OPENAI_API_KEY="your-api-key-here"
然后在代码中安全加载:
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
3. 基础对话实现
最简单的单次问答示例:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Python 中如何反转字符串?"}
]
)
print(response["choices"][0]["message"]["content"])
4. 维护对话上下文
要实现多轮对话,需要维护 messages 列表:
conversation_history = []
def chat(prompt):
# 添加用户消息到历史
conversation_history.append({"role": "user", "content": prompt})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversation_history
)
# 获取 AI 回复并添加到历史
ai_reply = response["choices"][0]["message"]
conversation_history.append(ai_reply)
return ai_reply["content"]
注意:实际使用时需要控制历史消息长度,避免 token 超额。
5. 流式响应处理
对于长时间生成的内容,使用流式响应可以改善用户体验:
def stream_chat(prompt):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
stream=True
)
for chunk in response:
content = chunk["choices"][0].get("delta", {}).get("content")
if content:
print(content, end="", flush=True)
避坑指南
1. 超时处理
API 调用可能因网络问题超时,建议添加重试逻辑:
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_chat_completion(**kwargs):
return openai.ChatCompletion.create(**kwargs)
2. 内容过滤
用户输入可能包含敏感内容,建议添加前置过滤:
blacklist = ["暴力", "色情", "政治敏感词"] # 示例
def is_safe_input(text):
return not any(bad_word in text for bad_word in blacklist)
3. Token 限制
计算消息 token 数避免超额:
import tiktoken
def count_tokens(messages):
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
return sum(len(encoding.encode(msg["content"])) for msg in messages)
性能优化
1. Prompt 工程技巧
- 明确指令:” 你是一个专业的 Python 编程助手 ” 比直接提问效果好
- 分步思考:让 AI 先解释思路再给出答案
- 示例示范:提供输入输出样例
2. 并发请求
使用异步提高吞吐量:
import asyncio
async def async_chat(prompt):
response = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response["choices"][0]["message"]["content"]
延伸思考
- 如何实现对话中的意图识别?可以考虑在 ChatGPT 回复前添加分类步骤
- 怎样处理超长对话?可以尝试摘要历史消息而非完整保存
- 如何集成知识库?可以使用嵌入搜索 +ChatGPT 的组合方案
结语
通过这篇指南,我们从最基础的 API 调用讲到了生产环境的优化策略。ChatGPT API 的强大之处在于它的灵活性,你可以基于这些基础代码构建各种有趣的应用。开始动手实践吧,遇到问题随时查阅官方文档,开发社区也有很多热心人愿意帮忙。
