共计 2603 个字符,预计需要花费 7 分钟才能阅读完成。
核心概念:ChatGPT 如何工作
ChatGPT 是 OpenAI 基于 GPT 模型开发的对话 AI,它的核心是通过分析输入的文本(称为 prompt),预测并生成最合适的回复。API 调用本质上是向 OpenAI 的服务器发送请求,携带你的 prompt 和参数配置,然后接收生成的文本响应。

- 关键术语:
prompt:你输入的对话或指令,决定了 AI 的回复方向temperature:控制回复的随机性(0- 2 之间,值越高越有创意)max_tokens:限制回复的最大长度(1 个 token≈0.75 个英文单词)
环境准备
-
确保安装 Python 3.7+,推荐使用虚拟环境:
python -m venv chatgpt_env source chatgpt_env/bin/activate # Linux/Mac chatgpt_env\Scripts\activate # Windows -
安装必要库:
pip install openai python-dotenv -
获取 OpenAI API Key:
- 访问 OpenAI 平台 创建账户
- 在 API Keys 页面生成密钥(注意保密!)
- 在项目根目录创建
.env文件保存密钥:OPENAI_API_KEY= 你的实际密钥
代码实战
基础 API 调用(含错误处理)
import openai
from dotenv import load_dotenv
import os
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
def chat_with_gpt(prompt):
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=150
)
return response.choices[0].message.content
except Exception as e:
print(f"API 调用出错: {str(e)}")
return "抱歉,服务暂时不可用"
# 测试调用
print(chat_with_gpt("用简单语言解释量子计算"))
多轮对话上下文管理
dialogue_history = []
def multi_turn_chat(new_message):
global dialogue_history
# 添加用户新消息到历史
dialogue_history.append({"role": "user", "content": new_message})
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=dialogue_history,
temperature=0.7
)
# 获取 AI 回复并保存到历史
ai_reply = response.choices[0].message.content
dialogue_history.append({"role": "assistant", "content": ai_reply})
return ai_reply
except openai.error.InvalidRequestError as e:
# 处理 token 超限情况
if "maximum context length" in str(e):
# 移除最早的两轮对话(1 问 1 答)dialogue_history = dialogue_history[2:]
return "对话过长,已清除部分历史。请继续提问。"
raise
# 测试多轮对话
print(multi_turn_chat("推荐北京的美食"))
print(multi_turn_chat("人均 300 元以内的有吗?"))
避坑指南
1. Token 长度限制处理
- GPT-3.5-turbo 上限为 4096 tokens(包含请求和回复)
- 解决方案:
- 定期清理早期对话历史(如上文代码所示)
- 对长文本进行摘要处理后再输入
2. 内容安全过滤
def is_safe_content(text):
"""简易内容安全检查"""
banned_words = ["暴力", "色情", "政治敏感词示例"] # 实际需更完善的词库
return not any(word in text for word in banned_words)
# 在调用 API 前检查
user_input = "用户输入内容"
if not is_safe_content(user_input):
print("包含不安全内容")
else:
response = chat_with_gpt(user_input)
3. 异步调用优化
import asyncio
async def async_chat(prompt):
try:
response = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
except Exception as e:
print(f"异步调用失败: {e}")
# 使用示例
async def main():
tasks = [async_chat(f"问题{i}") for i in range(3)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
进阶建议
定制 prompt 的技巧
- 角色设定:明确 AI 的身份(如 ” 你是一位资深厨师 ”)
- 格式要求:指定回复结构(如 ” 用三点概括,每点不超过 20 字 ”)
- 示例引导:提供输入输出示例(few-shot learning)
对话日志分析
- 记录完整对话历史(含时间戳、用户 ID)
- 分析高频问题和回复满意度
- 识别需要改进的 prompt 模式
思考题
- 如果在多轮对话中需要保持某个关键信息(如用户偏好),如何设计上下文管理策略?
- 当需要处理专业领域问题时(如法律咨询),如何通过 prompt 工程提高回复准确性?
- 如何平衡对话历史的丰富性(提供足够上下文)与 token 消耗的限制?
在实际项目中,建议从简单功能开始,逐步增加复杂性。遇到问题时,OpenAI 的 官方文档 始终是最权威的参考来源。
正文完
