一次面试上,面试官问了一个看似基础的问题:“你了解模型API的调用吗?API请求里都包含什么?”

我自信满满地回答:“就是URL、API Key,还有现在很多都兼容OpenAI的格式……”

面试官笑了笑,追问:“协议里面还包含什么?系统提示词呢?Messages呢?参数呢?”

那一刻我意识到——我每天都在“调用API”,却从未真正看过一次完整的API请求长什么样。

这篇文章,就是我对那次面试的完整复盘。我会从一次真实的API调用出发,逐层拆解一个完整的模型API请求里到底有什么,每个参数是干什么的,以及如何调优。知识全部来源于官方文档,希望能帮你避开我踩过的坑。

首先来个大纲速览,方便复习使用:

一、一次完整的API调用,长什么样?

先看一个最基础的Chat Completions API请求(非流式):

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "system",
      "content": "你是一位专业的Python编程助手,请用简洁清晰的方式回答问题。"
    },
    {
      "role": "user",
      "content": "如何在Python中实现一个简单的装饰器?"
    }
  ],
  "temperature": 0.7,
  "max_tokens": 500,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0,
  "stream": false
}

这是发给 https://api.openai.com/v1/chat/completions 的POST请求体。同时,HTTP Header中还需要携带:

Authorization: Bearer sk-你的API密钥
Content-Type: application/json

就这么一个请求,背后包含了鉴权、模型选择、对话上下文、生成参数四个层面的信息。面试时我只说了URL和Key,相当于只看到了冰山露出水面的一角。

接下来,我们逐层拆解。

二、逐层拆解:一个API请求的完整构成

1. 鉴权(Authentication)—— 你是谁?

所有OpenAI API请求都必须在HTTP Header中包含API密钥:

Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

如果你属于多个组织,还可以通过 OpenAI-Organization 头指定使用哪个组织的配额。

关键点

  • API Key在平台后台生成,绝不能提交到代码仓库

  • 生产环境应使用环境变量或密钥管理服务

  • Bearer是固定前缀,后面直接跟Key,没有空格问题

2. Model —— 你用哪个模型?

model 是必填参数,指定你要调用哪个模型:

常用模型包括:

  • GPT-4o:多模态,速度与能力均衡

  • GPT-4o-mini:轻量级,成本更低

  • o1-preview / o1-mini:深度推理,数学和逻辑能力强

  • GPT-4-turbo:传统GPT-4系列

不同的模型有不同的上下文长度能力边界,选型直接影响效果和成本。

3. Messages —— 对话的核心

messages 是必填参数,它是一个数组,包含完整的对话历史。每个消息对象包含 role 和 content

三种核心角色
Role 说明 特点
system 系统提示词,定义模型的行为准则 只能出现在messages[0]位置
user 用户输入 最后一个message的role必须为user
assistant 模型的历史回复 用于多轮对话,和user交替出现
多轮对话的正确拼接方式
messages = [
    {"role": "system", "content": "你是一个数学老师"},
    {"role": "user", "content": "1+1等于几?"},
    {"role": "assistant", "content": "1+1等于2。"},
    {"role": "user", "content": "那2+2呢?"}  // 最新问题必须是user
]

关键规则

  • system只能在开头

  • user和assistant必须交替出现

  • 最后一个message必须是user

多模态支持

content不仅可以是字符串,还可以是数组,支持文本和图片混合输入:

{
  "role": "user",
  "content": [
    {"type": "text", "text": "这张图里有什么?"},
    {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
  ]
}

图片可以是URL或base64编码的数据。

4. 生成参数 —— 控制模型怎么“想”

Temperature(温度)

控制输出的随机性,取值范围0-2。

取值 效果 适用场景
0.0 - 0.3 确定性高,几乎每次输出相同 事实性问答、代码生成、分类任务
0.5 - 0.7 平衡创造性和准确性 通用对话、内容创作
0.8 - 1.2 创造性高,输出多样 头脑风暴、创意写作

原理:Temperature影响softmax函数中概率分布的“锐度”。值越低,高概率token被进一步放大,低概率token被压制;值越高,概率分布越平滑,低概率token也有机会被选中。

最佳实践:一般建议调整temperature或top_p中的一个,不要同时大幅调整两者。

Top_p(核采样)

取值范围0-1,默认1.0。它限定模型只从累积概率达到p的最可能token集合中采样。

举例:如果top_p=0.1,模型只考虑构成前10%概率质量的那些token。

temperature vs top_p

  • temperature:调整整个概率分布的“平滑度”

  • top_p:裁剪token候选集的大小

两者都可以控制随机性,但机制不同。一般选一个调就行。

Max_tokens(最大输出长度)

控制模型最多生成多少个token。注意:prompt的token数 + max_tokens不能超过模型的上下文长度

模型 上下文长度 建议max_tokens
GPT-4o 128K 根据任务调整,一般2K-8K
GPT-4o-mini 128K 同上
o1-preview 128K 复杂推理可设高一些
其他重要参数
参数 说明 取值范围
frequency_penalty 频率惩罚,降低重复已有token的概率 -2.0 ~ 2.0
presence_penalty 存在惩罚,鼓励谈论新话题 -2.0 ~ 2.0
seed 随机种子,相同seed可复现结果 整数
response_format 强制输出格式,如JSON {"type": "json_object"}
stop 停止序列,遇到即停止生成 字符串或数组
stream 是否流式输出 true/false

5. Tools / Function Calling —— 让模型调用外部能力

这是目前AI应用开发中最核心的能力之一。Function Calling允许模型返回结构化的函数调用指令,而不是纯文本

基本流程
  1. 你在请求中定义tools(用JSON Schema描述函数)

  2. 模型判断是否需要调用工具,如果需要,返回tool_calls

  3. 你的应用执行对应的函数

  4. 可选:将执行结果返回给模型,生成最终回答

代码示例
{
  "model": "gpt-4o",
  "messages": [
    {"role": "user", "content": "帮我查一下北京今天的天气"}
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取指定城市的天气信息",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名称"
            }
          },
          "required": ["city"]
        }
      }
    }
  ],
  "tool_choice": "auto"
}

模型会返回:

{
  "role": "assistant",
  "tool_calls": [
    {
      "id": "call_abc123",
      "type": "function",
      "function": {
        "name": "get_weather",
        "arguments": "{\"city\": \"北京\"}"
      }
    }
  ]
}

你的应用解析arguments,执行get_weather函数,然后把结果传回模型生成最终回复。

重要提示:旧版API使用 functions 和 function_call 参数,现已弃用,新代码应统一使用 tools 和 tool_choice

三、响应结构:模型返回了什么?

一个典型的非流式响应:

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1700000000,
  "model": "gpt-4o",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "在Python中,装饰器是一种高阶函数..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 45,
    "completion_tokens": 120,
    "total_tokens": 165
  }
}

关键字段

  • choices[0].message.content:模型的回复内容

  • finish_reason:停止原因(stop正常结束、length达到max_tokens、tool_calls需要调用工具等)

  • usage:token消耗统计,直接影响计费

四、常见错误与排查

HTTP状态码 含义 排查方法
401 Unauthorized API密钥无效或缺失 检查Authorization头和Key是否正确
400 Bad Request 请求参数错误 检查JSON格式、必填参数、参数取值范围
429 Too Many Requests 请求频率超限 降低请求频率,或提升速率限制
500 Internal Server Error 服务端错误 重试,如持续出现联系官方支持

调试建议:先检查HTTP状态码和错误消息,大部分问题都能从错误消息中定位。

五、扩展:Anthropic Messages API

除了OpenAI,Claude的API也越来越常用。Anthropic的Messages API在结构上有所不同:



{
  "model": "claude-3-5-sonnet-20241022",
  "max_tokens": 1024,
  "system": "你是一位专业的编程助手",
  "messages": [
    {"role": "user", "content": "帮我写一个Python排序函数"}
  ]
}

主要差异

  • system不在messages数组里,而是独立的顶层字段

  • max_tokens是必填参数(OpenAI是可选的)

  • 请求地址是 https://api.anthropic.com/v1/messages

了解不同提供商的API差异,能帮你更灵活地做技术选型。

六、总结

回到面试官的问题——一个完整的API请求里到底包含什么?

答案是:鉴权 Header + 模型选择 + 对话消息(含系统提示词)+ 生成参数 + 工具定义(可选)

这五个部分,每一部分都有深挖的空间。面试官真正想考察的不是你背不背得出参数列表,而是:

  1. 你是否真的调过API,还是只会用封装好的SDK?

  2. 你是否理解每个参数的意义,还是复制粘贴别人的配置?

  3. 当效果不理想时,你知道调哪个参数、怎么调吗?

那次面试之后,我用curl完整地发了一次API请求,亲眼看到请求体和响应体,还把OpenAI的API Reference从头到尾看了一遍。

不要只做API的“使用者”,要做API的“理解者”。


参考来源:OpenAI官方API Reference、Anthropic官方文档、OpenAI Function Calling官方指南

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐