基于 OpenAI API 的 Python 聊天程序开发指南
本教程介绍如何使用 OpenAI 大模型 API 进行编程,适合从零开始搭建聊天应用,也适合开发者查缺补漏。我们将重点讲解基于 Chat Completion API 的调用方法、参数配置及最佳实践。
本文介绍了使用 Python 和 OpenAI API 开发聊天程序的完整流程。内容涵盖环境搭建、SDK 安装、核心代码实现、Token 概念解析以及关键参数配置说明。此外,还补充了环境变量安全存储 API Key 的最佳实践、异常处理机制及成本控制建议,帮助开发者快速构建基于大模型的对话应用。

本教程介绍如何使用 OpenAI 大模型 API 进行编程,适合从零开始搭建聊天应用,也适合开发者查缺补漏。我们将重点讲解基于 Chat Completion API 的调用方法、参数配置及最佳实践。
OpenAI 官方提供的示例和 SDK 主要基于 Python 编写,因此本教程使用 Python 作为开发语言。
建议使用 Python 3.10 或更高版本。如果你已经具备 Python 环境且清楚如何管理依赖,可跳过此节。
推荐使用虚拟环境(如 venv 或 conda)来隔离项目依赖,避免污染全局环境。
执行以下命令安装 OpenAI 的 Python SDK 及相关网络库:
pip install --upgrade openai httpx[socks]
该命令只需执行一次。安装成功后,可通过 python -m pip show openai 验证版本。
下面进入核心部分,演示如何运行一个 GPT 聊天程序。我们将让 GPT 扮演一名小学数学老师,并输出 JSON 格式的回答。
注意:请务必替换代码中的 api_key 为你的真实密钥,切勿将密钥硬编码在代码中提交至公共仓库。
import os
from openai import OpenAI
# 从环境变量读取 API Key,确保安全性
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError("未找到 OPENAI_API_KEY 环境变量")
client = OpenAI(api_key=api_key)
try:
stream = client.chat.completions.create(
messages=[{
"role": "system",
"content": "你是一名数学老师,从事小学数学教育 30 年,精通设计各种数学考试题"
}, {
"role": "user",
"content": "你是谁?请以 json 返回"
}],
model="gpt-3.5-turbo-1106",
max_tokens=1024,
temperature=0.7,
top_p=0.9,
presence_penalty=0.2,
seed=12345,
response_format={"type": "json_object"},
n=1,
stream=True
)
for chunk in stream:
if chunk.choices and len(chunk.choices) > 0:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end='')
except Exception as e:
print(f"请求失败:{e}")
首先创建客户端实例 client = OpenAI(api_key='sk-xxx')。在实际生产中,建议通过环境变量加载密钥,防止泄露。
使用 client.chat.completions.create 发起请求。Completion 意为补全,类似于搜索框的联想输入,但此处指生成对话内容。
Token 是大模型处理数据的基本单位。它不完全对应单词或字符,而是文本被切分后的标记(Mark)。这些标记可能是单词、字符或单词的一部分。
使用 Token 而非直接单词的原因包括效率、灵活性和性能。例如,子词切分可以降低词汇表大小,减少内存需求,同时提升对专有名词和复杂词形变化的处理能力。
例如句子:I don't like cats.
其拆分后的 Token 序列可能为:["I", "do", "n't", "like", "cats", "."]
不同模型采用的切分算法可能不同,实际 Token 数量需以 API 返回为准。
聊天的上下文列表,包含多条消息。GPT 会针对最后一条消息,结合上下文生成回复。每条消息包含 role、name、content。
system(系统指令)、assistant(助手)、user(用户)。本次会话使用的模型版本。例如 gpt-3.5-turbo-1106 训练数据截止 2021 年 9 月,上下文窗口最大 16K;gpt-4-1106-preview 训练数据截止 2023 年 4 月,上下文窗口最大 128K。请根据需求选择最新稳定版。
本次 Completion 允许生成的最大 Token 数量。输入的 Token 数加上生成的 Token 数不能超过模型上下文窗口的上限。
采样温度,取值范围 0-2,默认 1。值越小输出越确定,值越大越随机。若设为 0,输出将高度一致;若过高可能导致不可读内容。
核采样参数,取值范围 0-1,默认 1。模型仅考虑累积概率达到 top_p 的标记。通常与 temperature 二选一,不建议同时调整。
用于降低重复 Token 的可能性。频率惩罚基于 Token 出现频率,存在惩罚基于 Token 是否出现过。取值范围 -2.0 到 2.0,默认 0。负值可增加重复,正值限制重复。
种子值。使用相同的种子和其他参数,可尽可能复现相同结果,提高输出的确定性。
生成停止条件。当遇到指定字符串时停止生成。最多支持 4 个停止序列。
强制指定输出格式。虽然可在提示词中要求,但加上此参数可确保生成内容的结构符合预期(如 JSON)。
是否流式输出。设置为 True 时,服务器会持续推送生成的片段,体验更接近真人对话,适合前端实时渲染。
流式输出通过迭代 stream 对象获取数据块。每个块包含 choices 列表,需检查 delta.content 是否存在再打印,以避免空值报错。
for chunk in stream:
if chunk.choices and len(chunk.choices) > 0:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end='')
网络波动或 API 限流可能导致请求失败。建议添加异常捕获机制,并在发生特定错误(如 RateLimitError)时实施指数退避重试。
from openai import RateLimitError
import time
max_retries = 3
for attempt in range(max_retries):
try:
# 执行请求
break
except RateLimitError:
wait_time = 2 ** attempt
print(f"请求受限,等待 {wait_time} 秒后重试...")
time.sleep(wait_time)
except Exception as e:
print(f"未知错误:{e}")
break
.env 文件配合 python-dotenv 库加载环境变量。本文详细介绍了使用 Python 和 OpenAI API 构建聊天程序的完整流程。从环境配置、SDK 安装到核心代码实现,涵盖了 Token 概念、参数调优、流式处理及安全规范。掌握这些基础后,开发者可进一步探索 Function Calling、RAG(检索增强生成)等高级应用场景,构建更复杂的 AI 应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online