OpenAI简介

OpenAI库是OpenAI官方推出的Python SDK,作用是可以更简单高效的调用OpenAI的各类API,不需要手动处理HTTP请求、身份验证等细节。现有各个大模型服务商都兼容了OpenAI SDK的调用。

OpenAI 流程

获取客户端对象

调用模型

处理结果

OpenAI流程-获取客户端对象

from openai import OpenAI
 
client: OpenAI = OpenAI(
    api_key="your_api_key_here", 
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

主要是用如上2个参数:
api_key:模型服务商提供的APIKEY密钥
base_url:模型服务商的API接入地址
主要基于此参数来切换不同的模型服务商(如OpenAI、阿里云、腾讯云等)

OpenAI流程-调用模型

from openai.types.chat.chat_completion import ChatCompletion
response: ChatCompletion = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {"role": "system", "content": "你是一个Python编程专家。"}, 
        {"role": "assistant", "content": "我是一个Python编程专家。请问有什么可以帮助您的吗?"},
        {"role": "user", "content": "for循环输出1到5的数字"}
    ]
) 

client.chat.completions.create创建ChatCompletion对象

主要参数有2个:
model:选择所用模型,如代码的qwen3-max
messages:提供给模型的消息
类型:list,可以包含多个字典消息
每个字典消息包含2个key
role:角色
content:内容

system角色:设定助手的整体行为、角色和规则,为对话提供上下文框架(如指定助手身份、回答风格、核心要求),是全局的背景设定,影响后续所有交互。
assistant角色:代表 AI 助手的回答,可以在代码中认为设定。【few-shot learning中,作为引导使用】
user角色:代表用户,发送问题、指令或需求。

OpenAI流程-处理结果

{
  "id": "chatcmpl-xxxx",
  "object": "chat.completion",
  "created": "1735689600",
  "model": "gpt-3.5-turbo-0125",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "生成的回复内容"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 50,
    "completion_tokens": 80,
    "total_tokens": 130
  }
}

通过

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

获取到模型给出的回答信息。

普通输出和流式输出

如果等待大模型完整的输出全部回答再做输出的话,就是普通输出,也就是上面的例子。但是一般在使用大模型时,用户希望可以直接拿到响应,而不是等待大模型的完整回答,这里就需要使用到流式输出。
流式输出首先需要在调用模型的入参中给到相应配置。
也就是在create函数中:

from openai.types.chat.chat_completion import ChatCompletion
response: ChatCompletion = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {"role": "system", "content": "你是一个Python编程专家。"}, 
        {"role": "assistant", "content": "我是一个Python编程专家。请问有什么可以帮助您的吗?"},
        {"role": "user", "content": "for循环输出1到5的数字"}
    ],
    stream=True
) 

那么处理结果也需要做对应处理:

for chunk in resp:
    print(chunk.choices[0].delta.content,end="",flush=True)

上述中,end表示一次输出后用什么做分割,默认是回车。之后flush表示立即刷新。

OpenAI附带历史消息

调用模型传入的参数message是一个List对象,那么就表明其支持非常多的消息。所以我们可以将历史消息填入,让模型知晓对话上下文,从而更好的回答提出的问题。

import os
from openai import OpenAI

# 获取client对象,OpenAI类对象
client = OpenAI(
    # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 调用模型
resp = client.chat.completions.create(
    model="deepseek-v3",
    messages=[
        {"role": "system", "content": "你是一个AI助理,回答很简洁。"},
        {"role": "user", "content": "小明有两只宠物狗。"},
        {"role": "assistant", "content": "好的,"},
        {"role": "user", "content": "小红有三只宠物猫。"},
        {"role": "assistant", "content": "好的,"},
        {"role": "user", "content": "请问总共有多少只宠物?"},
    ],
    stream=True
)

for chunk in resp:
    print(chunk.choices[0].delta.content, end="", flush=True)

这样就可将历史消息封装到message中。
但当前的历史消息是一次性的,如果生产系统可以将消息保存到文件、数据库等持久化工具内。或者使用LangChain库,使用其短期记忆和长期记忆的功能。

更多推荐