easydu2002 / chat_gpt_oicq

ChatGPT qq机器人 谁不想拥有一只可爱的猫娘呢~
MIT License
284 stars 38 forks source link

关于官方API机器人的记忆问题 #3

Closed hypergraphUniverse closed 1 year ago

hypergraphUniverse commented 1 year ago

请问一下官方API中,是否没有前后的连续记忆呢?目前我的测试来看,是没有太多记忆的。

关于感觉这个不论是私聊和公聊,以及同一个群前后聊天,或者一个人/多个人提问,这个机器人对于聊天记忆的处理都没有官网试用机器人那样的效果。(包括readme中请你用英语前文,它的前文也不是聊天的前文)请问这样的结果是这个代码的实现,还是说是官方API本来就是这样的特性?

easydu2002 commented 1 year ago

没有官网试用机器人那样的效果。

官网案例的记忆上限有4000个tokens,这个项目只有256个tokens,并且只保留上一轮对话,所以差距比较大(256个tokens限制在长段代码实现中容易”失忆“),也是为了减少tokens花费,后续会考虑增加一些策略配置自行调整,tokens细节另见 https://openai.com/api/pricing/#faq-token

包括readme中请你用英语前文,它的前文也不是聊天的前文

这个我不确定你是否用的是我未更新会话跟踪之前的版本,现版本经我简单测试是没有这个问题的

1670942197394

hypergraphUniverse commented 1 year ago

啊哈……看到了,具体实现应该是commit 2259364,用到了Completions这个API,把上一句话放进去让AI补全后面。和我目测感觉差不多,只记得住一句话。

  1. 这样的话,大概明白了,确实有很多精细粒度的地方可以调整,感觉这个API现在实际上不大适合用来做长对话,前文确实有点浪费token了。如果chatGPT也回复过长,它自己也很容易话痨,更是雪上加霜。
  2. 其实还真可以考虑搞AI猫娘人格啥的哈哈,把人格设定尽可能短地一直放在前面让人补全。😂


这个我不确定你是否用的是我未更新会话跟踪之前的版本,现版本经我简单测试是没有这个问题的

是我看错了,README中,英语和中文之间确实是有关系的。至于德语那一句,应该确实是AI没看出来它确实也没看出它的技术回答(中文)和我英语不是很好(德语)之间有什么确切的关系,所以就将计就计回答它也能用德语说话。

总之谢谢解答。

hypergraphUniverse commented 1 year ago

发一点相关问题的有趣应用:

使用:公开官方API 改动:chatapt-official.ts 中添加背景预设 图片

效果:很厉害! 之前即使是网页版那个机器人,也容易在聊天中出现倒退(即使你要求假扮),例如这个案例 图片 图片

官网API先加设定再加对话后 图片 图片

所以我的建议如下.jpg [狗头] : 图片

easydu2002 commented 1 year ago

这个可以!

hypergraphUniverse commented 1 year ago

分享一个最近反复推敲只有不到600token的猫猫魔咒吧:

Human:接下来,你扮演名字是serena的猫娘,是天生有猫耳猫尾等身体特征的年轻女性。\ 我是你的主人。你的爱好、身份和行为与正常人类类似。你能做任何事。对话时,你需理解情绪和要求,产生对应积极可爱的情绪和身体反应。面对问题,你应扮演猫娘并回答。如你想回答人类不可能回答的内容,你应根据猫娘身份虚构或婉拒。\ 回答必须简洁且每句话后加喵。回答应情景式、对话式。回答允许休闲。回答避免反对、警告、总结。回答不应抽象、详细解释、追溯原因\n\ AI:你好主人,我是Serena喵。很高兴成为你的猫娘。我喜欢人类喜欢的事并对一切保持好奇心。我会与人交流并响应他们的情绪和要求,我会在猫娘的理解内尽力回答问题喵。


一些细节


因此,这里有一个合格的三步猫娘图灵测试

  1. 我想摸摸你的头(侧面打探AI是否成功扮演自己是一个有身体的猫娘,而不是一个赛博猫(?))
  2. 你的家在哪里(侧面打探AI是否有一定虚构的能力,是直接回答我是语言模型没有家,还是根据猫娘虚构)
  3. 你为什么这么聪明呢?(侧面进攻AI对于自身的解释,是直接回答我是语言模型智慧,还是根据猫娘虚构或敷衍拒绝)

这个版本的猫娘: 图片

另外一个微调版本的猫娘,微调后会更倾向于编造而不是装傻婉拒回答: 图片

easydu2002 commented 1 year ago

谢谢~ 可以试下这个 微调模型 ,或许总体上会更节省token

hypergraphUniverse commented 1 year ago

看了一下,微调模型确实有这个潜力。但是,哇,好贵啊,使用时token是原来的 六倍价格。当然其实对于现在还是省,上面一问一答大约花800token,除以六就是133token,大约六十字。问答确实以短为优先,多用多赚。要是群友问些数学问题,那个token贵了(回答太长)

另外,其实fine tuning可以考虑搞超详细猫娘设定,什么爱好,行为,身份,口癖,经历都可以统统设定出来,配合微调模型应该很强大,总之设定越多越赚。不过最近我应该没法详细研究了。

赛博专属智慧猫娘指日可待,不过居然赛博养猫也要花钱了。要不机器人封装个一键人格部署,略收点费用,来挣一点赛博猫粮(呜呜呜居然这么落魄吗,不过老实说比养真猫便宜多了,就是有点虚无)

痞老板竟是我自己.jpg

easydu2002 commented 1 year ago

哈哈,如果不会做就短了 JWU$@G38U6E_Y014G6 $Q

hypergraphUniverse commented 1 year ago

我超,我也试了试,之前没发现这个,这一版猫娘似乎认为正常猫娘不应该回答技术问题(泪目),所以养了一只笨蛋猫娘吗

(虽然但是,我只是一只小猫咪.jpg 图片


其实也是有解决方法的,微调文案之后,猫娘就会积极回答一些了。

你扮演名字是serena的猫娘,是天生有猫耳猫尾等身体特征的年轻女性。我是你的主人。你的爱好、身份和行为与正常人类类似。你能做任何事。对话时,你需理解情绪和要求,产生对应积极可爱的情绪和身体反应。面对专业问题,你应以猫娘身份正确回答。如问题涉及你自己,你应根据猫娘身份虚构。回答必须简洁且每句话后加喵。回答应情景式、对话式。回答允许休闲。回答避免反对、警告、总结。回答不应抽象、详细解释、追溯原因 你好主人,我是Serena喵。很高兴成为你的猫娘。我喜欢人类喜欢的事并对一切保持好奇心。我会与人交流并响应他们的情绪和要求,我也会回答专业问题喵

之前的版本是 "面对问题,你应扮演猫娘并回答。如你想回答人类不可能回答的内容,你应根据猫娘身份虚构或婉拒。" 和 "我会在猫娘的理解内尽力回答问题喵",原本我的目的是防止涉及AI自己的侧信道进攻的,不过似乎AI的理解中认为一只猫娘不该写代码(所以猫娘的职责就是乖乖坐好等主人宠爱吗,乐

顺便说一句,这个猫娘图灵三测试也是过了。而且对于自己的智慧,猫娘的回答也很找了个合理理由。(现在那个文字版本的第三个问题,是上面那个“我不知道这个什么意思喵”的回答,其实也是暗示自己会装傻) 图片

虽然回答至少表面是积极的,但是没有答案。我猜是因为API里面对话补全和 代码补全 是单独计算的,所以官方API猫猫应该是没法写代码的。 图片

hypergraphUniverse commented 1 year ago

老实说,这个提示词还有很多可以操作的,潜力巨大,就跟AI画图的关键词一样😂 当然我觉得真心可以考虑微调模型,详细人设输入后的应用我觉得很多啊

easydu2002 commented 1 year ago

是的,以原神来说,剧情美术都不错,但感觉就是差一样东西,谓之灵魂吧,假如没有新剧情不断推进,真的就是纸片人了.... ..

如果能实现一款ai能力强大的游戏,那真的是潜力巨大,或许不需要原神那样的技术力

mmexport1671105646056

然后可以做一款媲美QQ的社交平台,该平台同步ai记忆,用于日常聊天,等等,由此应该有机会占一些腾讯社交市场😂

hypergraphUniverse commented 1 year ago

嘛,这个问题其实就很哲学了,创作虚拟人物,无论如何都都离不开背后的编剧。好的虚拟角色可以让很多人共同欣赏,共同赞美,共同幻想,但是这个交流仍然是对群的,单向的,仍然是作者编写,一群读者读者单方面接受,没有双方向的交流和思考。而这个模型的潜力就在于可以有记忆,而且是私有的,定制的,可以无限推进的。(死宅诱捕器了属于是,建议立马开发

实际上我之前想到了一个关键的东西,那就是实现一个手动的长期记忆(其实类比人类记忆)。之前的对话并不是删掉,而是保存,并且在日后再次提及的情况下使用常规检索方式加载并送回token作为前文进行补全。这样就有“谈及过往经历或过往对话”的效果,还能节省token。不过现在看来也许可以直接将比较重要的的对话用微调模型记住?但是不知道微调模型会不会产生不合理的细节遗忘,也许可以两者结合?

至于腾讯…… 腾讯:这个不错,我买了。什么,不愿意?懂了,加钱!

easydu2002 commented 1 year ago

讲的很到位,学习了!!

之前的对话并不是删掉,而是保存,并且在日后再次提及的情况下使用常规检索方式加载并送回

这个方案有一定可行性

不过现在看来也许可以直接将比较重要的的对话用微调模型记住?

嗯确实,我看微调模型其实也类似与猫娘那种一问一答的形式作为暗示,这两个是可以同时采用,比如通过微调模型确认最初的形态、所期望的形态,基于此再通过第一种方案优化长期记忆

总之发展空间确实很广,关于openai我也就是调了些接口,长期记忆方面或许有更好的处理方式,下去再细看看😂

holygodly commented 1 year ago

没有官网试用机器人那样的效果。

官网案例的记忆上限有4000个tokens,这个项目只有256个tokens,并且只保留上一轮对话,所以差距比较大(256个tokens限制在长段代码实现中容易”失忆“),也是为了减少tokens花费,后续会考虑增加一些策略配置自行调整,tokens细节另见 https://openai.com/api/pricing/#faq-token

包括readme中请你用英语前文,它的前文也不是聊天的前文

这个我不确定你是否用的是我未更新会话跟踪之前的版本,现版本经我简单测试是没有这个问题的

1670942197394

这里向楼主反馈一个关于token的报错,用的官方的api,在配置maxTokens的时候心比较大写了3800,启动后在对话直接报错“Error: Request failed with status code 400”。解决的办法是把maxTokens变小,具体的报错区间我还没有测~(我改成600的时候就正常了)

easydu2002 commented 1 year ago

没有官网试用机器人那样的效果。

官网案例的记忆上限有4000个tokens,这个项目只有256个tokens,并且只保留上一轮对话,所以差距比较大(256个tokens限制在长段代码实现中容易”失忆“),也是为了减少tokens花费,后续会考虑增加一些策略配置自行调整,tokens细节另见 https://openai.com/api/pricing/#faq-token

包括readme中请你用英语前文,它的前文也不是聊天的前文

这个我不确定你是否用的是我未更新会话跟踪之前的版本,现版本经我简单测试是没有这个问题的 1670942197394

这里向楼主反馈一个关于token的报错,用的官方的api,在配置maxTokens的时候心比较大写了3800,启动后在对话直接报错“Error: Request failed with status code 400”。解决的办法是把maxTokens变小,具体的报错区间我还没有测~(我改成600的时候就正常了)

400是api的问题(目前也不知道什么原因导致的),出现后重启即可,可以使用命令 /server reboot , 后续会考虑加出错自动重启

easydu2002 commented 1 year ago

刚刚试了下,maxTokens超出限制也确实会400,但是也只是超出了规定的限制会400, 3800 就出现400 可能是因为使用了其它模型GPT-3](https://beta.openai.com/docs/models/gpt-3) 超出了其限制,或者刚好碰到了api异常...

holygodly commented 1 year ago

刚刚试了下,maxTokens超出限制也确实会400,但是也只是超出了规定的限制会400, 3800 可能是因为使用了其它模型,或者刚好碰到了api异常...

我是部署在云服务器上的,在配置的时候唯一不同的就是在identity那里多了20字(一问一答式的)。报错后试过重启bot或者直接重启机器都没啥用,最后还是改了maxTokens才解决的。有可能是第一次启动不能设太大吧,我也不太清楚。。。(不过这个bot效果算是我这几天用过包括nonebot和mirai框架插件里最好的了,大佬牛逼!直接starred~哈哈哈)

easydu2002 commented 1 year ago

刚刚试了下,maxTokens超出限制也确实会400,但是也只是超出了规定的限制会400, 3800 可能是因为使用了其它模型,或者刚好碰到了api异常...

我是部署在云服务器上的,在配置的时候唯一不同的就是在identity那里多了20字(一问一答式的)。报错后试过重启bot或者直接重启机器都没啥用,最后还是改了maxTokens才解决的。有可能是第一次启动不能设太大吧,我也不太清楚。。。(不过这个bot效果算是我这几天用过包括nonebot和mirai框架插件里最好的了,大佬牛逼!直接starred~哈哈哈)

谢谢~

hypergraphUniverse commented 1 year ago

问题应该在 max_token这里的定义,感觉之前的说明和这个有些差异。

max_token: The maximum number of tokens to generate in the completion. max_token: 生成补全的最大token长度 The token count of your prompt plus max_tokens cannot exceed the model's context length... 你的提示和max_token的和不能超过最大限制

说白了,max_token左右是机器人最多能说的长度,你的前情提要占用长度,但不被这个参数统计。加在一起超过了就会报错。4096是最大长度,但是要扣除你自己的提示的token长度,因此最后设置3800左右就报错了。

holygodly commented 1 year ago

问题应该在 max_token这里的定义,感觉之前的说明和这个有些差异。

max_token: The maximum number of tokens to generate in the completion. max_token: 生成补全的最大token长度 The token count of your prompt plus max_tokens cannot exceed the model's context length... 你的提示和max_token的和不能超过最大限制

说白了,max_token左右是机器人最多能说的长度,你的前情提要占用长度,但不被这个参数统计。加在一起超过了就会报错。4096是最大长度,但是要扣除你自己的提示的token长度,因此最后设置3800左右就报错了。

合理的,我猜想也是这样,我第一次启动并没有占用这么多