当前位置: 首页 > news >正文

[AI智能体与提效-116] - OpenAI API用法:Completions创建聊天对话

使用 OpenAI API 的Chat Completions(/v1/chat/completions) 接口是构建聊天对话最核心、最常用的方式。

与旧的completions接口不同,Chat Completions专为多轮对话设计,它接受一个包含角色(system,user,assistant)的消息列表,并返回模型生成的回复。

以下是基于 Python SDK (openai >= 1.0) 的完整用法指南,涵盖基础对话多轮上下文流式输出结构化数据


1. 前置准备

安装官方 SDK:

bash

pip install openai

初始化客户端:

python

from openai import OpenAI import os # 推荐将 API Key 放在环境变量中,避免硬编码 client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), # base_url="https://your-proxy.com/v1" # 如果有代理可配置 )

2. 基础用法:单次问答

最简单的对话模式:发送一条消息,接收一条回复。

python

response = client.chat.completions.create( model="gpt-4o", # 或 gpt-4o-mini, o1-preview 等 messages=[ {"role": "system", "content": "你是一个乐于助人的中文助手。"}, {"role": "user", "content": "量子纠缠是什么?用一句话解释。"} ], temperature=0.7, # 创造性 (0-2) max_tokens=500 # 最大生成长度 ) # 提取回复内容 reply = response.choices[0].message.content print(f"AI: {reply}")

关键点解析

  • messages列表
    • system: 设定人设、规则(可选,但强烈建议)。
    • user: 用户输入。
    • assistant: 模型之前的回复(用于多轮对话)。
  • model: 指定使用的模型版本。
  • choices[0].message.content: 模型生成的文本内容。

3. 进阶用法:多轮对话 (保持上下文)

Chat Completions本身是无状态的要实现“记住”之前的对话,你必须手动将历史对话记录拼接到messages列表中,每次请求都发送给云端。

python

# 模拟一个对话历史列表 conversation_history = [ {"role": "system", "content": "你是一个专业的 Python 程序员。"} ] def chat(user_input): # 1. 将用户新输入加入历史 conversation_history.append({"role": "user", "content": user_input}) # 2. 发送包含完整历史的请求 response = client.chat.completions.create( model="gpt-4o", messages=conversation_history # 关键:带上所有历史 ) # 3. 获取并保存 AI 的回复到历史 ai_reply = response.choices[0].message.content conversation_history.append({"role": "assistant", "content": ai_reply}) return ai_reply # --- 测试多轮对话 --- print("User: 什么是列表推导式?") ans1 = chat("什么是列表推导式?") print(f"AI: {ans1}") print("\nUser: 能给我举个刚才那个语法的例子吗?") # 注意:这里没有显式传递“刚才那个语法”,但 AI 知道指的是列表推导式,因为历史记录里包含了上一轮对话 ans2 = chat("能给我举个刚才那个语法的例子吗?") print(f"AI: {ans2}")

注意:随着对话变长,messages列表会越来越大,消耗的 Token 也会越来越多。当超过模型的上下文窗口(如 128k)时,你需要自行实现策略(如滑动窗口、摘要总结)来截断历史记录。


4. 高级用法:流式输出 (Streaming)

为了让用户体验更好(像打字机一样逐字显示),可以开启stream=True。这会返回一个生成器,而不是等待全部完成后一次性返回。

python

stream = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是一个诗人。"}, {"role": "user", "content": "写一首关于春天的短诗。"} ], stream=True # 开启流式 ) print("AI: ", end="", flush=True) for chunk in stream: # chunk 是一个小片段,可能包含 content,也可能为 None (结束标志) if chunk.choices[0].delta.content is not None: content = chunk.choices[0].delta.content print(content, end="", flush=True) # 逐字打印 print() # 换行

适用场景:聊天机器人界面、实时语音对话后端。


5. 实用技巧:强制 JSON 输出

如果你需要程序化处理结果(例如提取实体、生成配置),可以使用response_format={"type": "json_object"}强制模型输出合法的 JSON。

python

response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是一个数据提取器。请只输出 JSON 格式,不要包含 markdown 标记。"}, {"role": "user", "content": "从这句话提取姓名和年龄:'张三今年 25 岁,是个工程师'"} ], response_format={"type": "json_object"} # 关键参数 ) import json data = json.loads(response.choices[0].message.content) print(f"姓名: {data['name']}, 年龄: {data['age']}")

6. 常见参数详解表

表格

参数名类型默认值说明
modelstring-模型 ID,如gpt-4o,gpt-4o-mini
messagesarray-必填。对话历史列表[{"role": "...", "content": "..."}]
temperaturefloat1.0随机性。0 最严谨,2 最发散。事实性任务建议 < 0.5。
max_tokensintegerinf生成的最大 Token 数。注意:这是输出限制,不包含输入。
top_pfloat1.0核采样。通常与 temperature 二选一,不建议同时调整。
streambooleanfalse是否流式输出。
stopstring/arraynull遇到特定字符串时停止生成。
presence_penaltyfloat0惩罚重复出现的主题,鼓励谈论新话题。
frequency_penaltyfloat0惩罚重复出现的词句,减少复读机现象。
response_formatobject-设为{"type": "json_object"}可强制 JSON 输出。
toolsarray-定义函数工具,用于 Function Calling。

7. 错误处理最佳实践

网络波动或速率限制(Rate Limit)是常态,务必加上重试机制。

python

from openai import OpenAI, RateLimitError, APIConnectionError import time def create_chat_with_retry(messages, retries=3): for attempt in range(retries): try: return client.chat.completions.create( model="gpt-4o", messages=messages ) except RateLimitError as e: wait_time = 2 ** attempt # 指数退避:2s, 4s, 8s... print(f"触发限流,等待 {wait_time} 秒后重试...") time.sleep(wait_time) except APIConnectionError as e: print(f"网络连接错误: {e}") if attempt == retries - 1: raise time.sleep(1) except Exception as e: print(f"未知错误: {e}") raise # 使用 response = create_chat_with_retry([{"role": "user", "content": "Hello"}]) print(response.choices[0].message.content)

总结

使用chat.completions的核心在于维护好messages列表

  • 单次问答:直接发system+user
  • 多轮对话:不断append新的userassistant消息到列表中,全量发送。
  • 体验优化:使用stream=True实现打字机效果。
  • 程序集成:使用response_format={"type": "json_object"}获取结构化数据。
http://www.jsqmd.com/news/428850/

相关文章:

  • 使用矢量网络分析仪(VNA)测试汽车保险杠与车标雷达透波性能
  • Vue3 整合 Pinia 和 Vue Router
  • 2026年 堵漏工程厂家实力推荐榜:专业解决地下室/隧道/大坝等各类防水堵漏难题,精选优质服务商 - 品牌企业推荐师(官方)
  • 锁相放大器SR865A与SR860选型指南
  • 2026年厂房、餐饮、店铺及多元商业空间装修专业选型指南:聚焦靓滔装饰与思嫒装潢 - 品牌推荐官
  • 2026年诚信型会议预约系统优质推荐榜:工位系统服务商/工位系统订做研发公司/访客系统订研发公司/选择指南 - 优质品牌商家
  • 2026年无锡网站建设与外贸推广服务商推荐榜:专业SEO优化、宣传片拍摄及小程序开发一站式解决方案 - 品牌企业推荐师(官方)
  • 矢量网络分析仪E5080B使用说明
  • 2026年靠谱装修公司选择指南:老房翻新/工装/高端别墅场景下的头部品牌测评与选型建议 - 博客万
  • 基于51单片机的声光控制开关设计
  • 2026 日本展台设计搭建公司甄选:和风科创筑展,精益适配点亮会展新场景 - 资讯焦点
  • 基于单片机的智能抢答器设计
  • 2026年篮球架厂家推荐:纽戈(上海)实业有限公司专业供应移动/箱式/悬挂式/成人/室外全系产品 - 品牌推荐官
  • 2026 日本展厅设计搭建公司优选:和风长效筑馆,精益科创赋能品牌展厅 - 资讯焦点
  • div设置超出文本换行
  • 2026年变压器厂家推荐排行榜:干式/油浸式/光伏/充电桩变压器,S20/S22一级能耗及SCB14/SCB18干式变压器实力品牌深度解析 - 品牌企业推荐师(官方)
  • Temu合规标签模板制作要求有哪些?Temu合规标签模板制作步骤详解! - 跨境小媛
  • 圆形逆流冷却塔哪家强?2026年推荐这几家靠谱公司,闭式冷却塔/圆形逆流冷却塔,圆形逆流冷却塔供货厂家推荐 - 品牌推荐师
  • See Dance 2.0:新时代的产物
  • 基于矢量网络分析仪的总谐波失真(THD)测量方法简析
  • 加急办理:邓白氏编码3-6天闪电出码的专业代理公司机构盘点 - 速递信息
  • 零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用(小白友好全链路指南)
  • VLOOKUP函数使用方法大全总结
  • 2026年研磨仪市场大调查:全球与中国市场占有率TOP5品牌深度解析 - 品牌推荐大师1
  • 2026年 花辊雕刻机厂家推荐排行榜:专业雕刻设备,涵盖对压辊、压花辊、模切辊、刀模花辊、超声波辊、干燥造粒辊、圆柱、立式、模具及金属辊雕刻机 - 品牌企业推荐师(官方)
  • 惠州搬家服务公司、惠州设备搬迁公司、惠州货物搬运搬迁公司、惠州附近搬家公司、深圳仓库搬家公司、深圳仓库搬迁公司选择指南 - 优质品牌商家
  • 为什么央视都说了网络安全的人才缺口巨大,但还是有很多人找不到工作,难道又被专家忽悠了?
  • Vue3 Composables (逻辑复用)
  • 2026年 净化铝材/FFU龙骨/不锈钢防水槽/机电设备减震器厂家推荐榜单:洁净工程核心构件实力供应商深度解析 - 品牌企业推荐师(官方)
  • GitNexus:GitHub一周暴涨6000星!这个零服务器代码神器让AI终于能看懂你的代码了