共计 2806 个字符,预计需要花费 8 分钟才能阅读完成。
开篇目标
本教程将带你在 30 分钟内完成一个可运行的 ChatGPT 对话 Demo。使用 Python 3.8+ 和 OpenAI 官方库,兼容 GPT-3.5/ 4 模型。最终效果:输入问题→获取 AI 回答→保持多轮对话上下文。

环境准备
- 注册 OpenAI 账号并获取 API 密钥
- 安装 Python 3.8+ 和 pip
- 安装必要库:
pip install openai python-dotenv
API 密钥安全管理
永远不要将 API 密钥硬编码在代码中!推荐方案:
- 创建
.env文件:
# .env 文件示例
OPENAI_API_KEY= 你的实际密钥
- 创建
.gitignore文件避免密钥上传:
# .gitignore
.env
__pycache__/
- 安全读取密钥的代码示例:
# config.py
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env 文件
def get_api_key() -> str:
"""安全获取 API 密钥"""
key = os.getenv("OPENAI_API_KEY")
if not key:
raise ValueError("请检查.env 文件中的 OPENAI_API_KEY 配置")
return key
基础请求封装(含错误处理)
# chat.py
import openai
from typing import Optional, Dict, List
from config import get_api_key
openai.api_key = get_api_key()
class ChatGPT:
@staticmethod
def ask(
prompt: str,
model: str = "gpt-3.5-turbo",
temperature: float = 0.7,
max_tokens: int = 1000
) -> Optional[str]:
"""
基础问答请求
:param prompt: 用户输入的问题或指令
:param model: 使用的模型版本
:param temperature: 创造性控制(0-2):param max_tokens: 限制响应长度
:return: AI 生成的回答或 None(出错时)
"""
try:
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
max_tokens=max_tokens
)
return response.choices[0].message.content
except Exception as e:
print(f"请求出错: {str(e)}")
return None
# 使用示例
if __name__ == "__main__":
answer = ChatGPT.ask("Python 如何实现快速排序?")
print(answer)
流式与非流式响应对比
非流式(默认):
– 一次性返回完整结果
– 代码简单,适合快速开发
流式响应:
– 逐片段返回结果
– 体验更好,适合长文本
流式实现代码:
# 在 ChatGPT 类中添加
@staticmethod
def ask_stream(
prompt: str,
model: str = "gpt-3.5-turbo",
temperature: float = 0.7
) -> None:
"""流式输出结果"""
try:
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
stream=True # 关键参数
)
for chunk in response:
content = chunk.choices[0].delta.get("content", "")
print(content, end="", flush=True)
print()
except Exception as e:
print(f"流式请求出错: {str(e)}")
上下文保持实现
关键点:维护 messages 数组,包含完整对话历史
# 扩展 ChatGPT 类
class ChatGPTWithMemory(ChatGPT):
def __init__(self):
self.messages: List[Dict] = []
def add_message(self, role: str, content: str) -> None:
"""添加对话记录"""
self.messages.append({"role": role, "content": content})
def ask_with_memory(self, prompt: str) -> Optional[str]:
"""带上下文的问答"""
self.add_message("user", prompt)
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=self.messages
)
answer = response.choices[0].message.content
self.add_message("assistant", answer)
return answer
except Exception as e:
print(f"请求出错: {str(e)}")
return None
# 使用示例
if __name__ == "__main__":
bot = ChatGPTWithMemory()
print(bot.ask_with_memory("什么是机器学习?")) # 第一问
print(bot.ask_with_memory("用通俗语言解释一下")) # 延续上文
避坑指南
1. Token 超限预防
– 监控response.usage.total_tokens
– 长对话时定期清理早期消息
2. 敏感信息过滤
– 请求前检查用户输入:
blacklist = ["密码", "密钥", "身份证号"]
def contains_sensitive(text: str) -> bool:
return any(word in text for word in blacklist)
3. 生产环境建议
– 限制 QPS(每秒查询次数)
– 添加 API 调用速率限制
– 考虑使用异步请求
延伸思考
- 多轮对话记忆压缩:
- 当对话轮数过多时,如何提炼关键信息?
-
尝试用 AI 自动总结对话要点
-
非英文 Prompt 优化:
- 明确指定响应语言
- 示例:” 请用简体中文回答 ”
- 注意文化差异导致的表达歧义
结语
现在你已经掌握了 ChatGPT API 的基础用法。建议从简单对话开始,逐步尝试:
– 添加前端界面
– 实现语音输入输出
– 结合业务场景定制 prompt
遇到问题时,记得查阅OpenAI 官方文档,大部分常见问题都有详细说明。Happy coding!
正文完
发表至: 未分类
近两天内
