在讨论正题之前,先说几句闲话,做点铺垫。
我发现很多人搞不明白GPT和ChatGPT的关系,所以经常看到类似“ChatGPT 4”这样的说法。
其实没有“ChatGPT 4”这个东西。GPT是一种叫做语言模型的技术,主要的作用是补全句子。比如你说“肩扛两百斤……”,它知道后面该接“麦子”而不是“挖掘机”。OpenAI(就是做ChatGPT的公司)目前提供GPT-3、3.5和4。
而ChatGPT则是用GPT制作的产品,主要的特点是能记住上下文,所以让人感觉能和它连续聊天。ChatGPT发布的时候用的是GPT-3.5,现在也支持4。
其实GPT很早就有了,但真正火爆全世界是从ChatGPT开始。所以我发布若愚之后,很多人问我什么时候支持连续聊天。
我的第一个反应是:不支持。因为若愚用的是OpenAI的API,但这个API并不支持聊天,至少看起来不直接支持。
这个叫“Chat”的API和我去年就开始在公司业务中使用的GPT-3没什么区别,都仍然是你给它一段话,它能帮你补全完整,或者做出回复。一来一往,到此为止。
那ChatGPT这种连续聊天的效果,到底是怎么做出来的?
谜底听起来特别扯:GPT本身没有记忆,要支持连续对话,必须让它了解上下文。要了解上下文,就得在每次你发言时,把之前你们的所有发言一起发过去……
我是搜索了很长时间、看了其他人的做法,并且大概了解了GPT是个什么东西之后,明白并接受这一点的。为什么要花这么多时间确认这个呢?因为,这么用很贵,而且开发起来很麻烦。
很贵容易理解,很麻烦是怎么回事?
这是因为,就算费用你能接受,也没办法一直和GPT对话,因为它能处理的数据量有限制。随着对话历史越来越长,早晚会达到它的限制,这时候OpenAI就会告诉你:内容太多,处理不了。
一般人估计不理解也不关心这个,但开发者得考虑用户体验,总不能超限就直接告诉用户出错吧,而且还是用户不知道有这个限制的情况下。所以,得想办法。
如何在有字数限制的情况下,让对话尽可能继续,这就需要做优化了。
若愚现在的做法非常简单粗暴:如果发现超限了,就把最开始的一问一答从上下文中删掉,持续这个过程直到没问题。
这个做法效果还行,当然显然可以继续优化。
比如,不是把超限的部分删掉,而是用GPT归纳,再把归纳结果发回去,这样会少丢一些上下文信息。
另外,在发给GPT前,可以先手工计算一下长度。如果超限就先用上面的办法处理,减少来回请求的时间。 当然上面只是大概的思路,我相信ChatGPT实际的做法肯定复杂的多。
说完了。最后强行插入两条硬广: