假设你已经获取到了API KEY,阿里云将这个 API 命名为 DASHSCOPE_API_KEY,但是国内大模型开启了新的篇章,考虑到以后可能会进行多模型的 API 输出对比,不再固定命为 OPENAI_API_KEY。为了后续代码正常执行,阿里云的 API 环境名暂时保持为 OPENAI_API_KEY。
环境变量配置
环境变量是操作系统中以键值对形式存储的配置项,常用于保存敏感信息(如 API 密钥、数据库连接地址等),这样可以避免将这些私密的信息直接写在代码中。
你可以通过操作系统设置环境变量,或者直接在 Python 脚本中设置,二选一。
在终端设置:
此方法仅适用于当前终端会话,关闭终端后设置会失效。
bash
export OPENAI_API_KEY="your-api-key"
写入配置文件(推荐):
bash
echo 'export OPENAI_API_KEY="your-api-key"' >> ~/.bashrc
source ~/.bashrc # 重新加载配置文件
通过 Python 程序设置环境变量:
此方法仅在当前 Python 程序或 Notebook 中有效,其他程序或 Notebook 不会共享此设置。
python
import os
os.environ['OPENAI_API_KEY'] = 'your-api-key'
os.getenv()
os.getenv() 是 Python 中 os 模块的一个函数,用于获取系统环境变量的值,语法:
python
os.getenv('VARIABLE_NAME', default_value)
'VARIABLE_NAME': 要获取的环境变量的名称。default_value(可选): 如果环境变量不存在,可以指定一个默认值,当环境变量未设置时将返回该默认值。
实例
假设你已经配置好了 OPENAI_API_KEY 的环境变量,并且想在 Python 脚本中访问它:
python
import os
api_key = os.getenv('OPENAI_API_KEY')
print(api_key) # 如果环境变量已设置,它将输出对应的值。
演示
首先命令行安装 openai 库。
bash
curl -LsSf https://astral.sh/uv/install.sh
export PATH="你的安装目录:$PATH"
uv --version
# 我临时建一个虚拟环境来做测试
uv venv /data/hhan/tmp-openai-env
source /data/hhan/tmp-openai-env/bin/activate
uv pip install openai
python -c "import openai; print(openai.__version__)"
单轮对话
在安装完成后,用 Python 进行访问尝试,在这里我们用通义千问-Turbo 进行演示。
python
from openai import OpenAI
import os
# 初始化 OpenAI 客户端,使用阿里云 DashScope API
client = OpenAI(
api_key=os.getenv('OPENAI_API_KEY'), # 如果你没有配置环境变量,使用 api_key="your-api-key" 替换
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 这里使用的是阿里云的大模型,如果需要使用其他平台,请参考对应的开发文档后对应修改
)
# 调用 API 获取模型回复
response = client.chat.completions.create(
model="qwen-turbo",
messages=[
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '你是谁?'}]
)
# 打印模型回复内容
print(response.choices[0].message.content)
输出
python
我是通义千问,是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我能够回答问题、创作文字、逻辑推理、编程等多种任务。你可以问我任何问题,我会尽我所能帮助你。
多论对话
之前的代码只提供了单轮的对话,没有历史记录,没有上下文,只是一个简单的临时对话,你可以将其理解为无痕浏览,关了就没了。
接下来,我们介绍多轮的对话,这里的轮指的是一次问答。模型本身并不会因为你的问题即时得到训练,所以也不会保留你之前的对话,那我们怎么去让模型知道呢?
答:朴素的手动保存上传。
python
from openai import OpenAI
import os
# 初始化OpenAI客户端
client = OpenAI(
api_key=os.getenv('OPENAI_API_KEY'),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 初始化对话历史
messages = [{"role": "system", "content": "You are a helpful assistant."}]
# 进行多轮对话,当前为3轮
for i in range(3):
# 获取用户输入
user_input = input("请输入:")
# 添加用户消息到对话历史
messages.append({"role": "user", "content": user_input})
# 调用API获取模型回复
response = client.chat.completions.create(
model="qwen-turbo",
messages=messages
)
# 提取模型回复内容
assistant_output = response.choices[0].message.content
# 将模型回复添加到对话历史
messages.append({"role": "assistant", "content": assistant_output})
print(f'用户输入:{user_input}')
print(f'模型输出:{assistant_output}\n')
输出
python
请输入:你好,想问一个问题?
用户输入:你好,想问一个问题?
模型输出:你好!当然可以,我很乐意帮你解答问题。请随时告诉我你想问什么,我会尽力提供帮助。😊
请输入:1+1的结果是多少?
用户输入:1+1的结果是多少?
模型输出:1+1的结果是2。😊
请输入:我刚刚问你什么问题?
用户输入:我刚刚问你什么问题?
模型输出:你刚刚问的是:"1+1的结果是多少?" 我回答你说:"1+1的结果是2。😊" 😊
流式输出
语言模型并不是直接得出完整的一句话,而是一个字一个字(其实是 Token,为了更大白话一点这里用字帮助理解)去生成的。前面的对话都是直接获取到了最终的生成结果,能不能实时输出它呢?
当然可以,下面的代码相当于之前的单轮对话,只是改变了输出方式。
python
from openai import OpenAI
import os
# 初始化OpenAI客户端
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 开启流式输出
response = client.chat.completions.create(
model="qwen-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是谁?"}
],
stream=True,
)
# 实时打印模型回复的增量内容
for chunk in response:
# 判断回复内容是否非空
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end='')
Q:为什么要获取流式输出?
使用直接的对话模式需要等待大模型生成结束后,才传回每个部分拼接后的结果,而流式输出可以实时了解到生成的信息,让使用者在模型生成的时候进行阅读,从而利用上中间的等待时间,这是一个可以同步进行的事情,等待浪费了我们的时间。毕竟有些回答刚一开口就可以否决掉。