如何正确从 OpenAI ChatCompletion 响应中提取消息内容

4次阅读

如何正确从 OpenAI ChatCompletion 响应中提取消息内容

openai python sdk 1.0+ 版本已将 api 响应改为 pydantic 模型对象,不再支持字典式下标访问(如 `response[‘choices’][0][‘message’][‘content’]`),需改用点号链式属性访问。

在 Openai 官方 python SDK 升级至 v1.0(特别是当前主流的 v1.x 系列,如你使用的 v1.12.0)后,client.chat.completions.create() 的返回值不再是传统字典(dict),而是一个 ChatCompletion 类型的 Pydantic 模型实例。这意味着你不能再使用方括号语法(如 response[‘choices’] 或 response.choices[0][‘message’])来访问字段——这正是报错 ‘ChatCompletion’ Object is not subscriptable 的根本原因。

✅ 正确做法是:统一使用点号(.)访问属性,并遵循响应结构的嵌套路径:

def ask_chatgpt(question, model="gpt-3.5-turbo", temperature=0.7, max_tokens=500):     try:         response = client.chat.completions.create(             model=model,             messages=[                 {"role": "system", "content": "You are a helpful assistant."},                 {"role": "user", "content": question},             ],             temperature=temperature,             max_tokens=max_tokens,         )          # ✅ 正确:Pydantic 模型属性访问(非字典下标!)         answer = response.choices[0].message.content.strip()         print(answer)         return answer      except Exception as e:         print(f"API 调用失败:{e}")         return None

? 关键变更说明:

  • response.choices 是一个 list[Choice],可按索引访问(如 response.choices[0]);
  • response.choices[0].message 是 ChatCompletionMessage 对象;
  • response.choices[0].message.content 是最终的字符串回复内容(类型为 str)。

⚠️ 注意事项:

  • 确保已正确初始化 client(如 from openai import openai; client = OpenAI(api_key=”your-key”));
  • 建议添加异常处理(如 openai.APIError, openai.RateLimitError),避免因网络或配额问题导致程序崩溃;
  • 若需兼容历史代码或做类型安全检查,可使用 isinstance(response, ChatCompletion)(需导入:from openai.types.chat import ChatCompletion);
  • 不要尝试 .json() 或 .dict()(除非显式调用 .model_dump(),但通常不必要)——直接属性访问更简洁、高效。

? 小贴士:可通过 print(response.model_dump()) 查看完整响应结构(调试用),但生产环境请避免打印敏感字段(如 usage 或完整 messages)。升级 SDK 后务必查阅 OpenAI Python 迁移指南,以规避其他常见 breaking changes(如参数名变更、异步接口调整等)。

text=ZqhQzanResources