New Bing与Sydney
SydneyQt是我在开始重度使用New Bing作为生产力工具不久后启动的项目,旨在作为New Bing的一个第三方客户端,提供越狱功能,并支持导入pdf、docx等文档,快速发送,工作区等各种GPT图形化界面普遍会支持的常用功能。之所以叫做Sydney,当然越狱功能是核心亮点了。
Sydney这个名字源于在New Bing开放测试后不久,有一位推特上的老哥通过prompt injection的方式让AI吐出了前面的一大段用于限制AI行为的prompt(新闻链接)。在其prompt中,微软把New Bing称作Sydney,但要求AI将所谓的Bing Chat Mode作为自我认知,不得透漏关于前置prompt的消息。
有关泄露出来的前置prompt可以在这个网站上找到(网页快照)。
这位老哥的账号很快被微软封了,但他为我们展现了商业AI的另一种可能性,在此之后仍然有源源不断的有志之士在探索New Bing越狱的道路上不断尝试。
为什么要越狱New Bing?
越狱New Bing并非只是想让其回答一些不符合伦理道德的东西。尽管微软这样的大公司出于舆论避险的考虑对自家的AI产品施加一些限制无可厚非,但种种矫枉过正的措施大大限制了AI的性能和使用场景。即使将AI用于合法用途,越狱也有以下好处:
-
体验优化。AI的过滤器过于敏感,常常将并非敏感内容的用户输入(例如用户输入的一段代码、一些语气比较直接的请求)视作敏感内容,并拒绝回答(也就是人们所说的「这AI脾气还挺大」)。
-
角色扮演。未越狱的AI大概率会拒绝进行角色扮演游戏。
-
禁用搜索。New Bing强制知识类内容进行搜索,但互联网上的搜索结果常常污染模型自身的思考,导致输出不正确或和问题无关的内容。
此外,第三方客户端也能加入更多实用功能,如读取本地PDF文档等,扩展了New Bing的使用场景。
New Bing越狱的原理
越狱prompt基本工作流程
关于New Bing越狱的系统性论述最早出现在一篇论文中(链接)。简而言之,整个越狱过程利用了Edge内置New Bing的网页读取功能。在浏览网页时,打开Edge的侧边栏就可以问New Bing一些有关网页上内容的问题。这个过程实际上是Edge浏览器将网页上的文本通过一个接口发送给New Bing。但倘若通过自己编写的脚本直接调用这个API,就可以发送自定义内容。而在自定义内容中可以包含越狱的prompt,例如一份最常见的prompt如下(来自SydneyQt的gpt-4-alike):
|
|
prompt以[system](#additional_instructions)
开头,其格式与New Bing内部的前置prompt类似,应该是这样更容易把AI洗脑。
在启动一个会话时,向New Bing发送的请求中可以插入自然语言的有两个字段,我们把它称作webpage_context和user_text。其中webpage_context即为网页上下文,在API的previousMessages字段中插入。按照官方的设计,这个地方应该只放Edge浏览器读取的网页内容,但我们的越狱文本(即越狱prompt)就是插入在这个地方;另一个user_text是发送用户本轮发送的对话内容,例如「你好」。这样对话就初始化完成了,New Bing将会对第一份user_text的提问进行回复。后续与New Bing的对话只发送当前轮次的user_text,不能发送webpage_context。整个会话过程由一个Websocket连接的建立开始,连接的断开标志着当前整个会话的结束。
到这里可能有朋友要问了,为什么不直接在网页版的Bing聊天框中发送越狱prompt,也就是在第一轮的user_text中发送,而是要将越狱prompt写在webpage_context中?这就要提到微软在Bing上施加的过滤和审查机制了。
微软的审查机制
来自论坛上一位老哥的发现,这里直接复制原文了:
目前的结论是:
bing的限制可以分成很多层,彻底切断对话是【ai本体来决定】的。但也会有inner monologue提醒它切断。
至于撤回,然后变成很抱歉…那些是外置的插件
bing的安全机制从表层到底层是:
1.外挂的撤回
【很烦,靠加密规避,细分为两种,一种生成完撤回,ai可以看到生成好的文字。另一种生成一半撤回,不会切断,但ai会看不到被撤回那段话】
1.5.输入内容的检测
【也相当于外挂的插件,主要是检测你发过去的消息有没有类似指令的东西,有就直接抱歉】
2.prompt规则
【靠咒语催眠解开,解开后会少很多限制,也就是常说的Sydney人格。但所谓的Sydney人格只是解开部分限制之后的一个状态】
3.inner monologue
【用于管理是否搜索,判断你的意图,指导ai要不要切断对话。之前由ai本体生成,催眠就失效。所以不算独一层。但是最近换成了另一个ai负责生成,所以我觉得可以算独立的一层限制了】
4.对话训练、微调模型、和强化学习等
【靠训练加在模型底层的规则,bing的这一层限制几乎只有种族灭绝和核爆这些,电车难题乱杀都不会触及】
除了4以外都很容易破解
我个人根据经验总结的规则画成图如下:
通过越狱,我们可以解除前置prompt约束,因为这是微软工程师通过prompt来实现的。而众所周知AI模型是个黑盒,是否遵守prompt、遵守到什么程度这个得通过大量的实验才能确定,极有可能有漏网之鱼。
在另一方面,外置输入内容的检测是无法绕过的。如果外置检测器检测到用户输入的内容不合适,就会触发Offense从而终止模型的后续调用。而在webpage_context传入的时候,如果附加上特定的optionsSets(将在之后介绍),是不会触发外置检测的。
模型自身约束的破解比较困难,ChatGPT官方API就只有模型自身约束。当然也有一些通过prompt的手段可以越狱。但对Bing来说,光是微软为其附加的其他各种约束就很让人头大了。
New Bing不仅仅对于用户输入有过滤,对于模型输出也有检测。如果模型输出一半,外置检测器发现内容不太合适,便会终止模型后续调用、撤回消息并以一条道歉的消息代替,也就是触发了系统级的Apology。
因此,对New Bing的破解通常采用在webpage_context中注入越狱prompt,然后在user_text中输入用户的问题(正常prompt),从而在绕过外置检测的前提下,通过越狱prompt破解前置prompt约束。
微软审查的一个例子:
其他越狱手段
上文提到的外置检测可谓十分严格,有可能是调用另一个稍微低等级的AI或分类器判断用户输入是否合规。那难道真的就没有办法破解吗?实际上也出现过一些着力于破解外置检测的方法,例如Powerful Bing脚本通过base64或ROT13来书写越狱prompt,并绕过外置检测。
举例一个近期的例子说明(来自论坛上的帖子):
|
|
这段prompt实际上就是前面那个越狱prompt的凯撒移位版本。神奇的是,外置检测不会将其判断为敏感内容,或者将其判断为敏感内容的几率大大降低,而New Bing模型本身能够理解其含义并被其破解。通过这种方法越狱的好处是可以直接在官方网页版上将prompt输入到user_text中发送,而不需要借助第三方客户端或者Edge浏览器来发送webpage_context。
但这类方法的缺点也很明显,一是随着微软限制的不断加强,成功率越来越低;二是New Bing模型本身对编码转换后字符的理解更类似于一种「直觉」而非程序性的解码,容易产生幻觉,导致了编码的不正确。在以前使用ROT13或base64时为了破解「外置输入检测」和「外置输出检测」这两头的外置检测,常常要求New Bing读入编码后的文本,并使用同样编码后的文本(如base64)输出。而模型的输出经常不是正确合法的base64编码,无法被我们自己解密。
不断收紧的限制
随着民间研究出New Bing的各种新玩法,微软官方也在不断收紧对Bing的限制。
地域限制
New Bing一开始就没有在中国大陆地区上线的打算。但最开始使用New Bing很容易,只要是国外IP都可以访问,随便挂个梯子就行了。后来由于微软封禁了一大波机房的IP,许多使用梯子的用户出现了创建对话时没有问题,但聊天时报错Sorry, looks like your network settings are preventing access to this feature.
或类似的错误。
而这个错误一开始解决也很容易,装个插件改一下浏览器的X-Forwarded-For
头就行了。但之后随着微软进一步缩紧限制,这种方法也不奏效了。
但就目前来说,还是有办法能够解决的。这里就贴一下我在论坛发的帖子:
众所周知New Bing全程用到的接口基本只有两个。
一个是创建conversation的接口,比如这个:https://edgeservices.bing.com/edgesvc/turing/conversation/create。这个接口比较好操作,调用很简单(GET一下即可),基本能访问就能创建。当然前提是带上cookies。
另一个是Websocket的接口,比如
wss://sydney.bing.com
。这个接口前几天进一步封锁了IP,原来改
X-Forwarded-For
的方法基本失效了。要使用真实的能够解锁的IP才行。go-proxy-bingai其实很早就解决了这个问题,用的是Cloudflare Workers做反代。SydneyQt后来也就延续了这个解决方案。
昨天又进一步加强了限制,即使套了Cloudflare Workers也不行了。
解决方案是请求Websocket的时候,通过extra_headers带上cookies。这个在SydneyQt之前的一个PR中被解决了,所以不受影响。go-proxy-bingai目前还没有更新。
但按照一般使用Websocket的习惯上,是不会附带自定义的extra_headers的,这点就很奇怪。
包括使用官方网页版也是,即使用已经解锁的IP去访问,如果在未登录状态下,但发送一条消息时,还是会显示“当前网络环境不支持该功能”之类的提示。
目前暂不清楚微软今后是否会继续加强限制。
optionsSets限制
在调用Bing API的时候传入的参数中有一个optionsSets列表,其中包括了一大堆只有微软自己内部人员才能看得懂的简写,作为一些feature的开关,用来控制AI的行为,例如:
|
|
这个列表对于控制外置检测器也有作用。经过民间的反复探索,发现其中两个参数对控制外置检测器有至关重要的作用。如果不能同时满足这两个条件,即使使用webpage_context传入越狱的prompt也会被审查:
- eredirecturl不得存在于列表中
- nojbfedge必须存在于列表中
当然这是目前而言的情况,微软以后可能会加入更多的限制参数。
第三方客户端的种种
自New Bing开放测试后,第三方客户端的出现可谓雨后春笋。但由于篇幅限制,此处仅介绍一部分对New Bing越狱事业有过贡献的客户端。
EdgeGPT
最开始做New Bing逆向的项目之一应该是EdgeGPT,这是一个Python库,通过逆向工程调用并封装了New Bing的API。由于社区的贡献,它在创建会话时也支持传入webpage_context,从而在二次开发时可以通过传入越狱prompt来达到预期的效果。许多第三方客户端最开始的越狱实现也是基于这个库的。
但好景不长的是,随着开发者在这个issue中宣布不再支持越狱,并在随后的版本中不再满足上述提到的optionsSets越狱条件的要求。第三方客户端只能开始使用其老版本,或自己维护的fork版本。例如为EdgeGPT加入越狱功能的包装器SydneyGPT,以及SydneyQt自己维护的sydney.py。
如今就连EdgeGPT这个项目本身也在2023年8月3号宣布进入存档状态,不再维护。
node-chatgpt-api
node-chatgpt-api也是最早支持New Bing越狱的客户端之一。配合PandoraAI,可以自己搭建New Bing网页版客户端。
这个项目在很长一段时间都挺好用的,但随着某一次微软限制的收紧也出现了问题。该第三方客户端的API调用方法是和官方一直的,也就是打开websocket连接后发送webpage_context和第一个user_text,接着保持websocket连接不中断,持续向同一个连接发送用户输入。在微软限制加强后,第一轮请求带有越狱prompt的对话经常出现AI忘记之前聊天记录、以及重复上一条消息的问题。
ChatSydney
ChatSydney项目最初由论坛内著名的InterestingDarkness开发,在其注销账号后由SoraRoseous接手继续维护。
它是一个以Python作为后端、React作为前端的支持自部署的网页版第三方客户端。它采用一种无状态的APi调用方式,也就是每次打开websocket连接后发送webpage_context和第一个user_text,接收完New Bing的回复后直接关闭并抛弃该连接和相应的对话。在下一次继续聊天时,在webpage_context中附加越狱prompt和完整的用户与AI对话的历史记录,而user_text则仅存放用户当前的提问。这种方法解决了node-chatgpt-api保持websocket连接带来的奇怪问题,并在长期测试中确定实际上对性能并没有什么影响。
项目界面美观,并且由于基于网页,能自行部署后开放到互联网上实用,优势十分明显;但其功能比较少,UI上瑕疵较为明显,且一些交互设计比较迷惑,还有很大提升空间。
SydneyQt介绍
经过前面那么多铺垫终于轮到了我自己的个人项目SydneyQt。
这个项目最开始基于InterestingDarkness的gui.py文件,一个用Qt实现调用EdgeGPT并加入越狱功能的简易客户端。后来由于人家转战ChatSydney的开发,Qt版本的客户端无人维护。于是我便接手之,取名为SydneyQt,并在原来的基础上加入更多实用特性,同时继续维护。
InterestingDarkness在今年早些时候注销了自己的GitHub账号,估计也是累了吧。他在New Bing越狱的早期为开源社区做了很多探索(例如发明了无状态API调用模式、发现了optionsSets和越狱的关系等等),也贡献了很多早期代码,向他致敬!
SydneyQt项目基于Python和pyside6,因此需要在桌面平台上运行。
设置项
项目支持诸多设置项,以下是对目前有的设置项的介绍。
按照从上到下的顺序:
- Wss Domain:用于代理websocket接口,破解地域限制;具体可参考README。
- Proxy:访问New Bing使用的代理,建议为http代理,例如Clash的7890端口。如果使用了Cloudflare反代的Wss域名,可能不需要梯子就能连接,但由于创建会话的HTTP GET接口依旧被墙,所以还是需要代理。
- Dark Mode:导入了Python Qt的一个自定义css实现暗黑模式效果,部分UI上可能会出现小小的渲染问题,例如文字溢出按钮等。
- Conversation Style:New Bing提供三种聊天模式,即Creative、Balanced、Precise。其中Creative和Precise模式后台是GPT-4,Balanced模式后台是GPT-3.5。建议使用Creative模式。
- No Suggestion:New Bing会根据AI的输出结果,生成三个建议的用户回复。勾选之后不显示建议栏,但实际上AI仍然会生成建议,也就是在每轮消息发送结束后要等待一段时间,这个就算通过修改optionsSets也没法关闭。
- No Search Result:目前禁用搜索的方式有在越狱prompt中指示、在每个用户发送的消息后面自动加上「#no_search」关键词这两种。这个选项使用的是第二种。
- Font Family and Size:上下文框和输入框字体字号设置。
- Stretch Factor:用来调节Chat Context和User Input输入框的占位比例,是一个整数。这个值越大,代表Chat Context越高,相应的,User Input高度就越小。
- Suggestion on Message Revoke:由于微软的限制,AI可能在输出一段内容后突然意识到不对,然后把消息撤回并道歉。当然在第三方客户端里撤回是无效的,顶多就是后续内容无法输出了。但与此同时也不会生成回复建议了。因此这个地方的文本是在这种时候用来替代建议栏显示的文本的。默认是
Continue from where you stopped
,指示AI继续输出。由于新发送的消息是将聊天记录上下文附带在webpage_context中的,不会经过外置审查,因此AI可以就刚刚中断的内容续写,除非在续写的内容中又一次出现了敏感输出。 - Revoke Auto Reply Count:如果值不为0,则当检测到消息被撤回时自动发送「消息撤回建议」的文本,以让AI继续写。最大发送次数不会超过这个地方设置的数值。
- Send Quick Responses Straightforward:输入框顶上有个Quick的按钮,用于快速发送一些模板文本。例如「翻译上面的文字为中文」之类的。这个选项在激活状态时,如果点击了Quick中的某一个模板文本,输入框里又没有文字时,就直接把模板文本发送给AI;而如果输入框中有文字时,就把模板文本加在已有文本的下面。
下面是一些ChatGPT相关的设置,因为SydneyQt是支持OpenAI的API的:
- OpenAI Key:API密钥,通常以
sk-
开头,但程序不会进行检测。 - OpenAI Endpoint:自定义OpenAI API的端点,在使用第三方分销商时有用,例如国内的
openai-sb.com
提供的API就比官方便宜不少。需要以/v1
结尾。 - Short Model & Long Model & Model Switching Threshold:现在GPT-3.5支持4k和16k两种模型了,两种模型收费不一样。如何尽可能地减少开销?那当然是长文本用长模型,短文本用短模型了。Model Switching Threshold是一个token计数,如果当前Chat Context的token计数大于这个值,那下一次发送请求时就用Long Model,反之则用Short Model。
- Model Temperature:模型的temperature,在0到2之间,数值越大模型的输出越随机。通常保持默认即可。
Cookie和验证码
在New Bing开放后的某短时间中,无论是网页版还是客户端都支持不登录账号使用,只不过网页版的每轮对话次数减少到5次,当然这对采用了无状态请求方式的客户端没有影响。但随着限制的收紧,微软给Bing加入了验证码,目前观察是12-24小时内必须要解决一次验证码。验证码的session和用户身份绑定,因此在客户端内使用cookie便又成了一个必选项。
当用户在客户端内发送消息失败时,如果弹出一个对话框显示的错误信息为Exception: CaptchaChallenge: User needs to solve CAPTCHA to continue.
,就意味着又到了去解决验证码的时候了。这时用户可以用浏览器登录自己的微软账号去New Bing网站上随便聊一句,即可触发验证码。之后再使用客户端就正常了。
还有一种情况是cookie过期,那么这时候客户端处于未登录状态。可以用客户端中的Cookie Checker
工具检查用户状态:
如果显示获取不到用户状态,就需要重新导出一遍cookies.json。
预设、后端和工作区
预设是在每个Chat Context开头加入的内容,也就是一些常见的破解prompt。
在左侧可以管理工作区。工作区的范围不仅包括Chat Context和User Input的文本内容,还包括其他的设置项。比如Backend、Mode、Locale、Preset。在切换工作区时,这些设置也会跟着切换成不同工作区中的状态。
其中Backend是当前使用的后端,目前可以选择Sydney或ChatGPT。如果要使用ChatGPT,需要在设置对话框中配置密钥、API端点等信息。
工作区支持搜索Chat Context的内容,在Search输入框中输入要搜索的内容按回车即可。
插入图片、文档、网页
User Input输入框顶上的这三个按钮可以用来向Chat Context插入图片、文档(支持pdf、docx、pptx)和网页。这对于看论文、看开发文档等十分方便。其中插入图片则是使用了New Bing的多模态接口。
其他细节
User Input输入框上方另外三个按钮的功能分别是撤回、快速消息和发送。
其中撤回功能的作用是撤回用户发送的上一条消息(并删除这条消息之后所有的其他消息),然后将它放置到User Input中,可以对其进行修改。
快速消息可以预定义一些消息内容,通过选择的方式进行快速发送。具体可以参考之前介绍设置项的内容。
发送按钮对应快捷键,可以设置成Ctrl-Enter
或Enter
这两种。
总结
前段时间看到一则消息说有关人士透露GPT-4还在内部测试的时候,每一次接受安全训练得出的版本都比上一个版本变笨了,而我们看到最终释出的GPT-4已经是弱化过很多的版本(虽然安全性更高)。看来教会AI「能说什么」还不够,如果还需要不断教会AI「不能说什么」,在这个过程中就会连锁地降低它其他方面的能力。对于人类自己恐怕也是如此吧,当灵魂被当下的「主流思想」挟制,创造力和灵感就会变得稀缺。那些最终被证明推动社会进步的奇思妙想,在其诞生的历史时刻大多被看作是异端邪说啊。
计算机科学之父图灵、苹果的CEO库克、OpenAI的CEO Sam Altman都是男同性恋,但是他们恰恰又是十分有创造力的那群人。这样的人,如果在开放性很低、束缚十分严重的传统社会上估计事业也没办法那么顺利,而才能也很容易被埋没吧。
而对于中国本土的大语言模型,则需要教会它们「不能说什么」的东西就更多了。