本文从零开始,手把手教你用 Python 调用 ChatGPT API,涵盖基础调用、流式输出、多轮对话、异常处理等实用场景,所有代码均可直接运行。
#Python #ChatGPT #OpenAI #API开发 #LLM应用开发
一、前置条件
1.1 Python 环境
建议使用 Python 3.8 及以上版本。通过以下命令检查:
python --version
# 或
python3 --version
1.2 安装 openai 库
OpenAI 官方维护了 Python SDK,目前主流版本是 v1.x,API 设计更现代,支持同步和异步调用。
pip install openai
# 建议固定版本,避免升级破坏接口
pip install "openai>=1.0.0"
安装完成后验证:
python -c "import openai; print(openai.__version__)"
1.3 虚拟环境(推荐)
项目开发建议使用虚拟环境隔离依赖:
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
pip install openai
二、获取 API Key
为什么不直接用 OpenAI 官方 Key?
直接使用 OpenAI 官方 API,在国内会遇到网络访问问题。即使你有海外信用卡能注册 OpenAI 账号,在代码运行时也经常碰到连接超时。
更稳定的方式是使用国内可访问的 API 中转服务。jiekou.ai 是一个兼容 OpenAI 接口格式的中转平台,无需翻墙即可稳定调用 GPT-4o、Claude、Gemini 等模型。
获取 Key 的步骤
-
访问 jiekou.ai 注册账号
-
登录后进入控制台 → API Key 管理
-
点击「新建 Key」,复制密钥
配置到环境变量(推荐)
不要把 Key 硬编码在代码里,使用环境变量更安全:
# macOS/Linux
export OPENAI_API_KEY="your-api-key-here"
# Windows PowerShell
$env:OPENAI_API_KEY="your-api-key-here"
或者在项目根目录创建 .env 文件(记得加入 .gitignore):
OPENAI_API_KEY=your-api-key-here
三、基础调用:单次问答
这是最简单的调用场景,发送一条消息,获取一条回复。
# basic_chat.py
import os
from openai import OpenAI
# 初始化客户端
# 使用 jiekou.ai 中转端点,国内直连无需代理
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY", "your-api-key-here"),
base_url="https://api.jiekou.ai/v1"
)
def chat(user_message: str, model: str = "gpt-4o") -> str:
"""
发送单条消息并获取回复
Args:
user_message: 用户输入的消息
model: 使用的模型,默认 gpt-4o
Returns:
模型的回复文本
"""
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": user_message}
],
temperature=0.7, # 控制回复随机性,0-2,越低越确定
max_tokens=1024 # 最大输出 token 数
)
return response.choices[0].message.content
if __name__ == "__main__":
result = chat("用一句话解释什么是机器学习")
print(result)
运行输出示例:
机器学习是让计算机通过从数据中自动学习规律,而不是依靠明确编写规则来完成任务的技术。
四、流式输出(Streaming)
当回复内容较长时,等待全部生成再显示体验很差。流式输出可以像打字机一样逐字显示,显著提升用户体验。
# stream_chat.py
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY", "your-api-key-here"),
base_url="https://api.jiekou.ai/v1"
)
def stream_chat(user_message: str, model: str = "gpt-4o") -> str:
"""
流式输出:边生成边打印,适合长文本场景
Returns:
完整的回复文本(同时实时打印到控制台)
"""
full_response = ""
# 设置 stream=True 开启流式模式
stream = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": user_message}
],
temperature=0.7,
stream=True # 关键参数
)
print("助手:", end="", flush=True)
for chunk in stream:
# 每个 chunk 包含一小段文本
delta = chunk.choices[0].delta
if delta.content is not None:
print(delta.content, end="", flush=True)
full_response += delta.content
print() # 换行
return full_response
if __name__ == "__main__":
stream_chat("请写一首关于秋天的五言绝句,并解释其意境")
说明:
-
end=""和flush=True确保文字实时显示而不是缓存后一次性输出 -
循环结束后
full_response保存了完整回复,可用于后续处理
五、多轮对话
ChatGPT API 本身是无状态的——每次请求都是独立的,不会"记住"上次说了什么。实现多轮对话的方式是手动维护 messages 历史列表,把每次的问答都追加进去。
# multi_turn_chat.py
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY", "your-api-key-here"),
base_url="https://api.jiekou.ai/v1"
)
class ConversationChat:
"""
支持多轮对话的聊天类
通过维护 messages 历史实现上下文连贯
"""
def __init__(self, system_prompt: str = "你是一个有帮助的助手。", model: str = "gpt-4o"):
self.model = model
# 初始化消息历史,包含系统提示
self.messages = [
{"role": "system", "content": system_prompt}
]
def chat(self, user_message: str) -> str:
"""
发送消息并获取回复,自动维护对话历史
"""
# 将用户消息加入历史
self.messages.append({
"role": "user",
"content": user_message
})
# 发送包含完整历史的请求
response = client.chat.completions.create(
model=self.model,
messages=self.messages,
temperature=0.7,
max_tokens=2048
)
assistant_message = response.choices[0].message.content
# 将助手回复也加入历史
self.messages.append({
"role": "assistant",
"content": assistant_message
})
return assistant_message
def clear_history(self):
"""清空对话历史,只保留系统提示"""
system_prompt = self.messages[0]
self.messages = [system_prompt]
def get_history_length(self) -> int:
"""返回历史消息条数(不含系统提示)"""
return len(self.messages) - 1
def main():
# 创建一个专门用于 Python 教学的助手
bot = ConversationChat(
system_prompt="你是一个 Python 编程导师,擅长用简洁的语言解释技术概念。",
model="gpt-4o"
)
print("多轮对话示例(输入 'quit' 退出,'clear' 清空历史)\n")
while True:
user_input = input("你:").strip()
if not user_input:
continue
if user_input.lower() == "quit":
break
if user_input.lower() == "clear":
bot.clear_history()
print("对话历史已清空\n")
continue
reply = bot.chat(user_input)
print(f"助手:{reply}\n")
print(f"(当前对话轮次:{bot.get_history_length() // 2})\n")
if __name__ == "__main__":
main()
注意事项:
-
messages列表越长,每次请求消耗的 Token 越多,成本越高 -
长对话建议做历史截断(保留最近 N 轮)或摘要压缩
-
可以在
system消息中设定助手的角色、风格、限制
六、异常处理与最佳实践
生产代码必须处理各种异常,不能让未捕获的错误直接崩溃:
# robust_chat.py
import os
import time
from openai import OpenAI, APIError, RateLimitError, APITimeoutError, APIConnectionError
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY", "your-api-key-here"),
base_url="https://api.jiekou.ai/v1",
timeout=30.0 # 设置超时时间(秒)
)
def robust_chat(user_message: str, max_retries: int = 3) -> str:
"""
带重试机制的稳健调用
"""
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": user_message}],
temperature=0.7,
max_tokens=1024
)
return response.choices[0].message.content
except RateLimitError as e:
# 触发速率限制,等待后重试
wait_time = 2 ** attempt # 指数退避:1s, 2s, 4s
print(f"触发速率限制,{wait_time}s 后重试(第 {attempt + 1} 次)")
time.sleep(wait_time)
except APITimeoutError:
print(f"请求超时,重试中(第 {attempt + 1} 次)")
if attempt == max_retries - 1:
raise
except APIConnectionError as e:
print(f"连接失败:{e},请检查网络")
raise
except APIError as e:
# 其他 API 错误(如 4xx/5xx)
print(f"API 错误 [{e.status_code}]:{e.message}")
if e.status_code and e.status_code < 500:
raise # 客户端错误不重试
raise RuntimeError(f"重试 {max_retries} 次后仍然失败")
if __name__ == "__main__":
try:
result = robust_chat("什么是 Python 的 GIL?")
print(result)
except Exception as e:
print(f"最终失败:{e}")
七、常用参数说明
-
model(str):模型名称,如 gpt-4o、gpt-4o-mini、claude-3-5-sonnet-20241022
-
messages(list):消息历史,包含 role(system/user/assistant)和 content
-
temperature(float):随机性控制,范围 0-2。0 = 确定性输出,1+ = 更有创意
-
max_tokens(int):单次回复最大 Token 数。不设置则由模型自行决定
-
top_p(float):核采样,与 temperature 类似,通常二选一调整
-
stream(bool):是否启用流式输出,默认 False
-
n(int):生成多少个候选回复,默认 1
-
stop(str/list):遇到指定字符串时停止生成
-
presence_penalty(float):降低重复话题的概率,范围 -2 到 2
-
frequency_penalty(float):降低重复词语的概率,范围 -2 到 2
Token 小贴士:
-
1 个英文单词 ≈ 1-2 个 Token
-
1 个中文汉字 ≈ 1-2 个 Token
-
可用
tiktoken库预估 Token 数量
结语
Python 调用 ChatGPT API 并不复杂,核心就是构造 messages 列表并处理响应。掌握基础调用、流式输出和多轮对话这三个场景,已经能覆盖 80% 的实际需求。
国内开发者在接入时最常遇到的是网络问题。如果你不想折腾代理,可以直接用 jiekou.ai——兼容 OpenAI 接口格式,只需修改 base_url,支持 GPT-4o、Claude、Gemini 等多种模型,按量计费,测试成本极低。希望这篇教程能帮你快速上手,把更多时间投入到产品本身。