2. 初识 LLM API:环境配置与多轮对话演示

假设你已经获取到了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:为什么要获取流式输出?

使用直接的对话模式需要等待大模型生成结束后,才传回每个部分拼接后的结果,而流式输出可以实时了解到生成的信息,让使用者在模型生成的时候进行阅读,从而利用上中间的等待时间,这是一个可以同步进行的事情,等待浪费了我们的时间。毕竟有些回答刚一开口就可以否决掉。

相关推荐
June5612 小时前
SSH 免密 + 主机指纹登录完整安装步骤(macOS)
运维·macos·ssh
高斯的手稿08013 小时前
使用VNC从Windows/Mac复制文字,粘贴到树莓派终端里
macos
Maynor9965 小时前
刚刚!谷歌 Gemini 推出 Mac 客户端
macos
承渊政道6 小时前
【递归、搜索与回溯算法】(二叉树深搜模型拆解与经典题型全面突破)
数据结构·c++·学习·算法·leetcode·macos·bfs
月诸清酒7 小时前
33-260416 AI 科技日报 (Gemini桌面应用登陆Mac,快捷键唤醒)
人工智能·macos
辰风沐阳8 小时前
nvm - node 版本管理工具【macOS/Linux】
linux·运维·macos
xuanwenchao1 天前
Mac M1/M2/M3/M4/M5芯片-系统安装Ubuntu
linux·ubuntu·macos
WMSmile1 天前
macOS 上安装 Wails 3(wails3)步骤
macos
不会写程序的未来程序员1 天前
nvm 安装教程:Node.js 版本管理全攻略 (Win/Mac/Linux) + .nvmrc 实战
linux·macos·node.js·前端开发·环境配置·nvm