AI的学习之路_2_OpenAI库的简单了解
安装OpenAI库
点击Pycharm的终端

输入
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 支持 | 临时指令场景 | ❌ 不用 |
角色顺序规则:
多轮对话中需按「时间顺序」排列,示例:
system → user → assistant → user → assistant...
content 字段要求:
所有角色的 content 字段可为空字符串(如用户无输入),但 role 和 content 字段本身不能缺失。
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, # 不缓存直接打印
)

历史消息调用模型
这里只是通过消息列表简单模拟一下历史消息
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,
)


浙公网安备 33010602011771号