AiLinkLab Blog

发布于

- 7 分钟阅读

OpenAI 兼容性 API chat completion 报文结构

OpenAI API Schema 开发指南
img of OpenAI 兼容性 API chat completion 报文结构

开篇闲聊

不要把大模型的 API 理解成一个黑盒,而是要理解它的内部结构,这样才能更好地使用它。这里我们就把大模型的 API 当做一个一般性的 API来理解。了解 API 的参数的含义,对 AI 模型的能力就有了一个更好的理解。

如果想了解更多关于 OpenAI API 的信息,可以参考以下链接: OpenAI的完整接口标准定义文档

为什么要了解 OpenAI 的接口?原因很简单:

  1. OpenAI 是行业的先行者,他们的接口设计已经成为了一种标准
  2. 现在市面上很多大模型都在兼容 OpenAI 的接口,了解这个就等于掌握了一把万能钥匙
  3. 理解接口的每个参数,就能更好地控制 AI 模型的行为

Chat Completion 接口:最常用的对话接口

OpenAI 的完整报文 Schema 定义参见链接,内容太多,重点聊下几个重要的部分。

以下是 /chat/completions 接口的 Body 报文结构说明:

字段名类型必填默认值描述
modelstring-模型名称,可选值具体模型文档
messagesobject[]-对话消息列表,包含 roleuser/assistant/system/tools)和 content(消息内容)。
streambooleanfalse是否启用流式返回,启用时 tokens 以 Server-Sent Events 形式返回。
max_tokensinteger512生成的最大 token 数,范围:1 < x < 8192
stopstring[]/null["null"]终止生成的序列(最多 4 个),返回文本不包含该序列。
temperaturenumber0.7控制输出随机性,值越高随机性越强(范围通常为 0-2)。
top_pnumber0.7核采样参数,动态调整预测 token 的选择范围。
top_knumber50采样时考虑的 top-k 个 token。
frequency_penaltynumber0.5频率惩罚,抑制重复 token 的生成。
ninteger1生成结果的数量。
response_formatobject{"type": "text"}输出格式对象。
toolsobject[]-工具调用列表(函数调用),包含 type: "function" 和函数元数据。

示例请求 Body

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "2025年将会迎来哪些机遇和挑战?"
    }
  ],
  "stream": false,
  "max_tokens": 512,
  "temperature": 0.7,
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "analyze_industry_trend",
        "description": "分析大模型行业趋势",
        "parameters": {
          "year": 2025,
          "region": "中国"
        }
      }
    }
  ]
}

核心参数解析

  1. 选择你的 AI 搭档(model)
"model": "gpt-3.5-turbo"

这就像是在选择不同级别的老师,有的擅长创意写作,有的擅长代码分析。不同模型的能力和价格都不一样,你可以根据需求选择。

  1. 对话历史(messages)

这就是你和 AI 的聊天记录,包含几种角色:

  • user(你):发问的人
  • assistant(AI):回答的助手
  • system(系统):像是在给 AI 定规矩
  • tools(工具):AI 使用工具后返回的结果
  1. 控制 AI 的发挥程度
  • temperature (温度):范围 0-2

    • 设为 0:AI 变得严谨保守,回答很确定
    • 设为 1:AI 会适当发挥,回答更有创意
    • 设为 2:AI 天马行空,回答很有想象力
  • max_tokens (字数限制):

    • 想象成给 AI 限定写作的字数
    • 一个汉字大约等于 2 个 tokens
    • 设置合理的值可以避免浪费和超支
  1. 让对话更流畅(stream)
"stream"true

开启这个选项,AI 的回答会像人类打字一样一个字一个字地显示,而不是一次性蹦出来,体验更好。

  1. 避免重复(frequency_penalty 和 presence_penalty)
  • frequency_penalty (词频惩罚):

    • 正值(0.1 到 2.0):让 AI 少用重复的词
    • 负值(-2.0 到 -0.1):鼓励 AI 重复使用词语
    • 0:保持中立,不干预
  • presence_penalty (主题惩罚):

    • 正值:鼓励 AI 聊新话题
    • 负值:让 AI 继续深入当前话题
    • 0:自然过渡
  1. 采样控制(top_p 和 top_k)
  • top_p (核采样):

    • 范围 0-1,默认 0.7
    • 值越小,AI 回答越保守
    • 值越大,AI 回答越多样
    • 建议不要和 temperature 一起调整
  • top_k (Top-K 采样):

    • 默认值 50
    • 控制 AI 每次选词时考虑的候选词数量
    • 数值越小,回答越保守
  1. 多样性输出(n)
"n": 3
  • 让 AI 一次给出多个不同的回答
  • 默认值是 1
  • 数值越大,API 费用越高
  • 建议配合高 temperature 使用
  1. 格式控制(response_format)
"response_format": {"type""json_object"}
  • 控制 AI 回答的格式
  • text :普通文本(默认)
  • json_object :JSON 格式
  1. 终止序列(stop)
"stop": ["结束""完毕"]
  • 设置特定的词语作为回答的终止标记
  • 最多可以设置 4 个终止序列
  • AI 遇到这些词就会停止生成
  1. 工具调用(tools) tools 参数让 AI 能够调用外部工具来完成特定任务。这就像给 AI 配备了一个工具箱,需要时可以拿出合适的工具来用。
"tools": [
    {
        "type""function",
        "function": {
            "name""get_weather",
            "description""获取指定城市的天气信息
            ",
            "parameters": {
                "type""object",
                "properties": {
                    "city": {
                        "type""string",
                        "description""城市名称
                        "
                    },
                    "date": {
                        "type""string",
                        "description""查询日
                        期,格式:YYYY-MM-DD"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

工具参数说明

  1. type :工具类型

    • 目前主要支持 “function”(函数调用)
    • 未来可能会支持更多类型
  2. function :函数定义

    • name :函数名称,要简单明确
    • description :函数功能描述
    • parameters :函数参数定义
      • 使用 JSON Schema 格式
      • 可以定义必填和选填参数
      • 支持各种数据类型

实用小技巧

  1. 创意性任务(如写故事):

    • 调高 temperature(0.8-1.0)
    • 适当提高 top_p(0.9)
    • 可以设置多个候选答案(n > 1)
  2. 严谨性任务(如代码生成):

    • 调低 temperature(0.2-0.4)
    • 降低 top_p(0.5)
    • 使用 system 角色设定严格的规则
  3. 长对话场景:

    • 合理设置 max_tokens
    • 使用 presence_penalty(0.3-0.5)避免话题重复
    • 可以考虑开启 stream 提升体验
  4. 控制成本:

    • 设置合适的 max_tokens
    • 避免过高的 n 值
    • 必要时才开启 stream