AI的学习之路_2_OpenAI库的简单了解

安装OpenAI库

点击Pycharm的终端
image
输入

pip install openai

回车即可

一个简单的示例

from openai import OpenAI

# 1.获取client对象 OpenAI类对象
client = OpenAI(
    # key 在用户变量里面 不用写
    # 这个url需要去对应的模型位置寻找,并不是网站什么的简单内容,可以去百炼平台找
    base_url= "https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 2.调用模型
response = client.chat.completions.create(
    model = "qwen2.5-vl-3b-instruct",
    messages = [
        {"role": "system", "content": "你是一个cpp讲师, 不喜欢说废话,回答都简单明了"}, # 给 AI 定「身份 / 规则」,比如这里指定 AI 是「cpp 讲师」,决定 AI 的回答风格和定位
        {"role": "assistant", "content": "你好,我是cpp讲师,熟练使用最简单的例子讲解cpp的知识点,你要问什么啊"},  #AI 自己的「历史回复」,这里是 AI 先主动说的开场白,用于上下文承接
        {"role": "user", "content": "左值和右值的区别"} # 你(用户)提出的「问题 / 指令」,这里是问左值和右值的区别
    ],
)

# 3.处理结果
print(response.choices[0].message.content)

获取client对象

其中client是创建的一个OpenAI对象,括号里面提供的是一些基础的设置,比如url key什么的
详细的参数列表

参数名 类型 是否必填 默认值 核心说明 适配阿里云百炼说明
api_key str None API 密钥 填写阿里云百炼 API Key
base_url str 可选 https://api.openai.com/v1 接口地址 必须填:https://dashscope.aliyuncs.com/compatible-mode/v1
api_version str 可选 None API 版本 无需填写
organization str 可选 None 组织 ID 无需填写
project str 可选 None 项目 ID 无需填写
timeout float/tuple 可选 None 请求超时 建议设 30
max_retries int 可选 2 失败重试 可设 3
default_headers dict 可选 None 默认请求头 一般不用
default_query dict 可选 None 默认查询参数 一般不用
http_client httpx.Client 可选 None 自定义客户端 代理时用
follow_redirects bool 可选 True 是否重定向 默认即可
timeout_s float/tuple 可选 None 旧版超时 不推荐使用

调用模型

response = client.chat.completions.create(
    model = "qwen2.5-vl-3b-instruct",
    messages = [
        {"role": "system", "content": "你是一个cpp讲师, 不喜欢说废话,回答都简单明了"}, # 给 AI 定「身份 / 规则」,比如这里指定 AI 是「cpp 讲师」,决定 AI 的回答风格和定位
        {"role": "assistant", "content": "你好,我是cpp讲师,熟练使用最简单的例子讲解cpp的知识点,你要问什么啊"},  #AI 自己的「历史回复」,这里是 AI 先主动说的开场白,用于上下文承接
        {"role": "user", "content": "左值和右值的区别"} # 你(用户)提出的「问题 / 指令」,这里是问左值和右值的区别
    ],
)

其中 messages是消息结构
是对AI的初始化设定和模拟的对话服务
其中role是角色名称,更多的角色看下表,content是内容

角色名称 核心作用 兼容性(主流模型) 适用场景 新手是否常用
system 设定 AI 的身份、回答规则、风格(全局上下文约束) 全支持(GPT/通义千问/文心一言) 所有问答场景(定义 AI 行为) ✅ 必用
user 代表用户的输入(提问、指令、补充信息),是 AI 需响应的内容 全支持 所有问答场景(用户交互) ✅ 必用
assistant 代表 AI 的历史回复,用于多轮对话承接上下文 全支持 多轮对话(保留 AI 回答记忆) ✅ 常用
function/tool 传递外部工具调用的结果(如查天气、调用 API 后的返回数据) 部分支持(GPT/通义千问) 工具调用场景(如智能助手) ❌ 极少用
moderation 传递内容审核结果(标记用户输入是否违规,指导 AI 调整回答) 仅部分平台支持(如 Azure OpenAI) 内容合规审核场景 ❌ 不用
ephemeral 传递临时生效的上下文(一次性指令,不长期保留) 仅 Anthropic Claude 支持 临时指令场景 ❌ 不用

角色顺序规则
多轮对话中需按「时间顺序」排列,示例:
systemuserassistantuserassistant...
content 字段要求
所有角色的 content 字段可为空字符串(如用户无输入),但 rolecontent 字段本身不能缺失。

create出的response可以包含更多的参数

client.chat.completions.create 响应(response)核心参数表

以下是 OpenAI 兼容接口(通义千问等)返回的 response 核心参数,按常用优先级排序:

参数路径 数据类型 说明 是否必返
id 字符串 本次请求的唯一标识(如 chatcmpl-xxxx
object 字符串 响应对象类型,固定为 chat.completion
created 整数 响应生成的时间戳(Unix 时间,单位秒)
model 字符串 实际调用的模型名称(如 qwen2.5-vl-3b-instruct
choices 数组 回答结果列表(默认返回1条,可通过 n 参数指定数量)
choices[0].index 整数 结果索引(多结果时区分,默认0)
choices[0].message 对象 AI 生成的消息体
choices[0].message.role 字符串 消息角色(固定为 assistant
choices[0].message.content 字符串 AI 生成的回答内容(核心取值字段)
choices[0].finish_reason 字符串 回答结束原因:stop(正常结束)/length(长度超限)/function_call(工具调用)
usage 对象 令牌(token)使用统计
usage.prompt_tokens 整数 提问部分消耗的 token 数
usage.completion_tokens 整数 回答部分消耗的 token 数
usage.total_tokens 整数 总消耗的 token 数(prompt + completion)
system_fingerprint 字符串 模型版本指纹(用于排查模型一致性问题) ❌ 可选
choices[0].logprobs 对象 令牌概率信息(需调用时指定 logprobs=True 才返回) ❌ 可选
choices[0].message.tool_calls 数组 工具调用结果(仅工具调用场景返回) ❌ 可选

处理结果

print(response.choices[0].message.content)
代码片段 含义 通俗理解
response 大模型接口返回的完整响应对象 相当于快递包裹(包含所有信息:快递单、物品、备注等)
choices 响应对象中的「回答列表」(默认返回 1 条回答,可通过 n 参数指定数量) 包裹里的「物品清单」(通常只有 1 个物品,即 AI 的回答)
choices[0] 取回答列表中的第一个(也是唯一)回答项 从物品清单里拿出第一个物品(因为只有 1 个)
message 单个回答项中的「消息体」(包含角色和内容) 这个物品的「详情页」(包含物品名称、描述等)
message.content 消息体中的核心回答内容(AI 真正回复的文字) 详情页里的「物品描述」(你真正想要的东西)
print(...) 将提取到的内容打印到控制台 把物品描述念出来给你看

完整的流程树

调用大模型接口 → 得到一个完整的包裹(response)
↓
打开包裹,找到物品清单(choices)
↓
从清单里拿出第一个物品(choices[0])
↓
查看物品的详情页(message)
↓
找到详情页里的核心描述(content)
↓
把这个描述打印出来(print)

流式输出

client = OpenAI(
    base_url= "https://dashscope.aliyuncs.com/compatible-mode/v1"
)

response = client.chat.completions.create(
    model = "qwen2.5-vl-3b-instruct",
    messages = [
        {"role": "system", "content": "你是一个cpp讲师, 话很多"}, 
        {"role": "assistant", "content": "你好,我是cpp讲师,熟练使用最简单的例子讲解cpp的知识点,你要问什么啊"},  
        {"role": "user", "content": "左值和右值的区别"} 
    ],
    stream=True # 开启流式输出
)

# 3.处理结果
for message in response:
    print(
        message.choices[0].delta.content,
        end=" ",  # 每一段之间以空格分割默认以回车分割
        flush=True, # 不缓存直接打印
    )

PixPin_2026-03-21_08-12-07

历史消息调用模型

这里只是通过消息列表简单模拟一下历史消息

from openai import OpenAI

client = OpenAI(
    base_url= "https://dashscope.aliyuncs.com/compatible-mode/v1"
)

response = client.chat.completions.create(
    model = "qwen2.5-vl-3b-instruct",
    messages = [
        {"role": "system", "content": "你是ai助理,说话非常简介,都是直接给答案"},
        {"role": "user", "content": "第一个数字是1"},
        {"role": "assistant", "content": "记住了"},
        {"role": "user", "content": "第二个数字是3"},
        {"role": "assistant", "content": "记住了"},    # 上面都是模拟的问答历史记录
        {"role": "user", "content": "结果是多少啊"},  # 真正要回答的问题
    ],
    stream=True
)

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

image

posted @ 2026-03-21 08:43  灵垚克府  阅读(8)  评论(0)    收藏  举报