ChatCompletion(聊天补全)接口是 OpenAI 提供的核心对话 API,支撑着 GPT-3.5-turbo、GPT-4 等系列模型的对话能力调用
ChatCompletion聊天补全接口是 OpenAI 提供的核心对话 API支撑着 GPT-3.5-turbo、GPT-4 等系列模型的对话能力调用。新版 OpenAI Python SDKv1.0.0 及以上中该接口统一使用chat.completions.create()方法进行调用取代了旧版的openai.ChatCompletion.create()调用方式。本报告将围绕 ChatCompletion 接口的技术架构、核心参数、实战代码、响应解析、高级特性及最佳实践展开全面阐述旨在帮助开发者快速掌握该接口的使用方法并理解其背后的设计逻辑。二、技术背景与接口演进2.1 接口演进历史OpenAI Python SDK 在 2023 年 11 月发布了 1.0.0 版本这是一次重大的架构升级旧版接口openai 1.0.0使用openai.ChatCompletion.create()或openai.Completion.create()进行全局调用。新版接口openai ≥ 1.0.0使用client.chat.completions.create()需要先通过OpenAI()类实例化客户端对象。新版接口的设计更加模块化支持完整的类型提示Type Hints、异步调用AsyncOpenAI并且与 OpenAI 最新模型如 gpt-4o完全兼容。2.2 为什么需要迁移旧版接口已不再接收功能更新且在未来版本中可能被彻底移除。新版接口提供了以下优势更好的类型安全支持 IDE 自动补全和类型检查。原生异步支持通过AsyncOpenAI客户端实现非阻塞调用。统一接口设计聊天补全、文本补全、嵌入等接口采用一致的命名规范。更完善的错误处理提供细粒度的异常类如RateLimitError、APIConnectionError。三、接口核心架构3.1 HTTP 协议层ChatCompletion 接口的底层 HTTP 端点为POST https://api.openai.com/v1/chat/completions请求头必须包含Authorization: Bearer {API_KEY}API 密钥认证Content-Type: application/json请求体格式3.2 请求体核心字段chat.completions.create()方法接受以下核心参数参数类型必填说明modelstring是模型标识如gpt-4o、gpt-3.5-turbomessagesarray是对话消息数组按 system → user → assistant 顺序排列temperaturefloat否采样温度范围 [0.0, 2.0]默认 1.0top_pfloat否核采样阈值范围 (0.0, 1.0]默认 1.0max_completion_tokensinteger否最大输出 Token 数新版推荐字段streamboolean否是否启用流式输出默认 falsetoolsarray否工具/函数定义列表tool_choicestring/object否工具调用策略auto/none/requiredresponse_formatobject否响应格式控制如{type: json_object}stopstring/array否停止序列最多 4 个ninteger否候选回复数量默认 1presence_penaltyfloat否存在惩罚范围 [-2.0, 2.0]frequency_penaltyfloat否频率惩罚范围 [-2.0, 2.0]seedinteger否随机种子用于结果复现3.3 消息角色体系messages数组中的每条消息包含role和content两个字段system系统指令设定 AI 的角色、行为边界和回复风格。通常放在数组首位可选。user用户输入可以是字符串纯文本或数组多模态包含文本和图片。assistantAI 的历史回复用于维持多轮对话的上下文。tool工具调用返回的结果需包含tool_call_id和content。关键规则messages数组的最后一条消息的role必须为user或tool。四、实战代码与解析4.1 环境准备首先安装必要的依赖库pipinstallopenai python-dotenv在项目根目录创建.env文件写入 API 密钥OPENAI_API_KEYsk-your-api-key-here安全提示API 密钥仅在创建时显示一次丢失需重新生成。严禁将密钥硬编码到代码中或提交到 Git 仓库。4.2 基础调用示例以下代码演示如何使用新版 SDK 进行最基本的单轮对话调用importosfromdotenvimportload_dotenvfromopenaiimportOpenAI# 加载环境变量load_dotenv()# 初始化客户端clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))defbasic_chat(user_message:str,model:strgpt-4o)-str: 基础聊天补全调用 Args: user_message: 用户输入的消息内容 model: 使用的模型名称默认 gpt-4o Returns: AI 生成的回复文本 responseclient.chat.completions.create(modelmodel,messages[{role:system,content:你是一个专业、友好的 AI 助手。},{role:user,content:user_message}],temperature0.7,max_completion_tokens1000)# 解析响应提取第一条候选回复的内容returnresponse.choices[0].message.content# 测试调用if__name____main__:resultbasic_chat(请用 Python 写一个冒泡排序算法)print(result)代码解析load_dotenv()从.env文件中读取环境变量避免密钥泄露。OpenAI()实例化客户端对象自动从环境变量OPENAI_API_KEY中读取密钥。chat.completions.create()发起 API 请求messages数组包含系统指令和用户输入。响应对象的层级结构为response.choices[0].message.content这是新版 SDK 的标准取值路径。4.3 多轮对话实现多轮对话的核心是维护一个消息历史列表每次将用户的新输入和 AI 的回复依次追加到列表中importosfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))classChatBot:支持多轮对话的聊天机器人def__init__(self,model:strgpt-4o,system_prompt:strNone):self.modelmodel self.history[]# 如果提供了系统提示将其作为第一条消息ifsystem_prompt:self.history.append({role:system,content:system_prompt})defchat(self,user_message:str,**kwargs)-str: 发送用户消息并获取 AI 回复 Args: user_message: 用户输入 **kwargs: 额外参数如 temperature、max_tokens 等 Returns: AI 回复内容 # 追加用户消息到历史记录self.history.append({role:user,content:user_message})# 发起请求responseclient.chat.completions.create(modelself.model,messagesself.history,**kwargs)# 提取 AI 回复assistant_messageresponse.choices[0].message self.history.append({role:assistant,content:assistant_message.content})returnassistant_message.contentdefclear_history(self):清空对话历史保留 system 消息self.history[msgformsginself.historyifmsg[role]system]# 使用示例if__name____main__:botChatBot(modelgpt-4o,system_prompt你是一个 Python 编程专家擅长解释代码概念和调试问题。)print(bot.chat(Python 中列表和元组有什么区别))print(bot.chat(能举个例子说明什么时候该用元组吗))print(bot.chat(谢谢))代码解析ChatBot类封装了对话历史的管理逻辑self.history列表按顺序存储所有消息。每次调用chat()方法时先将用户消息追加到历史再发起请求最后将 AI 回复也追加到历史中。clear_history()方法允许清空对话历史但保留system消息方便重新开始对话而不丢失角色设定。4.4 流式输出Streaming流式输出基于 SSEServer-Sent Events协议逐块返回生成的内容显著提升用户体验特别适用于生成长文本的场景importosfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))defstream_chat(user_message:str,model:strgpt-4o)-str: 流式聊天输出 Args: user_message: 用户输入 model: 模型名称 Returns: 完整的 AI 回复文本 full_responsestreamclient.chat.completions.create(modelmodel,messages[{role:user,content:user_message}],streamTrue,# 启用流式输出stream_options{include_usage:True}# 在最后一个 chunk 中包含 usage 信息)forchunkinstream:# 每个 chunk 的 delta 包含增量内容deltachunk.choices[0].deltaifdelta.contentisnotNone:print(delta.content,end,flushTrue)full_responsedelta.content# 最后一个 chunk 包含 usage 统计ifchunk.usage:print(f\n\nToken 消耗:{chunk.usage.total_tokens})returnfull_responseif__name____main__:stream_chat(写一篇关于人工智能发展历史的短文约300字)代码解析streamTrue启用流式输出模式返回一个可迭代的流对象。每个chunk对象的choices[0].delta.content包含本次生成的增量文本片段。delta.content可能为None如第一个 chunk 仅包含角色信息需要做判空处理。stream_options{include_usage: True}确保最后一个 chunk 返回 Token 使用统计。4.5 带重试机制的健壮调用网络波动、速率限制等问题可能导致 API 调用失败。实现指数退避重试机制可以显著提高调用的成功率importosimporttimefromdotenvimportload_dotenvfromopenaiimportOpenAI,RateLimitError,APIConnectionError,APIError load_dotenv()clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))defrobust_chat(messages:list,model:strgpt-4o,max_retries:int3,base_delay:float1.0,**kwargs)-str: 带重试机制的聊天调用 Args: messages: 消息列表 model: 模型名称 max_retries: 最大重试次数 base_delay: 基础等待时间秒 **kwargs: 其他请求参数 Returns: AI 回复内容 Raises: Exception: 重试耗尽后抛出最后一次异常 last_exceptionNoneforattemptinrange(max_retries):try:responseclient.chat.completions.create(modelmodel,messagesmessages,**kwargs)returnresponse.choices[0].message.contentexceptRateLimitErrorase:# 速率限制错误HTTP 429last_exceptione wait_timebase_delay*(2**attempt)print(f速率限制{wait_time}秒后重试... (尝试{attempt1}/{max_retries}))time.sleep(wait_time)exceptAPIConnectionErrorase:# 网络连接错误last_exceptione wait_timebase_delay*(2**attempt)print(f连接错误{wait_time}秒后重试... (尝试{attempt1}/{max_retries}))time.sleep(wait_time)exceptAPIErrorase:# 服务器错误HTTP 5xx可重试客户端错误HTTP 4xx直接抛出ife.status_codeande.status_code500:last_exceptione wait_timebase_delay*(2**attempt)print(f服务器错误{wait_time}秒后重试... (尝试{attempt1}/{max_retries}))time.sleep(wait_time)else:raise# 客户端错误不重试直接抛出raiselast_exception# 使用示例if__name____main__:messages[{role:user,content:解释量子计算的基本原理}]try:resultrobust_chat(messages,max_retries3)print(result)exceptExceptionase:print(f调用失败:{e})代码解析针对RateLimitError速率限制和APIConnectionError连接错误进行捕获并执行重试。采用指数退避策略每次重试的等待时间为base_delay × 2^attempt即 1秒 → 2秒 → 4秒。对于服务器错误HTTP 5xx也进行重试但对于客户端错误如参数错误 HTTP 400直接抛出异常避免无效重试。4.6 函数调用Function Calling函数调用能力允许模型自主决定何时调用外部工具将自然语言转换为结构化的函数调用参数importosimportjsonfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))# 定义外部函数defget_weather(city:str)-dict:获取指定城市的天气信息模拟函数weather_data{北京:{temperature:25,condition:晴,humidity:40},上海:{temperature:28,condition:多云,humidity:65},广州:{temperature:32,condition:雷阵雨,humidity:80},}returnweather_data.get(city,{error:f未找到{city}的天气信息})# 定义工具描述JSON Schematools[{type:function,function:{name:get_weather,description:获取指定城市的当前天气信息,parameters:{type:object,properties:{city:{type:string,description:城市名称如北京、上海}},required:[city]}}}]defchat_with_tools(user_message:str)-str: 支持函数调用的聊天 Args: user_message: 用户输入 Returns: AI 最终回复 messages[{role:user,content:user_message}]# 第一轮让模型决定是否调用工具responseclient.chat.completions.create(modelgpt-4o,messagesmessages,toolstools,tool_choiceauto# 让模型自主决定是否调用)assistant_messageresponse.choices[0].message messages.append(assistant_message)# 检查是否有工具调用ifassistant_message.tool_calls:fortool_callinassistant_message.tool_calls:function_nametool_call.function.name function_argsjson.loads(tool_call.function.arguments)# 执行对应的函数iffunction_nameget_weather:resultget_weather(**function_args)# 将函数结果返回给模型messages.append({role:tool,tool_call_id:tool_call.id,content:json.dumps(result,ensure_asciiFalse)})# 第二轮让模型根据工具返回结果生成最终回复final_responseclient.chat.completions.create(modelgpt-4o,messagesmessages)returnfinal_response.choices[0].message.contentreturnassistant_message.content# 使用示例if__name____main__:print(chat_with_tools(北京今天的天气怎么样))代码解析tools参数定义了外部函数的 JSON Schema 描述包括函数名、描述和参数结构。当模型判断需要调用工具时会在assistant_message.tool_calls中返回工具调用列表。开发者解析tool_call.function.argumentsJSON 字符串并执行对应的本地函数。将函数执行结果以role: tool的消息格式追加到messages中再次调用 API让模型基于工具返回结果生成自然语言回复。五、响应体结构解析5.1 非流式响应非流式响应返回一个完整的 JSON 对象核心结构如下{id:chatcmpl-abc123,object:chat.completion,created:1677652288,model:gpt-4o,choices:[{index:0,message:{role:assistant,content:你好有什么可以帮助你的,tool_calls:null},finish_reason:stop}],usage:{prompt_tokens:9,completion_tokens:12,total_tokens:21}}关键字段说明id请求的唯一标识符用于问题追踪。object固定为chat.completion。createdUnix 时间戳。model实际使用的模型名称。choices生成的结果列表。n参数大于 1 时会有多个候选。finish_reason结束原因常见值包括stop正常结束length达到 Token 长度限制tool_calls模型发起了工具调用content_filter内容被安全过滤器拦截usageToken 消耗统计包含输入 Tokenprompt_tokens、输出 Tokencompletion_tokens和总 Tokentotal_tokens。5.2 流式响应流式响应基于 SSE 协议每行以data:开头最后一个 chunk 以data: [DONE]结束data: {id:chatcmpl-123,object:chat.completion.chunk,created:1 --- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dbee589bea024a5fb8879f8ac8986cf4.jpeg#pic_center)

相关新闻

Kubernetes Deployment更新策略详解:Recreate与RollingUpdate原理、参数与避坑实践

Kubernetes Deployment更新策略详解:Recreate与RollingUpdate原理、参数与避坑实践

在Kubernetes里干活久了,你会发现Deployment几乎是每天都要打交道的对象。而Deployment的更新策略—— Recreate 和 RollingUpdate ,这俩词儿看着简单,真正用起来、踩过坑之后,才知道里面门道不少。很多朋友面试时候被问到“R…

2026/10/1 11:22:10 阅读更多 →
OpenHarmony 下 Flutter 数据指纹校验:murmur3 原生适配与性能优化

OpenHarmony 下 Flutter 数据指纹校验:murmur3 原生适配与性能优化

做 Flutter 应用迁移到 OpenHarmony 的时候,最容易被卡住的往往不是 UI 适配,而是一些看起来不起眼的基础能力。数据指纹校验就是一个典型场景:文件完整性检查、增量更新校验、分片去重、缓存 key 生成,全都依赖一个又快又稳定的哈…

2026/10/1 11:22:10 阅读更多 →
在生成式AI时代,基础大模型(如GPT系列)如同“通才大学生”,知识广博但缺乏特定领域的深度

在生成式AI时代,基础大模型(如GPT系列)如同“通才大学生”,知识广博但缺乏特定领域的深度

在生成式AI时代,基础大模型(如GPT系列)如同“通才大学生”,知识广博但缺乏特定领域的深度。微调(Fine-tuning)则是让模型在特定数据集上进行定向训练,使其成为企业或个人的“专属助理”。本报告…

2026/10/1 11:22:10 阅读更多 →

最新新闻

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器这三个字一出来,很多人第一反应是"游戏挂机脚本",但说实话我用了这么多年,鼠标自动连点真正帮我省下大把时间的场景,反而是那些枯燥到让人怀疑人生的重复工作:一遍遍点"下一步"、批量填表、…

2026/10/1 12:50:58 阅读更多 →
Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

1. 从一张账单说起:为什么同一个判断题,成本能差 5 倍 先把场景摆出来。我最近在做一个批量内容审核的小工具,核心逻辑特别简单:给一段文本,让模型判断它是否属于某个类别,输出只有两个值——是或否。这种任…

2026/10/1 12:50:58 阅读更多 →
ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

1. 汽车电子里的ECC公钥,为什么格式值得拿出来单聊做车载安全的人应该都有感触:ECC(椭圆曲线密码)在车联网和汽车电子里的应用已经非常密集,V2X车路协同、OTA升级签名、安全启动、SecOC报文认证、PKI证书链&#xff0c…

2026/10/1 12:50:58 阅读更多 →
IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

拿到IEC 62351-100-3一致性测试任务的时候,我第一反应是找标准原文、打开产品功能清单,准备一项一项打勾。真正进了实验室才发现,这套测试折腾的根本不是“功能是否正常”,而是“产品对安全机制的理解是否和标准一致”。业务功能正…

2026/10/1 12:50:58 阅读更多 →
Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

1. 从“Madeira”这个名字说起:它到底指什么第一次看到“Madeira”这个词,很多人第一反应是葡萄牙那个盛产葡萄酒的海岛,或者是一道叫“马德拉酱汁”的西餐配料。但在技术圈里,尤其是围绕 Wine、FEX-Emu、DXMT 这些关键词的讨论中…

2026/10/1 12:50:58 阅读更多 →
Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 的安装,单看流程图确实简单到让人提不起兴趣:下镜像、写U盘、引导、分区、下一步。但真正动手装过十几台机器之后你会发现,翻车的点几乎全在"下一步"之外——UEFI 和 Legacy 引导混着用导致装完进不去系统、硬盘分区…

2026/10/1 12:49:58 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →