ChatGPT API 基础知识常见问题(FAQ)

Kevin
Table of Contents

什么是 ChatGPT API?

ChatGPT API 是 OpenAI 提供的基于 GPT 系列大语言模型的通用对话接口。它允许开发者通过简单的 HTTP 请求调用强大的自然语言处理能力,用于对话生成、问答系统、摘要、文本改写、智能助手等场景。

ChatGPT API 主要基于 ChatCompletion 接口,其核心使用方法是:

  • 调用方式:调用 /v1/chat/completions 端点,发送 JSON 数据获取 AI 响应
  • 核心参数:model(模型名称)、messages(对话历史)、temperaturemax_tokens
  • 返回结构: JSON 格式,包括 choices 数组,每项含有 message 字段和 finish_reason

示例请求(Python SDK)

python
import openai

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "你好"}]
)

print(response.choices[0].message.content)

请求结构说明

  • model: 指定使用的模型名称,例如 gpt-3.5-turbo、gpt-4、gpt-4o
  • messages: 是一个有序数组,描述对话上下文,包括 system、user、assistant 三种角色
  • temperature: 控制输出的随机性(0 到 2,越高越随机)
  • max_tokens: 限制回复的最大 token 数量,控制成本与长度

与 Web 版 ChatGPT 的区别

项目ChatGPT 网页版ChatGPT API接口类型人机交互 UI编程调用 API会话存储自动保存上下文需开发者管理 messages模型调用固定模型版本可指定模型版本定价方式基于订阅按 token 使用计费

使用建议

  • 为避免冗余 token,需适当清理旧消息或使用摘要替换
  • 注意上下文限制,例如 GPT-3.5 最大为 16k tokens,GPT-4o 可达 128k tokens
  • 模型本身支持多语言对话,无需特殊配置即可处理中文、英文等语言

常见用途示例

  • 智能客服系统
  • 多轮对话式问答
  • 自动内容生成工具(摘要、翻译、改写)
  • 面向开发者的 AI 辅助代码生成器

推荐参考资料

ChatCompletion 与旧版 Completions 有何区别?

OpenAI 提供了两种主要的文本生成接口:/v1/completions 和 /v1/chat/completions。虽然它们底层都依赖 GPT 模型,但两者在使用方式、模型兼容性、参数结构和推荐用途上存在本质差异。

1. 接口结构对比

对比项/v1/completions/v1/chat/completions
接口用途文本补全(早期接口)多轮对话/角色扮演(新接口)
输入格式单个 prompt 文本多轮对话的 messages 数组
模型支持text-davinci-003、curie、babbage、adagpt-3.5-turbo、gpt-4、gpt-4o 等
推荐使用场景简单补全、少量提示设计聊天机器人、上下文丰富的问答、插件调用
参数结构prompt、temperature、max_tokens 等model、messages、stream、function_call 等

2. ChatCompletion 的 messages 构造方式

使用 /v1/chat/completions 时,必须传入一个 messages 参数,它是一个数组,每项包含:

json
{
  "role": "system" | "user" | "assistant",
  "content": "文本内容"
}

系统消息用于设定助手的行为,用户消息表示用户输入,助手消息为模型回复历史。这种结构适合模拟真实对话场景,有利于更精确的上下文控制和对模型行为的引导。

3. 错误兼容性与提示

如果将 Chat 模型(如 gpt-3.5-turbo)错误地用于 /v1/completions,将会收到如下错误:

json
{
  "error": {
    "message": "This is a chat model and not supported in the v1/completions endpoint.",
    "type": "invalid_request_error",
    "code": null
  }
}

该错误提示明确指出模型类型与接口不兼容。

4. 实际使用建议

  • 如果你正在开发对话类应用、助手工具或需要上下文管理的任务,应使用 * /v1/chat/completions *。
  • 对于传统 prompt 补全类任务(如文本扩写、摘要、翻译等)且不涉及多轮上下文,可以仍用 * /v1/completions *,但需确认模型支持。
  • 官方推荐的新开发应优先使用 ChatCompletion 接口,因其支持更多高级功能,如函数调用(Function Calling)、工具调用、上下文缓存等。

5. 示例代码(Python OpenAI SDK)

ChatCompletion:

python
response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": "你是一个专业助手"},
    {"role": "user", "content": "什么是 ChatCompletion?"}
  ]
)
print(response.choices[0].message.content)

Completions:

python
response = openai.Completion.create(
  model="text-davinci-003",
  prompt="解释 ChatCompletion 和 Completion 的区别",
  max_tokens=200
)
print(response.choices[0].text)

6. 功能差异概览

功能项ChatCompletionCompletions
多轮上下文支持支持需自行拼接
system 角色控制支持不支持
函数调用支持支持不支持
插件工具扩展支持不支持
高性能模型支持支持(gpt-4o等)不支持

7. 总结

ChatCompletion 是对旧有 Completions 接口的结构性升级,专为对话设计,兼容更先进的模型及功能,是未来开发者的主力接口。

如无特定需求,建议新项目一律使用 * /v1/chat/completions *。

参考资料

ChatGPT API 支持哪些模型?

OpenAI 的 ChatGPT API 已扩展为支持多个对话模型系列,开发者可以根据应用场景、性能需求和预算灵活选择。

当前支持的模型系列

以下模型可通过model 参数在调用 ChatGPT API 时指定:

模型名称上下文长度特点定价(2025年6月)
gpt-3.5-turbo16k tokens速度快、成本低,适合大多数通用对话任务$0.0005/1K tokens(输入)$0.0015/1K tokens(输出)
gpt-48k / 32k tokens推理能力更强,适合复杂任务和深度理解应用$0.03/$0.06 输入,$0.06/$0.12 输出(8k/32k)
gpt-4-turbo128k tokensGPT-4 的优化版,速度更快、价格更低$0.01/1K tokens(输入)$0.03/1K tokens(输出)
gpt-4o128k tokens全模态模型(文字、图像、音频),目前 API 支持文本模式$0.005/1K tokens(输入)$0.015/1K tokens(输出)
gpt-4o-mini(测试中)更小型的 4o 版本,可能用于成本敏感场景

模型选择建议

根据任务复杂性和预算,可以参考以下建议:

  • 日常问答/客服机器人:gpt-3.5-turbo
  • 需要更长上下文/高级摘要:gpt-4-turbo
  • 图文混合、全模态应用:gpt-4o
  • 预算敏感、响应速度优先: 继续观察 gpt-4o-mini 表现

模型更新机制

OpenAI 会不定期更新模型版本。建议开发者:

  • 显式指定模型版本(如 gpt-4o-2024-05-13)避免模型更新带来响应变化
  • 关注 OpenAI 官方发布日志 获取模型版本更新信息

示例:指定模型调用

python
import openai

response = openai.ChatCompletion.create(
  model="gpt-4o",
  messages=[{"role": "user", "content": "你好,今天要不要带伞?"}]
)
print(response["choices"][0]["message"]["content"])

微调和函数调用

是否可以 fine-tune(微调) ChatGPT 系列模型? 目前 GPT-4、GPT-3.5 Turbo 暂不支持微调,只能用于 prompt 设计或使用 Assistants API

是否所有模型都支持函数调用(function calling)? GPT-4、gpt-3.5-turbo、gpt-4o 等支持,可通过设置 * function_call="auto" * 实现。

参考资料

系统(system)、用户(user)、助手(assistant)角色有何作用?

在 ChatGPT API 的 messages 参数中,每一条消息都有一个 role 字段,其值通常为 system、user 或 assistant。这些角色并非仅作区分之用,而是用于协同构建对话上下文,引导模型生成目标一致、语境明确的回答。

三种角色的定义与作用

角色 说明
system设定对话助手的身份、语气、能力边界或行为风格,通常在对话开始时提供一次。
user表示用户发起的输入、提问或指令。
assistant表示模型(GPT)生成的响应,是模型“扮演助手”所输出的结果。

system 角色:系统提示词,用于设定模型行为

  • 是整个对话中最重要的控制工具,非可见回答
  • 常用于设定风格、专业性、角色设定、语言使用等:

例如:

json
{ 
  "role": "system", 
  "content": "你是一名专业的中文医生助手,回答时务必准确、简洁、友好。"
}

对比不同 system 提示词可以显著改变模型行为风格,例如:

  • “你是一个严格遵循 ISO 标准的工业咨询顾问”
  • “你是一个富有创意的写作搭档”

实践建议:

  • 避免在 system 消息中加入冗长上下文,这会占用 token。
  • 一般只放在消息数组开头一次即可,不必在每次调用重复设定。

user 角色:用户输入消息

  • 是最主要的触发机制,模型将围绕 user 消息进行推理和回应。
  • 内容可以是单句问题,也可以是长篇指令、结构化数据等。

例如:

json
{ 
  "role": "user", 
  "content": "请帮我总结以下段落的核心内容。" 
}

注意事项:

  • 用户输入越清晰、格式越好,模型理解能力越强。
  • 为复杂任务增加背景信息会提升结果质量。

assistant 角色:模型的响应内容

  • 表示模型已经做出的回答。
  • 这一角色用于构造对话历史上下文,维持多轮对话。

例如:

json
{ 
  "role": "assistant", 
  "content": "当然可以,我会将段落精简为要点如下..." 
}

在多轮对话中的应用:

为了让模型“记住”前文,可以传入这样的消息结构:

json
[
  { "role": "system", "content": "你是一位善于解释技术问题的 AI 助手。" },
  { "role": "user", "content": "解释一下什么是 token。" },
  { "role": "assistant", "content": "token 是模型用于理解文本的基本单位..." },
  { "role": "user", "content": "那我怎么控制 token 用量?" }
]

在这种结构中,模型会根据已有内容,生成与上下文一致的回答。

如何组织这些角色实现最佳上下文控制?

先设定 system,再用 user 提问,最后接收 assistant 回应。

构建完整上下文以支持多轮推理或信息保持。

避免反复重复 system 消息,建议用一次即可。

不要将模型输出误标为 user,否则会打乱对话流程。

参考文档

提示词(Prompt)和对话上下文如何构造?

构造高质量提示词(prompt)和对话上下文是使用 ChatGPT API 的核心技能,决定了生成内容的准确性、连贯性和成本控制能力。

提示词(Prompt)是什么?

在 ChatGPT API 中,Prompt 是模型生成响应的输入文本。对于 ChatCompletion 接口,Prompt 由一系列消息(message)组成,每条消息包含一个角色(role)和对应内容(content):

json
[
  {"role": "system", "content": "你是一个专业的中文法律助手"},
  {"role": "user", "content": "我想咨询一下合同法"},
  {"role": "assistant", "content": "当然,请问您具体想了解合同法的哪一方面?"},
  {"role": "user", "content": "合同解除的条件有哪些?"}
]

各字段含义:

字段名说明
role消息的角色,支持 system、user、assistant
content对应角色说的话,必须是纯文本字符串

使用 system 提示设计模型行为,是 prompt engineering 的核心策略之一。它不显示在输出中,但对模型生成影响极大。

对话上下文是什么?

对话上下文指的是模型在生成当前回答时可“看到”的前后信息,即传入 messages 数组中的历史信息。这包括所有 system、user 和 assistant 的消息,构成完整对话流。

模型不会记住你之前说过什么,每次调用 API 必须显式提供上下文

示例:构造多轮对话上下文

python
messages = [
  {"role": "system", "content": "你是一个幽默但专业的客服"},
  {"role": "user", "content": "你好,我的快递丢了"},
  {"role": "assistant", "content": "你好,先别急,我们来查查这件‘神秘失踪’的包裹!"},
  {"role": "user", "content": "那我该怎么办?"}
]

在上例中,第四条用户消息将会在前面对话上下文基础上继续生成新的回答。

上下文长度限制

token 包括输入和输出,建议保留足够空间给模型用于生成回答。每次 API 调用有 token 数量限制,超出会返回错误信息。

模型版本最大 token 长度
gpt-3.5-turbo 4096 tokens
gpt-4 (8k) 8192 tokens
gpt-4-32k 32768 tokens
gpt-4o 128k tokens

优化建议:

  • 定期清除最旧的消息
  • 将旧内容生成摘要再替换长文本
  • 控制 max_tokens 限制输出长度
  • 避免重复或无效的冗余提示

设计良好提示的建议(Prompt Engineering)

明确指令和期望输出

系统提示中写清楚身份和任务。例如:

“你是一个提供简洁回答的法律助手,请使用法律术语。”

使用上下文示例(Few-shot)

在对话中加入多个示例问答对,帮助模型理解格式。

加入输出要求

“请按以下格式回答…”、“用中文回答”等明确语言或结构要求。

控制风格与语气

使用 system 提示,例如:“用轻松、鼓励的语气回答用户”。

错误与注意事项

  • 上下文过长错误
    报错 “This model’s maximum context length is XXX tokens”,需删减历史对话或降低输入输出 token 数量。
  • 重复生成问题
    若模型不断重复旧对话内容,可清理冗余内容或更换 phrasing。
  • 高质量回答不等于长 prompt
    简洁清晰的提示通常更有效,避免 prompt 本身消耗过多 token。

推荐工具和文档

什么是 Streaming 模式?

概述

Streaming 模式(流式响应)是 OpenAI ChatGPT API 提供的一种返回机制。启用此模式后,模型不会一次性返回完整的响应,而是通过“事件流”(Event Stream)的方式,将生成内容按 数据块(chunk) 实时推送给客户端。这种设计特别适合需要快速反馈的应用场景,例如聊天机器人、实时文档撰写助手、AI 编程助手等。

使用方式

在调用 /v1/chat/completions 接口时,只需设置参数:

  • stream=true

即可开启流式输出模式。

例如:

python
response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "请解释牛顿第三定律"}],
    stream=True
)
for chunk in response:
    print(chunk.choices[0].delta.get("content", ""), end="")

输出数据结构中,每个 chunk 都是一个 JSON 对象,通过 HTTP 事件流(Server-Sent Events, SSE)机制发送,格式如下:

json
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk",...}

直到最后以delta标志结尾,标志对话结束。你需要在客户端自行拼接所有 delta.content 组成完整回答。

注意事项与最佳实践

1. 结束标识处理

始终监听是否收到了 data: [DONE],代表服务器完成此次推送。否则长连接可能会挂起或资源泄露。

2. 流连接中断处理

若连接超时或网络中断,需实现断线重连逻辑,建议使用 WebSocket 或 Fetch with AbortController 搭配超时机制。

3. 内容合并

由于每次返回仅是局部 delta 内容,开发者需在客户端缓存并拼接完整消息。

4. 性能开销

启用流模式后,每次调用是一个持续连接的会话,比传统请求更耗费带宽和资源。推荐仅在必要场景下启用。

其他语言实现示例

JavaScript (Node.js)

typescript
const openai = require("openai");

const completion = await openai.chat.completions.create({
  model: "gpt-4",
  messages: [{ role: "user", content: "介绍下流式响应" }],
  stream: true,
}, {
  responseType: "stream"
});

completion.data.on("data", (chunk) => {
  const payload = JSON.parse(chunk.toString().replace(/^data: /, ''));
  if (payload.choices?.[0]?.delta?.content) {
    process.stdout.write(payload.choices[0].delta.content);
  }
});

相关参考文档

ChatGPT API 返回的响应格式是什么样的?

当你使用 OpenAI 的 ChatGPT API(如调用 * /v1/chat/completions * 端点)时,模型的返回值以标准 JSON 格式提供。这种结构便于解析、调试和调控模型行为。

基本返回结构

一次成功的调用返回的 JSON 对象通常包括以下顶层字段:

json
{
  "id": "chatcmpl-7abcXYZ123",
  "object": "chat.completion",
  "created": 1689732049,
  "model": "gpt-4-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "你好,有什么我可以帮助你的吗?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 14,
    "total_tokens": 26
  }
}

字段解释:

字段名类型描述
idstring当前请求的唯一标识符
objectstring固定为 chat.completion
createdint时间戳(Unix)
modelstring实际返回响应的模型名,如 gpt-4
choicesarray返回的生成项数组,默认只有一项
messageobject返回内容,含有 role(通常为 "assistant")与 content(返回文本)
finish_reasonstring模型结束输出的原因,如 stop、length、function_call
usageobject本次调用消耗的 token 统计信息

finish_reason 值说明:

含义
stop模型自然完成回答
length达到最大 token 限制被截断
function_call使用了函数调用功能
content_filter内容被过滤机制拦截(较少出现)

错误响应结构

如果调用失败(如权限、参数等问题),返回的 JSON 会包含一个 error 对象:

json
{
  "error": {
    "message": "You exceeded your current quota.",
    "type": "insufficient_quota",
    "param": null,
    "code": "insufficient_quota"
  }
}

常见错误码对照表

HTTP 状态码含义典型场景
400参数错误缺失或格式错误
401 未授权 API Key 无效或缺失
403 权限禁止 账号无访问权限
429 速率限制 超过每分钟调用次数或 Token 使用量
500-599 服务错误 OpenAI 服务器故障,建议重试

开启函数调用或 streaming 时的变化

若开启 函数调用(function_call),则 choices[0].message 中将包含 function_call 字段,结构如下:

json
"function_call": {
  "name": "get_weather",
  "arguments": "{\"location\": \"北京\"}"
}

若设置 stream=true 开启流式输出,返回值将变为 data: 逐块返回的 Server-Sent Events 格式,需客户端逐块解析合并。

使用注意事项

  • 默认只返回 choices[0],但可通过设置 n 参数获取多个候选输出
  • usage 字段非常重要,用于计费分析和调试 Token 使用量
  • finish_reason 可用于判断回答是否完整,是否需要二次调用追加上下文

参考资料

ChatGPT API 支持多语言吗?

ChatGPT API 原生支持多语言输入与输出,这意味着你可以用中文、法语、日语、德语、西班牙语、韩语等多种自然语言与其进行交流。OpenAI 并未将其语言能力限制于英语,GPT 模型(尤其是 GPT-4 系列)在多语种表现上已有广泛应用和社区验证。

支持的语言类型

虽然 OpenAI 没有提供完整的“官方支持语言列表”,但根据模型训练数据和实际测试,它在以下语言中表现出相当强的理解与生成能力:

语言类型支持情况说明
中文包括简体与繁体
英语最强训练量最大,推理最准确
法语 / 德语 很好 具备良好上下文理解与语法生成能力
日语 / 韩语 较好 在日常对话和技术文档中表现稳定
阿拉伯语 / 俄语一般 支持但上下文一致性略弱于英语
小语种 有一定能力 准确率与自然度不如主流语种

你可以通过 messages 中设置 system prompt 来引导模型使用特定语言:

json
{
  "role": "system", 
  "content": "请用中文回答所有问题"
}

或者也可以直接用目标语言发问,模型会据此自动判断语言环境。

实践建议

  • 自动检测语言:无需额外语言字段,模型会根据输入内容自动识别。
  • 语言一致性:若上下文中混用多语言,模型可能会根据前后语境切换语言,建议保持语言一致。
  • 系统提示明确语种:对于多语言混合应用,最好用 system role 明确要求模型“使用 XX 语言回答”。

注意事项

  • 对于专业语言翻译(如法律、医学等),建议结合术语库或人工复核。
  • 多语言上下文长度处理同样受 Token 限制,尤其是某些语言(如汉字)每字符占用较少 token,但语义密集,需特别注意模型上下文窗口大小。

参考资料

ChatGPT API 是否具备自动聊天记忆能力?

ChatGPT API 本身不具备“聊天记忆”功能。每次调用都是一次独立请求,模型只会“看到”你传入的内容。想实现记忆,需要你在客户端自行构建并维护对话历史。

为何没有自动记忆?

ChatGPT API(例如 gpt-3.5-turbo、gpt-4)是一个无状态的语言模型服务。这意味着:

  • 每次请求都是一次性事件
  • 模型不会保存、记住或自动回顾之前的对话
  • 所有上下文都必须通过 messages 参数显式提供

为了实现多轮对话体验,开发者必须手动将先前的对话历史保存在本地或数据库中,然后组合成新的 messages 列表,发送给 API。

如何构建有“记忆”的请求

json
messages = [
    {"role": "system", "content": "你是一个乐于助人的中文助手"},
    {"role": "user", "content": "今天天气怎么样?"},
    {"role": "assistant", "content": "今天天气很好,适合外出。"},
    {"role": "user", "content": "我该带什么?"}
]

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages
)

上述请求模拟了一段多轮对话,其中前三条消息构成上下文,让模型能“理解”当前问题的背景。

如何高效管理上下文

限制消息数量
GPT 模型有 token 限制。例如:

  • gpt-3.5-turbo 默认支持最多 4096 tokens
  • gpt-4 支持最大 8192 或 128k tokens(根据具体模型版本)

对旧对话做摘要
如果上下文太长,可以让模型先总结前文,保留摘要参与后续对话:

python
summary = openai.ChatCompletion.create(...).choices[0].message.content
messages = [{"role": "system", "content": "以下是之前对话摘要:" + summary}, ...]

分段保存上下文
使用 Redis、PostgreSQL 或 SQLite 等数据库保存对话片段,按需拼接调用。

与 Web 版 ChatGPT 的差异

OpenAI 的 Web 版 ChatGPT 在界面层实现了对话“记忆”和持久化(尤其是 GPT-4o),但这仅适用于网页产品,不适用于 API。即使你使用的是同一个模型版本,API 依旧不会自动记住任何上下文。

安全与隐私说明

根据 OpenAI 的企业隐私政策,API 的输入和输出不会用于模型训练,且默认情况下 OpenAI 最多保留 API 数据 30 天用于滥用检测,之后会删除。你也可以申请“零数据保留(ZDR)”来确保对话不被记录。

如何通过 ChatGPT API 模拟多轮对话?

在使用 ChatGPT API 进行对话应用开发时,维护多轮对话上下文是核心能力之一。由于 API 本身是无状态的,为实现“多轮对话记忆”,需要在每次请求中手动传入之前的对话历史。

多轮对话的基本实现方法

OpenAI 的 ChatCompletion 接口通过 messages 参数传递对话历史,该参数为一个列表,包含系统角色、用户提问和助手回复。

以下是一个模拟多轮对话的典型结构:

json
[
  {"role": "system", "content": "你是一位乐于助人的虚拟助手。"},
  {"role": "user", "content": "我今天心情不太好。"},
  {"role": "assistant", "content": "很抱歉听到这个消息。有什么我能帮你的吗?"},
  {"role": "user", "content": "我想听一个笑话。"}
]

这种方式使得模型能够理解前后语境,从而更连贯地回答后续问题。

推荐实践

1. 使用系统消息(system)设定角色与风格

通过添加系统角色消息,明确模型身份、语气和行为。这能显著提升后续回答的一致性与专业性。

2. 保持对话上下文的顺序与完整性

所有 messages 中的记录应按时间顺序排列,否则模型可能出现理解偏差。

3. 控制上下文长度

注意不要超过模型的最大上下文 token 限制:

模型最大上下文长度
GPT-3.5 Turbo 4096 tokens
GPT-4 8192 / 128k tokens
GPT-4o 128k tokens

如对话过长可使用以下方式进行压缩:

  • 移除不重要的历史内容;
  • 用模型生成对话摘要替代旧轮次;
  • 将历史封装成一个总结性 message。

4. 示例:Python SDK 多轮对话代码

python
import openai

openai.api_key = "sk-xxx"

messages = [
    {"role": "system", "content": "你是一位心理健康助手。"},
    {"role": "user", "content": "我最近总是很焦虑。"},
    {"role": "assistant", "content": "焦虑是一种常见的情绪。你可以尝试深呼吸或冥想。"},
    {"role": "user", "content": "还有其他建议吗?"}
]

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=messages,
    temperature=0.7
)

print(response['choices'][0]['message']['content'])

注意事项

  • 模型不自动记忆历史,必须每次传入完整上下文;
  • 消息体建议避免重复冗余语句,以节省 tokens;
  • 结合函数调用(function calling)与多轮对话可实现更复杂交互流程;
  • 流式模式(stream=true)不改变对话方式,仅优化响应速度。

延伸:上下文压缩与摘要策略

若遇到超长对话场景,可借助模型自身生成摘要,替代前几轮消息。例如:

python
# 原始对话前几轮已过长
# 新一轮请求前生成摘要
summary_prompt = [
  {"role": "system", "content": "请总结以下对话内容:"},
  {"role": "user", "content": "(将旧 messages 拼接成文本)"}
]

生成结果可以作为前置上下文压缩输入用于后续 messages。

参考资料

Web 版 ChatGPT 与 ChatGPT API 有哪些核心区别?

Web 版 ChatGPT 和 ChatGPT API 虽然都基于 GPT 模型,但在设计目标、使用方式、功能权限和适用场景上存在明显区别。以下是详细对比分析,帮助开发者、技术人员和企业选型。

使用方式对比:图形界面 vs 编程接口

项目 Web 版 ChatGPTChatGPT API
接入方式 浏览器访问 chat.openai.com通过代码发送 POST 请求
用户界面 OpenAI 提供的完整对话 UI需自行开发界面或集成到应用中
编程接口 无法直接编程可使用各类编程语言 SDK 调用(如 Python、Node.js)

模型版本和参数控制

  • Web 版 ChatGPT 中,用户无法自由选择模型参数(如 temperature, max_tokens 等),仅可选模型版本(如 GPT-3.5、GPT-4)。
  • API 方式 可自定义以下参数,更适合高级定制化:
    • model
    • temperature
    • max_tokens
    • top_p
    • functions
    • system role prompt

计费方式差异

项目 Web 版 ChatGPTChatGPT AP
计费单位 订阅(月/年) 按使用量计费(tokens)
价格模型GPT-3.5 免费,GPT-4(Turbo)为 ChatGPT PlusGPT-3.5、GPT-4、GPT-4o 均有单独 token 定价
免费额度提供有限免费额度 注册初期有 $5 免费额度,随后按需计费

具体定价请参考:OpenAI 定价页

对话上下文与记忆机制

  • Web 版 ChatGPT 拥有对话历史记录和“记忆”功能(仅限部分账户开启),可记住用户设定(如姓名、偏好等)。
  • API 版 ChatGPT 不具有任何内建记忆,开发者需手动维护上下文,通过构造 messages 实现多轮对话。

功能支持对比

功能 Web 版 ChatGPT ChatGPT API
插件支持 是(Plus 用户可选插件) 否(通过 functions 自定义扩展)
代码解释器(Python 环境) 否(需自建执行环境)
文件上传与读取是(支持分析文档)否(需要转换为文本上传)
多模态(图像、语音等) GPT-4o 模型支持图片输入 通过 API 端点(如 DALL·E、Whisper)单独处理

参考文档

ChatGPT API 支持插图或音频吗?

当前 ChatGPT API 只处理文本。生成图片请使用 DALL·E 接口,语音转文字请用 Whisper 接口。这些需要分别调用相应端点。

图像生成:使用 DALL·E 接口

要生成图片,可调用 DALL·E 模型相关的图像生成 API。当前支持:

  • 文生图:通过自然语言描述生成图像
  • 图生图(编辑):上传一张图像,指定变化方向并生成新图像
  • 图像变体:生成基于原始图像风格和结构的多个变体

调用方式(简化示例):

python
response = openai.Image.create(
  prompt="一只穿着太空服的猫,背景是火星表面",
  n=1,
  size="1024x1024"
)
image_url = response['data'][0]['url']

可用图片尺寸包括:256x256, 512x512, 1024x1024。对于编辑类操作,请使用 Image.create_edit 方法。

音频处理:使用 Whisper 或 TTS

1. Whisper:语音转文字

Whisper 是 OpenAI 的自动语音识别(ASR)模型,用于将语音内容转为文字(Speech to Text)。

基本调用示例:

python
audio_file = open("audio.mp3", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file)
print(transcript["text"])

支持格式:mp3, mp4, mpeg, mpga, m4a, wav, webm。

2. Text-to-Speech(TTS):文字转语音

OpenAI 也在 2024 年推出了 TTS 模型(如 tts-1、tts-1-hd),可以将任意文本转为语音文件。

基本调用示例:

python
response = openai.audio.speech.create(
    model="tts-1",
    voice="alloy",
    input="你好,很高兴认识你!"
)
with open("output.mp3", "wb") as f:
    f.write(response.content)

支持的声音包括:alloy, echo, fable, onyx, nova, shimmer 等,风格多样。

多模态 API(GPT-4o)

2024 年发布的 GPT-4o(Omni)模型首次支持单一模型处理文字、图像、音频输入与输出,极大提升多模态交互能力。但在 API 层面,目前图像输入主要用于视觉问答类任务,音频输入主要仍需 Whisper 预处理。

示例调用方式(图像+文本问答):

python
openai.ChatCompletion.create(
  model="gpt-4o",
  messages=[
    {"role": "user", "content": [
      {"type": "text", "text": "请描述这张图中的动物"},
      {"type": "image_url", "image_url": {"url": "https://example.com/cat.png"}}
    ]}
  ]
)

各种功能模型总结

模型或接口 功能 接口名称
ChatGPT API 文本对话 /v1/chat/completions
DALL·E 文生图/图编辑/v1/images/generations
Whisper 语音转文字 /v1/audio/transcriptions
TTS文字转语音 /v1/audio/speech
GPT-4o 多模态输入 /v1/chat/completions (with image/audio/text)
  • 组合使用: 在构建具备“语音对话 + 图片反馈”能力的 AI 应用时,建议用 Whisper 获取语音文字,用 GPT-4o 处理理解,用 DALL·E 生成图像,用 TTS 输出语音。
  • 统一上下文管理: 在使用多模态输入时,合理结构化 messages 内容(如同时包含文本、图片 URL)尤为关键。
  • 性能注意: 图像生成与语音生成较慢,需设定合理的 timeout 和提示用户等待。

参考链接

如何在调用 OpenAI API 时切换不同模型版本?

在使用 OpenAI 的 API 时,开发者可以通过设置请求参数中的 model 字段来选择不同的模型版本。此功能允许你灵活控制生成效果、响应时间和调用成本。

使用 model 参数指定模型版本

调用 OpenAI 的 Chat API(/v1/chat/completions 端点)时,需明确指定所使用的模型。例如:

python
import openai

response = openai.ChatCompletion.create(
    model="gpt-4o", 
    messages=[{"role": "user", "content": "你好"}]
)

此处的 model="gpt-4o" 表示使用 OpenAI 最新一代 GPT-4 Omni 模型。

常用的模型名称包括:

模型名称 简介 上下文长度 适用场景
gpt-3.5-turbo轻量高效,成本低16K tokens 日常任务、轻量应用
gpt-4更强理解能力,成本较高 8K tokens 高质量文本生成、推理
gpt-4-32k 超长上下文版本 32K tokens 长文摘要、文档分析
gpt-4oGPT-4 Omni,兼具速度和多模态能力128K tokens多语言、多任务、多模态

如何知道有哪些模型可选?

你可以通过访问 OpenAI 的官方模型列表文档查看当前可用的所有模型,包括最新发布的模型、其最大上下文窗口、功能支持和定价信息。

或者使用 OpenAI 官方 Python 库:

python
openai.Model.list()

返回所有你当前账号可访问的模型及其 metadata。

模型命名规范

OpenAI 模型的命名通常遵循如下规则:

  • gpt-3.5-turbo-0613:表示 2023 年 6 月版本的 GPT-3.5 Turbo
  • gpt-4-1106-preview:表示 2023 年 11 月的 GPT-4 预览版
  • gpt-4o-2024-05-13:表示 GPT-4 Omni 于 2024 年 5 月 13 日发布版本

建议开发者在指定模型时,优先使用无日期版本(如 gpt-4o)以确保使用默认最新版本;仅在需要版本稳定性时使用精确版本名(如 gpt-4o-2024-05-13)。

注意事项

  • 端点匹配:聊天类模型(如 gpt-3.5-turbo、gpt-4)只能调用 /v1/chat/completions 端点,不能错误地使用 /v1/completions,否则会返回错误。
  • 上下文窗口限制:不同模型的上下文长度限制不同。务必根据具体需求选择支持更大上下文的版本,如 gpt-4-32k。
  • 计费差异:高级模型(如 GPT-4、GPT-4o)价格明显高于 GPT-3.5,调用前建议参考官方定价

参考资料

是否可以申请加速访问或专属实例?

OpenAI 为企业级用户提供了“专属实例(dedicated instances)”服务,用于在多租户环境之外,获得更稳定的性能、更高的吞吐量以及资源隔离保障。该服务通常作为 OpenAI Enterprise 产品的一部分提供。

什么是专属实例?

专属实例(Dedicated Instances)指的是 OpenAI 在其基础设施中为企业客户单独划分的模型计算资源。相比于默认的 API 多租户模型,这种实例提供了:

  • 更稳定的性能:避免因共享资源造成的波动。
  • 更高的请求并发量:适合高 QPS 的生产级应用。
  • 服务可预测性:独立负载和资源,不受其他客户影响。
  • 时长计费:不同于按 token 请求计费,专属实例通常按照模型小时(model hours)或运行时间计费。

使用场景举例

  • 在线客服机器人高并发接入(如日均百万对话);
  • 大型内容生成平台持续调用;
  • 内部高保密性文档或服务部署(可配合 Zero Data Retention 模式);
  • 面向终端客户的智能应用(如 AI 教育产品、生成式 SaaS)。

如何申请专属实例?

需要联系 OpenAI 销售团队,通过企业渠道申请。流程包括:

提交业务使用场景;

评估性能和预算需求;

协议签署;

配置资源及限额;

提供私有 API 访问信息。

企业级用户还可以选择签署数据处理协议(DPA)、开启 Zero Data Retention 模式、设置访问审计等。

专属实例与默认 API 调用的区别

项目 默认多租户 API 专属实例
资源共享 否(独享)
吞吐保障 相对不可预测 可按约定保障
调用计费 按 token 计费 按运行时间计费
数据处理控制 OpenAI 统一管理 可申请 Zero Data Retention
可定制性 高,可自定义系统参数

是否可以加速默认 API 的访问?

对于非专属实例,OpenAI 提供了不同的速率限制配额。如果用户需要提升默认 API 的速率(如 RPM、TPM),也可以向 OpenAI 提交“提升限额”申请。

此外,还有如下方式帮助“加速”:

参考资料

什么是调用并发量和速率限制?

什么是 OpenAI API 的速率限制?

速率限制(Rate Limits)是 OpenAI 为了保障服务稳定性,对每个账号的调用频率进行控制的机制。限制包括两个维度:

  • RPM(Requests Per Minute): 每分钟请求数
  • TPM(Tokens Per Minute): 每分钟处理的 token 数量(包括输入和输出 token)

具体的限制值会根据账号类型、是否已付款、申请状态等不同而变化。

目前(2025 年):

账户类型 RPM(每分钟请求) TPM(每分钟 token)
免费账户 20 40,000
付费个人账户 60 150,000
企业账户(标准) 300+ 1,000,000+

可以通过响应头中的 x-ratelimit-* 字段查看当前账户的速率限制。

如何避免触发速率限制或 429 错误?

当你遇到 429 Too Many Requests 错误时,说明当前请求量或 token 用量已超过速率配额。以下是一些推荐的应对方法:

使用指数退避算法进行重试

借助 Python 的 tenacitybackoff 等库,在出现 openai.RateLimitError 时自动进行延迟重试。

示例:

python
import openai
import backoff

@backoff.on_exception(backoff.expo, openai.error.RateLimitError)
def ask_chatgpt(messages):
    return openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages
    )

如何监控调用速率和 token 用量?

你可以通过以下几种方式监控速率使用情况:

响应头信息: 每个 API 返回中包含以下信息:

  • x-ratelimit-limit-requests
  • x-ratelimit-remaining-requests
  • x-ratelimit-reset-requests

OpenAI Dashboard: 提供图形化统计界面查看调用次数与费用:用量仪表盘

Billing API: 可编程方式获取用量与费用

如何提高并发处理能力?

如果你正在开发高并发应用,如客服机器人或大规模数据处理服务,请采用以下建议:

  • 排队机制: 设计请求队列,避免瞬时请求突发
  • 分批发送: 对大批量任务进行分片,延时分发
  • 申请提升配额: 登录 OpenAI 控制台 申请更高限额
  • 使用多个 API Key: 企业客户可以为每个成员分配独立 Key,实现负载均衡(需保证遵守 OpenAI 使用政策)

是否有推荐的策略管理大规模调用?

是的。OpenAI 官方建议:

  • 将请求平均分布到时间段中,避免集中调用
  • 将多个 message 合并为摘要,减少总 token 用量
  • 单次请求控制在合理 token 范围内,避免一次性塞入过多上下文
  • 响应中包含 Retry-After 头时,务必遵守等待时间

常见误区与排查建议

错误现象 可能原因 建议解决方案
立即出现 429 错误 使用旧密钥或账户未激活 生成新 API Key 并确认账户激活状态
调用量远未达预期已限流 并发太高导致瞬时请求过多 加入排队、降低峰值
单请求内容过大 包含太多 token(如长上下文) 压缩提示、摘要历史、分批调用
用完 TPM 或 RPM 正常限制机制触发 使用重试机制并申请更高限额

参考资料

有哪些可用于调试 ChatGPT API 的工具?

OpenAI Playground

用途:交互式 prompt 调试、参数实验

OpenAI 官方提供的 Playground 是一个强大交互测试界面,可用于:

  • 快速验证提示词(prompt)的效果
  • 尝试不同模型(如 gpt-3.5-turbo、gpt-4)
  • 调整参数,如 temperaturetop_pmax_tokens
  • 开启流式响应(stream)
  • 复制 Python/Node.js 代码片段以集成到项目

Playground 是 prompt 工程初学者和进阶用户的重要工具。

访问地址:OpenAI Playground

Postman OpenAI Collection

用途:API 请求调试与测试

OpenAI 提供 Postman 集合,可一键导入用于测试各种端点(如 chat/completions, images, audio 等)。其优点包括:

  • 快速构建请求体
  • 方便配置 Header 和 Token
  • 可查看响应结构及错误信息
  • 支持环境变量(如 OPENAI_API_KEY)

Postman 是开发初期验证接口正确性、模拟请求错误的实用工具。

下载地址:Postman Collection - OpenAI 官方文档

调试日志功能(Python SDK)

用途:调试日志输出、追踪调用问题

在 Python 中使用 openai SDK 时,可以通过启用日志来获得请求与响应详情:

pythonCopyEditimport openai openai.log = "debug"

这对于排查以下问题特别有效:

  • 参数错误(400)
  • 身份验证失败(401)
  • 速率限制(429)
  • 服务端错误(5xx)

注意:调试日志应只在开发环境启用,避免泄露 API 密钥。

ChatGPT API 的返回结果为什么存在不确定性?如何控制输出的稳定性与创造性?

ChatGPT 是一种典型的生成式语言模型,其输出并非确定唯一的,而是受“概率采样”机制控制。因此,同样的输入在多次调用中可能会返回不同内容。这种“返回结果不确定性”是语言模型的固有特性之一。

为满足不同的业务需求,OpenAI 提供了一些参数来调节输出的稳定性与多样性,最核心的是 temperature 参数。

模型输出为什么不确定?

语言模型在生成下一个 token 时,会基于上下文对所有可能的词进行概率分布计算,然后根据这个分布进行采样。这种机制本质上决定了模型的输出并非固定。例如:

python
response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[{"role": "user", "content": "讲个冷笑话"}],
  temperature=1.0
)

即使你多次运行相同代码,返回的笑话可能每次不同。

如何通过参数控制输出稳定性?

以下是影响 ChatGPT 生成结果的主要参数:

参数 说明
temperature控制输出的随机程度。取值范围 0–2。越接近 0,输出越稳定。默认 1。
top_p又称“核采样”,控制输出选词的概率覆盖范围,通常与 temperature 二选一。
frequency_penalty惩罚重复内容频率,值越大模型越倾向使用新词汇。
presence_penalty惩罚话题重复性,鼓励引入新话题。

参数推荐配置:

  • 更稳定回答(适合客服类应用):
    • temperature: 0.2–0.4
    • top_p: 1.0
  • 更有创意回答(适合写作/创作类):
    • temperature: 0.8–1.2
    • top_p: 0.9

示例:低温度 vs 高温度对比

python
# 稳定版本
openai.ChatCompletion.create(
  model="gpt-4",
  messages=[{"role": "user", "content": "介绍一下中国春节"}],
  temperature=0.3
)

输出:更类似百科式、格式化、结构清晰。

python
# 创意版本
openai.ChatCompletion.create(
  model="gpt-4",
  messages=[{"role": "user", "content": "介绍一下中国春节"}],
  temperature=1.2
)

输出:可能带有拟人化描述、民俗趣闻,甚至添加诗意化的语言。

何时建议使用更高不确定性?

  • 内容创作、写故事、脑暴点子时;
  • 用户期待多样化回应;
  • 模型作为助理角色需更多人性化表达时。

何时应限制不确定性?

  • 对话系统中的精确答复;
  • 法律、医疗等严谨领域;
  • 自动生成可复现测试数据时。

最佳实践建议

  • 尽量不要同时设置高 temperature 和低 top_p,可能导致输出不稳定;
  • 对于需要生成多样性内容的任务,使用多个温度值分别测试效果;
  • 在用户提示中加入明确约束(如“简洁”、“专业”等)可以降低结果波动。

相关参考资料

ChatGPT API 的最大上下文长度限制是什么?该如何处理超出长度的问题?

最大上下文长度的定义

在使用 ChatGPT API 时,最大的输入和输出长度限制由**上下文窗口大小(context window)**决定。这个窗口表示模型在一次调用中可以处理的 token 总量,包括:

  • 所有历史消息(prompt)
  • 系统设定(system message)
  • 当前用户输入
  • 模型生成的回复(completion)

重点:输入 tokens + 输出 tokens ≤ 最大 context window

不同模型的上下文窗口大小

模型名称 上下文窗口限制(tokens)
gpt-3.5-turbo4096
gpt-3.5-turbo-16k 16,385
gpt-4 8,192
gpt-4-32k 32,768
gpt-4o 128,000(上限)

参数 max_tokens 的作用

参数 max_tokens 用于设置模型生成内容的最大 token 数。如果不设置,默认值可能会很小或不可控。设置得太大则可能触发以下错误:

  • This model’s maximum context length is X tokens
  • Request too large
  • Context length exceeded

实际开发中的典型错误场景

历史对话太多未裁剪
累计传入的 message 数组太长,触发上下文长度错误。

上传复杂数据结构
发送大段 JSON、Markdown、代码块或表格也会导致 token 急剧增加。

忘记设置 max_tokens
不明确指定输出上限时,默认尝试生成太长内容可能触发限制。

最佳实践:如何控制上下文长度?

1. 删除或裁剪历史记录

清理无关的旧消息,或将历史内容摘要化。

2. 限制单条消息长度

限制单次用户输入的字符数。例如在前端输入框加最大长度提示或限制上传文件大小。

3. 使用 token 计数器(如 tiktoken)

在发送前用 tiktoken 估算消息长度:

python
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
num_tokens = sum([len(encoding.encode(m["content"])) for m in messages])

4. 动态计算输出空间

确保有足够 token 留给模型生成输出。例如:

python
MAX_TOKENS = 4096
used_tokens = sum([len(encoding.encode(m["content"])) for m in messages])
available_output = MAX_TOKENS - used_tokens
openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=messages,
  max_tokens=available_output
)

如果仍然超限怎么办?

  • 考虑使用更大窗口的模型(如 gpt-4o)
  • 采用摘要/总结机制来压缩长对话
  • 分段上传信息,逐步处理(多轮 prompt)
  • 避免冗余内容,如重复的系统说明或提示语

参考资料

OpenAI ChatGPT API 如何计费?计费单位是什么?

计费单位:Token

OpenAI 的 API 使用 token 作为基本的计费单位。Token 并不等同于一个字符或一个字,而是语言模型处理文本时的最小单位。
例如:

  • “ChatGPT is great!” 包含 5 个 tokens
  • 中文每个字通常为 1 token
  • 100 个英文单词大约等于 150~160 tokens

计费计算方式

每次请求会对 输入输出 分别计费,然后将两者相加得出总费用:

总 token 使用量 = 输入 token + 输出 token
总费用 = 输入 token * 单价 + 输出 token * 单价

各模型计费示例(2025年6月)

模型版本 输入单价(每千 token) 输出单价(每千 token)
GPT-3.5 Turbo $0.0005~$0.0010 $0.0015~$0.0020
GPT-4-Turbo(8k) $0.01~$0.03 $0.03~$0.06
GPT-4-32k $0.06 $0.12
GPT-4o(最新版本) $0.005 $0.015

详细价格请参阅 OpenAI 定价页面

计费示例说明

假设你使用 gpt-4-32k 模型进行一次对话:

  • 输入文本共 1200 tokens
  • 模型回复内容 800 tokens
  • 则总 token 数为 2000
  • 计算费用为:
html
输入:1200 tokens × $0.06 / 1000 = $0.072  
输出:800 tokens × $0.12 / 1000 = $0.096  
总费用 = $0.072 + $0.096 = **$0.168**

如何估算 Token?

OpenAI 提供了官方的 Tokenizer 工具 可帮助开发者准确估算文字会占用多少 tokens。推荐在部署前试算提示和回复的 token 大小,以控制成本。

你也可以使用 tiktoken 这个 Python 库在本地进行估算:

python
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4")
tokens = enc.encode("你好,我想了解一下费用是怎么算的?")
print(len(tokens))  # 输出 token 数

优化 token 成本的实用技巧

  • 减少提示冗余:精简 system message 和多轮对话内容
  • 避免不必要的输出:使用 max_tokens 限制生成字数
  • 合理使用缓存:对于固定输出的内容,不必重复调用
  • 区分使用场景:轻量任务优先使用 GPT-3.5 Turbo,复杂任务才用 GPT-4

注意事项

  • 请求失败(如 HTTP 400、401、500)不计费,但 429 可能仍计入 tokens
  • 多轮对话每次都需带上完整上下文,因此旧消息需压缩或删减以节省成本
  • OpenAI 目前没有自动“费用上限设置”功能,需在代码中手动控制调用次数和频率

参考资料

Share