1.6 OpenAI API
除直接在聊天界面中提问ChatGPT,还可以通过OpenAI API使用ChatGPT,只不过OpenAI API是按使用量收费的。根据使用的模型,收费也不同。读者可以通过OpenAI网站了解具体的收费规则。
OpenAI API里面的使用量就是指token[ token是用于自然语言处理的词的片段,它是生成文本的基本单位。不同的语言和分词方式可能会导致token和字符的映射关系不同。一般来说,英文中一个token对应大约4个字符,而中文中一个汉字大致对应2~2.5个token。例如,英文单词red是一个token,对应3个字符;中文词语“一心一意”是4个汉字,对应6个token。]的消耗量,包括输入token消耗量和输出token消耗量。前者是指向ChatGPT提的问题消耗的token数,后者是指ChatGPT的回复消耗的token数。如果选择了gpt-3.5-turbo模型,1000个输入token需要0.0015美元,1000个输出token需要0.002美元。如果选择了GPT-4模型,那么要贵得多(因为消耗的计算资源更大),1000个输入token需要0.03美元,1000个输出tokens需要0.06美元。所以选择模型要谨慎,否则你充的钱很快就会被用光。
在注册ChatGPT账号后,你的账号上会有5美元余额,作为测试OpenAI API的费用,不过这5美元不是永久的,有效期是4个月左右,不用就作废了。如果想长久使用OpenAI API,需要先用账号登录OpenAI官网,找到OpenAI API的账单信息。
然后,单击Set up paid account按钮,会弹出图1-16所示的页面,输入信用卡信息,绑定即可。如果成功绑定信用卡,使用OpenAI API时,在每个自然月结束后,会自动从信用卡中扣除OpenAI API消耗的费用。
使用ChatGPT API之前,要先获得API Key。API Key是一个以sk为前缀的字符串。读者可以从OpenAI网站申请API Key。当然,首先要有一个ChatGPT账号。
进入OpenAI网站的API keys申请页面后,单击Create new secret key按钮,可以申请任意多个API Key,如图1-17所示。
图1-16 绑定信用卡
图1-17 申请多个API Key
申请完API Key后,用API Key设置openai.api_key。API Key不要泄露给别人,否则任何人都可以使用你的API Key。另外,使用ChatGPT API是需要花钱的,费用在前面已经介绍了,所以别人得到了你的API Key,就相当于使用了你自己的钱。当然,万一泄露了API Key也不要紧,只需要删除旧的API Key,创建新的API Key即可,这样旧的API Key就作废了。
如果读者要利用ChatGPT API开发应用,建议自己创建一个服务器端程序,再将ChatGPT API包装一层,将API Key放到服务器端,这样别人就很难拿到你的API Key了。
OpenAI API支持使用多种语言开发,并为这些语言提供了相应的库。其中包括Python、Java、JavaScript、Go、C++、Rust等。有的库是OpenAI官方提供的,有的库是第三方开发的。本节会使用Python语言演示如何使用OpenAI API提问并接收和输出回复。
调用OpenAI API需要使用openai模块,首先,使用下面的命令安装该模块。
pip3 install openai
然后使用下面的代码向ChatGPT发送问题,并接收、输出回复以及消耗的token数。
import openai
openai.api_key = "这里应该填写API Key"
# 向ChatGPT发送请求
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # 选择了gpt-3.5-turbo模型
messages=[
{"role": "user", "content": "用Python实现冒泡排序程序"},
]
)
# 输出回复内容
print(response.choices[0].message.content)
# 输出总共消耗的tokens数
print('消耗的token数:',response.usage.total_tokens)
运行这段程序,会输出如下内容。
以下是Python实现冒泡排序的示例代码。
'''python
def bubble_sort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# Last i elements are already sorted
for j in range(0, n-i-1):
# 如果当前元素大于下一个元素,则交换它们
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
?
# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" %arr[i], end=' ')
'''
?
输出结果:
?
'''
排序后的数组:
11 12 22 25 34 64 90
'''
消耗的token数:221