之前,逐行学习了使用DashScope SDK调用和验证千问大模型的Python代码。今天继续。开始 │ ▼导入 os 模块 │ ▼导入 dashscope 模块 │ ▼定义消息内容(system角色 + user角色) │ ▼调用大模型 API │ ▼判断响应状态码 │ ├── 等于 200 ──► 打印模型回答 │ └── 不等于 200 ──► 打印错误信息 │ ▼结束
import osfrom openai import OpenAIclient = OpenAI( api_key=os.getenv("DASHSCOPE_API_KEY"), # 不同地域的base_url不同,这里以北京为例[citation:1][citation:9] base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")completion = client.chat.completions.create( model="qwen-plus", messages=[ {"role": "system", "content": "你是一个严谨的合规审查员。"}, {"role": "user", "content": "请简单介绍下你自己。"} ])print(completion.choices[0].message.content)
第1行:import os
含义:导入 Python 的 os 模块。作用:os 是“操作系统(Operating System)”的缩写,提供了与电脑操作系统交互的功能。在这段代码里,它的作用是让你后面能用 os.getenv() 读取环境变量里的 API Key。Python 基础概念:import 就是引入现成的工具包,就像去工具箱里拿一把螺丝刀,拿来了才能在代码里用它的功能。
第2行:from openai import OpenAI
含义:从 openai 这个库中,单独取出OpenAI 这个类。作用:让你可以直接写 OpenAI(...),而不需要写成 openai.OpenAI(...),代码更简洁。Python 基础概念:from ... import ... 是导入的另一种写法,相当于“从工具箱里只拿一把扳手出来”。如果写成 import openai,后面每次都要写 openai.OpenAI(),更啰嗦。
第3行:空行
含义:纯粹为了代码可读性,把不同功能块分开。作用:不影响代码运行,是良好的编程习惯,就像写文章要分段一样。Python 基础概念:空行会被解释器忽略,只对人类读者有意义。
第4行:client = OpenAI(
含义:创建一个 OpenAI 客户端对象,赋值给变量 client。作用:client 就是一个“连接器”,后面所有调用大模型的操作都通过它来完成。Python 基础概念:client = ... 是变量赋值;OpenAI(...) 是创建一个对象(可以理解为“造一个连接器”)。类比:就像你办了一张健身房会员卡(client),以后所有健身操作都刷这张卡。
第5行:api_key=os.getenv("DASHSCOPE_API_KEY"),
含义:传入一个参数,指定 API Key。作用:os.getenv("DASHSCOPE_API_KEY") 从电脑的系统环境变量中读取 DASHSCOPE_API_KEY 的值,传给 api_key 参数。为什么这样写:API Key 不直接写在代码里,而是从环境变量读取,更安全,不会因为代码上传到 GitHub 而泄露密钥。Python 基础概念:os.getenv(...) 是函数调用,作用是读取环境变量;行首的缩进表示这行属于 OpenAI(...) 函数调用的参数列表,是上一行的延续。
第6行:# base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
含义:这是一行被注释掉的代码,不会执行。作用:如果你以后需要使用特定地域的 API 地址,可以删除前面的 # 来启用它。为什么注释掉:阿里云百炼的默认地址通常可以自动适配,大多数情况下不需要手动指定。Python 基础概念:# 开头的行是注释,Python 解释器会直接跳过它,只给程序员自己看。
上面红色字体部分,DeepSeek解释的是错的。现在是使用OpenAI SDK,它并不知道阿里云百炼的默认地址。所以这行代码不能注释掉,必须指定base_url才能正确调用API。
第7行:)
含义:函数调用的结束符。作用:表示传入 OpenAI 的所有参数都写完了,client 对象正式创建完成。Python 基础概念:圆括号 () 用来包裹函数的参数,左括号 ( 表示开始,右括号 ) 表示结束。
第8行:空行
含义:把“创建客户端”和“调用模型”两个不同功能块分开。作用:提高代码可读性。Python 基础概念:空行不影响运行,只是视觉上的分隔。
第9行:completion = client.chat.completions.create(
含义:通过 client 连接器,调用大模型的“聊天补全”功能,并把返回结果赋值给 completion 变量。作用:真正地发送请求给大模型,让模型去“思考”并给出回答。Python 基础概念:.(点号)表示“访问里面的东西”,client.chat.completions.create 是一层层深入访问对象。类比:client 是健身房会员卡 → .chat 是健身区 → .completions 是器械区 → .create 是“按下启动按钮”。
client . chat . completions . create(...) │ │ │ │ 连接器 聊天功能 补全功能 执行创建
第10行:model="qwen-plus",
含义:传入参数,指定使用 qwen-plus 模型。作用:告诉 API 用哪个大模型来回答你的问题。可选值:也可以换成 qwen-max、qwen-turbo 等,效果和价格略有不同。
第11行:messages=[
含义:传入 messages 参数,它的值是一个列表(以 [ 开头)。作用:准备要发送给大模型的消息内容,列表里可以装多个消息。Python 基础概念:列表用方括号 [] 表示,可以装多个元素,元素之间用逗号分隔。
第12行:{"role": "system", "content": "你是一个严谨的合规审查员。"},
含义:列表中的第一个元素,是一个字典。作用:设置系统角色(System Role),告诉模型“你是谁”,相当于给模型一个“人设”。Python 基础概念:字典用花括号 {} 表示,由键值对组成。"role" 是键(Key),"system" 是值(Value),中间用冒号 : 连接。缩进:8个空格(或两个缩进层级),表示这行属于 messages 这个列表。
第13行:{"role": "user", "content": "请简单介绍下你自己。"}
含义:列表中的第二个元素,也是一个字典。作用:设置用户角色(User Role)的输入内容,也就是你真正想问模型的问题。Python 基础概念:这是列表的第二个元素,和第一个元素之间用逗号分隔。
第14行:]
含义:messages 列表的结束符。作用:表示消息列表定义完了,方括号关闭。Python 基础概念:左方括号 [ 和右方括号 ] 成对出现,中间是列表的元素。
第15行:)
含义:client.chat.completions.create(...) 函数调用的结束符。作用:所有参数都传完了,正式执行这个调用。在这一刻,代码向阿里云百炼发送请求,大模型在云端开始计算,然后返回结果。Python 基础概念:圆括号成对出现,表示函数调用的开始和结束。
第16行:空行
含义:把“调用模型”和“打印结果”两个步骤分开。作用:提高代码可读性。
第17行:print(completion.choices[0].message.content)
含义:打印模型返回的回答内容。作用:在控制台显示大模型生成的文本,让你能看到模型的回答。Python 基础概念:print() 是 Python 内置的输出函数,括号里是要打印的内容。
逐一拆解:
completion:响应对象,也就是模型返回的一个大包裹
.choices:候选回答列表,模型可能给你多个备选答案
[0]:取列表中的第一个元素(Python 列表索引从 0 开始)
.message:消息对象
.content:消息的文本内容,也就是最终你要看到的文字
类比:就像打开一个快递包裹(completion),里面有一个箱子(.choices),箱子里第一个物品([0])上贴着一张纸条(.message),纸条上写着文字(.content),你用 print 把文字念出来给大家听。
代码执行流程:
┌──────────┐│ 导入模块 │ → os / OpenAI└────┬─────┘ ▼┌──────────┐│ 创建client│ → 读取API Key + 设置目标地址└────┬─────┘ ▼┌──────────┐│ 发送请求 │ → model + messages 打包发出└────┬─────┘ ▼┌──────────┐│ 网络传输 │ → 你的电脑 ↔ 阿里云百炼服务器└────┬─────┘ ▼┌──────────┐│ 接收响应 │ → 大模型生成的回答返回└────┬─────┘ ▼┌──────────┐│ 打印结果 │ → 显示在控制台└──────────┘
两种调用方式对比
| | |
|---|
| 导入 | import dashscope | from openai import OpenAI |
| 创建客户端 | | client = OpenAI(...) |
| 调用方式 | dashscope.Generation.call(...) | client.chat.completions.create(...) |
| 响应对象变量名 | response | completion |
| 提取回答内容 | response.output.choices[0].message.content | completion.choices[0].message.content |
| 错误处理 | 有 if response.status_code == 200 | |
| 优点 | | |
最终结果完全一样,只是写法不同。相当于学会了两种调用大模型的方法。
这段代码涉及的 Python 核心概念
| | |
|---|
| import os | |
| from openai import OpenAI | |
| client = OpenAI(...) | |
| os.getenv("DASHSCOPE_API_KEY") | |
| client.chat.completions.create | |
| [item1, item2] | |
| {"key": "value"} | |
| .choices[0] | |
| 函数名(参数1, 参数2) | |
| model="qwen-plus" | |
| # 这是注释 | |
| print(...) | |
结束。