前言
上周日我在B站发了个视频(https://www.bilibili.com/video/BV1Ud4y1e7BP),本来想水一期的(毕竟一个半月没更新了),不过借着ChatGPT的热度,播放量突破2w。
随之而来的是大批网友涌入群聊,想测验一下ChatGPT的性能,也有不少人是来交流搭建技术的。不过截至目前,OpenAi官方对其做了一些限制,以至于目前已经变得不太好用。为了防止一部分人的误解(如:进来发现不好用,误认为视频是人工假扮合成)以及一部分人的重复提问(如:为什么之前的教程xx步会报错),特此把最近与ChatGPT的博弈过程阐明一下。
博弈时间线
12.11 - 初始搭建
这天开始入坑ChatGPT,本以为抓个包就能调用到官方Web界面上的API,监听数据包一看没那么简单,数据的收发并不是请求数据-响应数据的普通模式,因此无法直接去进行调用。
在Github查阅到https://github.com/acheong08/ChatGPT这个仓库,该作者(下面统称为仓库作者)使用逆向工程成功接入官方Web的API,不过token每24小时会进行一次刷新,需要手动修改一下,总体来说运行比较正常。
12.12 - CloudFlare5秒盾
可能是周末官方服务被机器人频繁调用,这天周一官方一上班就新增了一道CloudFlare5秒盾,即访问ChatGPT网页时,需要先等待五秒。
在此过程中,服务器会将加密的请求参数写入cookie的字段cf_clearance
中,而普通的机器人访问无法携带这个参数,因此基本上只有真正的浏览器访问才能够通过这道检验。
这天机器人一度停止了半天,到了下仓库作者更新了版本,他使用浏览器模拟技术Selenium来应对CloudFlare的检验,不过cf_clearance
这个参数每两小时就会进行更新,因此每隔两小时就需要重新启动配置,只能说勉强能用。
12.13 - 谷歌验证
这天仓库作者又更新了一个版本,每隔两小时自动启动浏览器来刷新配置参数。不过很快,官方在登陆界面引入了一个谷歌验证(就是那个需要根据提示点击图片的麻烦验证),这就导致了每隔两小时启动浏览器来刷新配置参数时,需要人工介入来完成这道登录验证。
12.14 - 保持登录状态
仓库作者很快又找到了应对策略,他通过修改cookie的内容,实现了登录保活,这样又实现了自动化。官方很快提出应对策略: 在CloudFlare界面新增了一个点击确认,同时压缩短时间内同一账户的提问数量,因此这天频繁出现“Too many requests…”的响应报错。
12.15 - 区域限制
这天,官方掏出大杀器–直接根据ip进行区域限制:即亚洲等地区一小时内只能问一个问题,ChatGPT成了临时一次性机器人,几乎处于“瘫痪状态”。仓库作者也再无办法,于是将仓库进行存档,不再更新。
至此,这场猫捉老鼠的游戏来到终点。
过渡方案:调用官方API
模型简介
实际上,官方并无公开的ChatGPT调用方式,但是在官方文档中提供了一些可供调用的GPT-3模型:
据官方所述:text-davinci-003这个模型的综合性能最强,同时,这几个模型各有各的优势:
- Davinci: 复杂文本理解、因果分析、观点总结
- Curie:语言翻译、复杂文本分类、文本情感分析、摘要提取
- Babbage:文本分类,语义搜索分类
- ada:文本解析、简单分类、地址纠正、关键字提取
调用费用
针对不同模型,官方指定了不同的收费标准:
每个初始账户都有18$的账户余额,可以试用体验:
在个人信息主页(https://beta.openai.com/account/usage)可以查看到当前余额状态:
调用方式
调用API之前,需要现在官网上申请一个key,申请地址:https://beta.openai.com/account/api-keys
以python为例,下面进行调用示例:
首先需要安装openai库:
pip install openai
下面调用text-davinci-003
模型:
import openai
openai.api_key = "自己的key"
response = openai.Completion.create(
model="text-davinci-003",
prompt="你是谁啊",
temperature=0,
max_tokens=4000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
)
print(response['choices'][0]['text'])
UTF-8转中文
有些时候,服务器会返回\U0001F970
之类的UTF-8字符码,用下面的方式,可以转换成中文输出:
import re
def replace(matched):
h_s = matched.group(1)
h_i = int(h_s, base=16)
return chr(h_i)
def uni_to_cn(s: str):
result = re.sub(r"\\u([0-9a-fA-F]{4})", replace, s)
return result
if __name__ == '__main__':
cn = uni_to_cn('\U0001F970 \U0001F970 \U0001F970 \n Hello World \U0001F970 \U0001F970 \U0001F970')
print(cn)
注:代码中的这段内容是davinci模型返回出来的真实结果。
总结
在经历半天的群友测试后,发现davinci模型相比于ChatGPT来说,有以下这些优缺点。
- 优点
1.调用速度快,毕竟是官方API,没有那么多限制,速度嗖嗖的
2.可以联网,因此可以用它进行一些网页聚合搜索和推荐
- 缺点
1.输入长度限制,davinci的最大接受输入是4000个token,这就意味着太长的语言无法回答
2.性能比ChatGPT明显要低一些,不过作为陪聊机器人,基本该有的功能都有