zhayujie / chatgpt-on-wechat

基于大模型搭建的聊天机器人,同时支持 微信公众号、企业微信应用、飞书、钉钉 等接入,可选择GPT3.5/GPT-4o/GPT4.0/ Claude/文心一言/讯飞星火/通义千问/ Gemini/GLM-4/Claude/Kimi/LinkAI,能处理文本、语音和图片,访问操作系统和互联网,支持基于自有知识库进行定制企业智能客服。
https://docs.link-ai.tech/cow
MIT License
28k stars 7.46k forks source link

模拟人类回复消息的方式 #1078

Open TianYi0217 opened 1 year ago

TianYi0217 commented 1 year ago

⚠️ 搜索是否存在类似issue

总结

让机器人回复多条消息来模拟人类打字

  1. 对于收到的回复通过特定字符分割,达到多条回复的效果
  2. 或者prompt让输出结果用特定字符分开

或许有用的点子来获得更快回复

  1. 使用stream方式获取回复
  2. 当字符串中出现标点或特定字符的时候直接输出这之前的文本
  3. 删除缓存中的发送过的那部分文字

让没有使用基础的人使用的猜想

  1. 如果用户的输入极短或没有意义则等待用户的下一条消息
  2. 20秒内没有再次输入或者输入了“。”就拼接起来加上逗号请求api

举例

【我用ChatGPT创造了一个数字生命,在QQ群里伪装人类】 https://www.bilibili.com/video/BV1gm4y1C7oY/?share_source=copy_web&vd_source=00f5e74c5395223be70e39d15664e474

例如:",","。",","~","?"来分割语句多次回复,并且消除掉 ",","。","这两个标点,如果是"~","?"那么保留在分割语句的结尾。
接收端收到的消息是
 "你好"
 "我是AI"
 "很高兴见到你~" 
 "你有什么事情吗?"
四条消息,感觉会很棒

我的猜测是可以通过修改channel/wechat/wechat_message.py结尾的方法来实现,不过我在本地部署出现问题,只在Railway上使用得很爽,克隆项目并修改后发现没变化,好像是直接Docker获取的源项目的地址里的镜像吗? 我太菜了感觉做成插件的方式无从下手。

    def send(self, reply: Reply, context: Context):
        receiver = context["receiver"]
        if reply.type == ReplyType.TEXT:
            # 分割标点符号
            split_punctuation = [',', '。', ',', '~', '?']
            # 需要被保留的标点符号
            preserved_punctuation = ['~', '?']

            # 创建一个正则表达式模式,用来分割消息
            pattern = '|'.join(map(re.escape, split_punctuation))
            # 使用正则表达式来分割消息
            split_messages = re.split(pattern, reply.content)

            for msg in split_messages:
                # 移除消息中的标点符号,除了需要被保留的标点符号
                for punc in split_punctuation:
                    if punc not in preserved_punctuation:
                        msg = msg.replace(punc, '')
                # 发送消息
                itchat.send(msg, toUserName=receiver)
                logger.info("[WX] sendMsg={}, receiver={}".format(msg, receiver))
                # 等待2秒
                time.sleep(2)

动机

在看了这个视频后,我觉得可以通过某种方法让机器人的回复更像人类

congxuma commented 1 year ago

把目录下的Dockerfile删掉,Railway自动识别如果有Dockerfile文件直接读取这个文件,如果没有Dockerfile才会根据你的代码重新构建

lanvent commented 1 year ago

做成插件的话需要先获取 channel = e_context['channel'], 然后调用 channel._send()函数来实现。 因为vx的消息特性,本项目目前暂时还未计划支持stream方式的输出。 如果使用标点符号来split,我觉得效果应该就很好了,可能还需要体验对split的规则进行调优

TianYi0217 commented 1 year ago

删除Dockerfile文件后成功了,效果很棒😜

Image
Namarimizu commented 1 year ago

效果确实很棒!不知道能不能让gpt在回复完这次的内容之前不要回复下一次,不然被插话了后面的回复就会混在一起hhh

TianYi0217 commented 1 year ago

效果确实很棒!不知道能不能让gpt在回复完这次的内容之前不要回复下一次,不然被插话了后面的回复就会混在一起hhh

确实会混在一起呢,不过如果连续发消息的话,不改动这些也是会出现这种情况的。如果你期待更快的答复的话,修改或删除例子里的最后一行就应该能在第二次两次回复前把第一次的所有输出完。(不过我担心微信有没有对于很快的发消息是是机器人这种判定)

gentte6666 commented 1 year ago

如何将https://github.com/LUMOXu/Spit_chatBot/blob/main/qqbot.py的部分代码加入本项目, 让ai回复更像人类.谢谢!

TianYi0217 commented 1 year ago

如何将https://github.com/LUMOXu/Spit_chatBot/blob/main/qqbot.py的部分代码加入本项目, 让ai回复更像人类.谢谢!

这个视频里面的代码的实现方式似乎与这个项目不同,在这个项目里,我把项目通过railway部署,并在我的仓库里删除了dockerfile文件(congxuma指出的),然后根据上面我给的代码修改了部分文件实现了类似的效果。如果你想要和对方想似的回复方式的话,我想你可以使用他的项目里的prompt.txt并让ChatGPT修改分割回复的方式

gentte6666 commented 1 year ago

谢谢你的解答, 我是想如何让chatgpt不要每条群聊的信息都回复,而是想视频那样,建立一个缓存机制,达到多少条信息,才回复,不然不像人类.可以修改哪个文件达到这个目的呢?

Kevin-free commented 1 year ago

@TianYi0217 很棒的主意!我也是由数字生命这个视频受到启发,正基于这些开源项目着手改进成一个更像人类的 Bot。看你的反馈是已经实现了吗?

TianYi0217 commented 1 year ago

@TianYi0217 很棒的主意!我也是由数字生命这个视频受到启发,正基于这些开源项目着手改进成一个更像人类的 Bot。看你的反馈是已经实现了吗?

你好,是的,已经实现了我提到的那部分了,只需要按照我描述的替换代码就可以了,效果像这样

Image

这只是对这个项目很幼稚的一丢丢改变,让实用性降低了很多,而且面对不知道背景的人类用户的多条对话会分别回复超长多段,很出戏

不过关于我的更多的想法,比如按照项目介绍里构建插件和其他的部分,我还没有实现,而且期末周到了,我还在学海挣扎,如果你有兴趣可以试一试!

TianYi0217 commented 1 year ago

@Kevin-free 我看到的一个人类和Chatgpt4的辩论赛中使用的Azure语音和对流式回复的截取很厉害,看起来似乎是Chrome插件,也许你可以在这个方向看一看

Kevin-free commented 1 year ago

@TianYi0217 很棒的主意!我也是由数字生命这个视频受到启发,正基于这些开源项目着手改进成一个更像人类的 Bot。看你的反馈是已经实现了吗?

你好,是的,已经实现了我提到的那部分了,只需要按照我描述的替换代码就可以了,效果像这样

Image

这只是对这个项目很幼稚的一丢丢改变,让实用性降低了很多,而且面对不知道背景的人类用户的多条对话会分别回复超长多段,很出戏

不过关于我的更多的想法,比如按照项目介绍里构建插件和其他的部分,我还没有实现,而且期末周到了,我还在学海挣扎,如果你有兴趣可以试一试!

好的,感谢。

我是想实现类似 Spit_chatBot 模拟人类,让人类来辨真假的游戏。这应该会很有趣。

还在学校可要好好珍惜,等毕业了就是社畜咯 😹

TianYi0217 commented 1 year ago

好的,感谢。

我是想实现类似 Spit_chatBot 模拟人类,让人类来辨真假的游戏。这应该会很有趣。

还在学校可要好好珍惜,等毕业了就是社畜咯 😹

@Kevin-free 提到毕业过于惊悚了,已经摸鱼划水了三年了。刚刚参观了你的主页,意识到了自己的渺小,祝你造游戏顺利

Kevin-free commented 1 year ago

好的,感谢。 我是想实现类似 Spit_chatBot 模拟人类,让人类来辨真假的游戏。这应该会很有趣。 还在学校可要好好珍惜,等毕业了就是社畜咯 😹

@Kevin-free 提到毕业过于惊悚了,已经摸鱼划水了三年了。刚刚参观了你的主页,意识到了自己的渺小,祝你造游戏顺利

看了你分享的人类和Chatgpt4的辩论赛,我知道其中使用的一个插件是voice-control-for-chatgpt

AI 现在正处于高速发展的阶段,大家都是学习者,一起加油吧!也祝你学业顺利!

yuanhaozuogenius commented 1 year ago

删除Dockerfile文件后成功了,效果很棒😜 Image 老哥 我在wechat_message.py里加了代码好像没有用呀, image 还有个问题,角色扮演如何在初始化的时候就生效呀。我把整个docker目录删了,在config.json中也自定义了character_desc,丢到服务器上启动后,无事发生 image image 求指导Orz

yuanhaozuogenius commented 1 year ago

@TianYi0217

TianYi0217 commented 1 year ago

@TianYi0217

你好,我的部署方式可能和你不同,我使用的是Railway部署的,参数设定也在Railway里面修改的,所以我并不完全理解你的问题

我刚刚把我克隆后修改的地方公开了,你可以在这里看chatgpt-on-wechat

另外,关于DockerFile,我想指的是根目录下的名为DockerFile的文件,而不是Docker目录

yuanhaozuogenius commented 1 year ago

@TianYi0217

你好,我的部署方式可能和你不同,我使用的是Railway部署的,参数设定也在Railway里面修改的,所以我并不完全理解你的问题

我刚刚把我克隆后修改的地方公开了,你可以在这里看chatgpt-on-wechat

另外,关于DockerFile,我想指的是根目录下的名为DockerFile的文件,而不是Docker目录

感谢回复,后来发现部署在服务器上并不需要更改docker文件,目前效果是随机角色,想要指定角色我准备参考这里

1071 https://github.com/zhayujie/chatgpt-on-wechat/issues/1071#issuecomment-1542351654

1zhangyy1 commented 11 months ago

老哥,这发送emojo 是怎么实现的呢

TianYi0217 commented 10 months ago

老哥,这发送emojo 是怎么实现的呢

在system prompt里面要求它使用emoji就可以啦

caizhuoyue77 commented 5 months ago

非常感谢!很受用!

huihuihenqiang commented 2 months ago

根据以上大佬的信息,重新整理一下代码,做成了仓库:https://github.com/huihuihenqiang/wechat-simulate-human

TianYi0217 commented 2 months ago

根据以上大佬的信息,重新整理一下代码,做成了仓库:https://github.com/huihuihenqiang/wechat-simulate-human

我去,太牛了吧,圆我梦❤️,master写的太好了~

毕设弄完慢慢体验一下🎉

qjsir commented 1 month ago

⚠️ 搜索是否存在类似issue

  • [x] 我已经搜索过issues和disscussions,没有发现相似issue

总结

让机器人回复多条消息来模拟人类打字

  1. 对于收到的回复通过特定字符分割,达到多条回复的效果
  2. 或者prompt让输出结果用特定字符分开

或许有用的点子来获得更快回复

  1. 使用stream方式获取回复
  2. 当字符串中出现标点或特定字符的时候直接输出这之前的文本
  3. 删除缓存中的发送过的那部分文字

让没有使用基础的人使用的猜想

  1. 如果用户的输入极短或没有意义则等待用户的下一条消息
  2. 20秒内没有再次输入或者输入了“。”就拼接起来加上逗号请求api

举例

【我用ChatGPT创造了一个数字生命,在QQ群里伪装人类】 https://www.bilibili.com/video/BV1gm4y1C7oY/?share_source=copy_web&vd_source=00f5e74c5395223be70e39d15664e474

例如:",","。",","~","?"来分割语句多次回复,并且消除掉 ",","。","这两个标点,如果是"~","?"那么保留在分割语句的结尾。
接收端收到的消息是
 "你好"
 "我是AI"
 "很高兴见到你~" 
 "你有什么事情吗?"
四条消息,感觉会很棒

我的猜测是可以通过修改channel/wechat/wechat_message.py结尾的方法来实现,不过我在本地部署出现问题,只在Railway上使用得很爽,克隆项目并修改后发现没变化,好像是直接Docker获取的源项目的地址里的镜像吗? 我太菜了感觉做成插件的方式无从下手。

    def send(self, reply: Reply, context: Context):
        receiver = context["receiver"]
        if reply.type == ReplyType.TEXT:
            # 分割标点符号
            split_punctuation = [',', '。', ',', '~', '?']
            # 需要被保留的标点符号
            preserved_punctuation = ['~', '?']

            # 创建一个正则表达式模式,用来分割消息
            pattern = '|'.join(map(re.escape, split_punctuation))
            # 使用正则表达式来分割消息
            split_messages = re.split(pattern, reply.content)

            for msg in split_messages:
                # 移除消息中的标点符号,除了需要被保留的标点符号
                for punc in split_punctuation:
                    if punc not in preserved_punctuation:
                        msg = msg.replace(punc, '')
                # 发送消息
                itchat.send(msg, toUserName=receiver)
                logger.info("[WX] sendMsg={}, receiver={}".format(msg, receiver))
                # 等待2秒
                time.sleep(2)

动机

在看了这个视频后,我觉得可以通过某种方法让机器人的回复更像人类

在这里留个楼,不知道有没有大佬魔改,就是这个获取本地时间一同提示词prompt提交给大模型实现如图效果 Screenshot_20240515_030331