【Qbot】2.ChatGPT的博弈:一场猫捉老鼠的游戏画上句号

该项目计划长期进行维护更新,欢迎star:https://github.com/zstar1003/Qbot

前言

上周日我在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明显要低一些,不过作为陪聊机器人,基本该有的功能都有

猜你喜欢

转载自blog.csdn.net/qq1198768105/article/details/128345364
今日推荐