1. 课程导入

各位同学,咱们今天正式开课。说实话,每次带新人入门大模型,我第一件事就是让他们把 API 调通。不是因为我喜欢折腾,而是因为——你连接口都调不通,后面那些工具编排、Agent 设计全是空中楼阁。

这一章,咱们就死磕三个东西:怎么拿到 API Key、怎么发请求、怎么读懂响应。嗯,听起来简单,但我在项目里见过太多人在这上面翻车了。

1.1 OpenAI API 入门:先跑通再说

先别管什么架构设计、什么高并发。第一步,让模型回你一句话。

我个人习惯用 Python 的 openai 库,版本 >= 1.0。安装就一行:

pip install openai

然后,写个最简单的调用:

from openai import OpenAI

client = OpenAI(api_key="你的key")
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "你好,请用一句话介绍大模型接口"}
    ]
)
print(response.choices[0].message.content)

跑完这段,如果控制台输出了中文回答,恭喜你,入门了。

我的小习惯: 刚开始调试时,别用 gpt-4,用 gpt-4o-mini 或 gpt-3.5-turbo。速度快、成本低,等逻辑调通了再换大模型。我在项目里吃过亏——调试时一直用 gpt-4,一天烧掉几十美金,心疼得不行。

1.2 API Key 管理与安全:别把钥匙挂门上

API Key 是什么?说白了,就是你家大门的钥匙。谁拿到它,谁就能用你的账号调用模型,花你的钱。

我曾经见过一个团队,把 API Key 直接写在代码里,还上传到了 GitHub 公开仓库。结果呢?半夜被人扫到,一晚上跑了上千次调用,账单多了几千美金。嗯,血的教训。

所以,请记住这几条铁律:

  • 永远不要硬编码 Key。用环境变量,或者专门的密钥管理服务。
  • 设置用量限制。OpenAI 后台可以设月度上限,我一般设一个略高于预期的值,防止异常暴涨。
  • 定期轮换 Key。我每三个月换一次,旧 Key 及时吊销。
  • 区分开发和生产 Key。别混用,否则调试时误操作可能影响线上。

环境变量用法示例:

import os
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
避坑指南: 我曾经在 .env 文件里写 Key,然后不小心把 .env 提交到了 Git 仓库。虽然马上删了,但历史记录里还有。正确的做法是:把 .env 加到 .gitignore,并且用 git filter-branch 清理历史。别问我怎么知道的。

1.3 请求与响应结构解析:看懂黑盒子里在传什么

调通了,也安全了。接下来,咱们得搞清楚——你发出去的是什么,收回来的是什么。

请求结构

一个典型的 Chat Completion 请求,核心就三个部分:

字段 说明 我常用的值
model 模型名称 gpt-4o-mini / gpt-4
messages 对话消息列表 包含 role 和 content
temperature 随机性控制(0-2) 0.7(创意任务)或 0.1(精确任务)

messages 数组里,每个元素都有 role 和 content。role 有三种:

  • system:设定模型的行为和角色。比如“你是一个资深的 Python 工程师”。
  • user:用户的输入。就是你要问的问题。
  • assistant:模型的回复。在多轮对话中,你需要把之前的回复也传回去。

举个例子,一个带上下文的请求:

messages = [
    {"role": "system", "content": "你是一个幽默的助手"},
    {"role": "user", "content": "给我讲个笑话"},
    {"role": "assistant", "content": "为什么程序员总是混淆万圣节和圣诞节?因为 Oct 31 == Dec 25!"},
    {"role": "user", "content": "再来一个"}
]

响应结构

响应体看起来有点复杂,但核心就几个字段:

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1700000000,
  "model": "gpt-4o-mini",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "这是模型的回答"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 10,
    "total_tokens": 35
  }
}

你真正关心的,其实就两个:

  • choices[0].message.content —— 模型的回答文本
  • usage.total_tokens —— 这次调用花了多少 token,直接跟钱挂钩
为什么 choices 是个数组? 因为你可以设置 n 参数,让模型一次返回多个候选回答。我一般在做 A/B 测试或需要多样性时用这个,平时 n=1 就够了。

1.4 核心流程:一张图看懂

下面这张图,把整个调用链路串起来了。你每次调 API,本质上就是走这个流程:

OpenAI API 调用核心流程 客户端应用 API 请求 OpenAI 服务 模型推理 API 响应 解析结果 关键说明: 1. 每次请求都携带 API Key 进行身份验证 2. 请求中的 messages 数组决定了模型的上下文 3. 响应中的 choices 数组包含模型生成的内容

1.5 常见错误与排查

调接口嘛,哪有不报错的。我整理了几个最常见的,你遇到了别慌:

错误码 原因 怎么解决
401 API Key 无效或过期 检查 Key 是否正确,是否已吊销
429 请求频率超限 加 sleep 或使用退避策略
400 请求参数格式错误 检查 messages 结构、model 名称
500 服务端异常 等几秒重试,一般能恢复
我的调试技巧: 遇到 400 错误时,先把 messages 打印出来看看。我遇到过好几次,是因为 messages 里混了 None 值或者 content 字段拼写错了。Python 的 json.dumps 是你的好帮手。