🎯 学习目标
- 理解 API 调用的标准流程:构造请求 → 发送请求 → 解析响应
- 掌握
requests库发送 POST 请求的基本方法 - 理解大模型 API 的核心参数:
model、messages、temperature - 能用
python-dotenv安全管理 API Key
一、API 调用的基本流程
- 三步走
1. 构造请求(URL、Headers、Body)2. 发送请求(POST)3. 解析响应(JSON → 提取文本)
- 大模型 API 的核心要素
| | |
|---|
| | https://api.openai.com/v1/chat/completions |
| | Authorization: Bearer sk-xxx |
| | {"model": "...", "messages": [...]} |
二、用 requests 发送请求
- 安装 requests
pip install requests
- 构造请求
import requestsimport jsonfrom dotenv import load_dotenvimport osload_dotenv()api_key = os.getenv("OPENAI_API_KEY") # 或其他兼容接口的 Keybase_url = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1") # 兼容自定义端点url = f"{base_url}/chat/completions"headers = {"Authorization": f"Bearer {api_key}","Content-Type": "application/json"}data = {"model": "gpt-3.5-turbo", # 模型名称"messages": [ {"role": "system", "content": "你是一个有帮助的助手。"}, {"role": "user", "content": "什么是机器学习?用一句话回答"} ],"temperature": 0.7# 0~2,越高越随机}
- 发送请求并解析
try: response = requests.post(url, headers=headers, json=data, timeout=30) response.raise_for_status() # 如果状态码不是200,抛出异常 result = response.json() reply = result["choices"][0]["message"]["content"] print(f"🤖 回复:{reply}")except requests.exceptions.RequestException as e: print(f"❌ 请求失败:{e}")
三、messages 的三种角色
- 多轮对话:把历史加入 messages
messages = [ {"role": "system", "content": "你是一个Python老师"}, {"role": "user", "content": "什么是列表?"}, {"role": "assistant", "content": "列表是Python的有序容器..."}, {"role": "user", "content": "它和元组有什么区别?"} # 新问题]# AI 会根据上下文回答"和元组的区别"
四、封装为函数
defcall_llm(user_input, system_prompt="你是一个有帮助的助手", history=None):"""调用大模型API""" messages = [{"role": "system", "content": system_prompt}]# 加入历史if history: messages.extend(history)# 加入当前输入 messages.append({"role": "user", "content": user_input}) data = {"model": "gpt-3.5-turbo","messages": messages,"temperature": 0.7 }try: response = requests.post(url, headers=headers, json=data, timeout=30) response.raise_for_status() result = response.json() reply = result["choices"][0]["message"]["content"]return replyexcept Exception as e:returnf"[错误] {e}"# 使用answer = call_llm("用Python写一个Hello World")print(answer)
⚠️ 常见坑
- 绝对不要硬编码在代码里!用
.env+.gitignore
- 大模型响应可能较慢,一定要设置
timeout=30甚至更长
- 先检查
response.status_code是否为 200 - 用
response.raise_for_status()自动检查
✍️ 实战练习
- 要求:配置好
.env,运行上面的代码,成功获取回复 - 提示:如果没有 OpenAI Key,可以使用国内兼容接口(如 DeepSeek、智谱等),只需修改
base_url和model
- 要求:手动维护一个
messages列表,循环输入,每次把回复加入列表
✅ 自测清单
- [ ] 理解 API 调用的三步:构造请求 → 发送 → 解析
- [ ] 能用
requests.post()发送 JSON 请求 - [ ] 理解
messages中system、user、assistant 三种角色的作用