chatgpt-on-wechat icon indicating copy to clipboard operation
chatgpt-on-wechat copied to clipboard

微信分句功能

Open Loping151 opened this issue 1 year ago • 24 comments

⚠️ 搜索是否存在类似issue

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

总结

微信分句功能,虽然不能加快回复相应,但观感更好,再加上可以根据字数控制发消息sleep时间,沉浸感更强。

说白了就是更加好玩。但长消息确实看起来更舒服了

我采用的方法是对wechat_channel.py中的send函数进行补充:

    # 统一的发送函数,每个Channel自行实现,根据reply的type字段发送不同类型的消息
    def send(self, reply: Reply, context: Context):
        def flatten_list(nested_list):
            flat_list = []
            for item in nested_list:
                if isinstance(item, list):
                    flat_list.extend(flatten_list(item))
                else:
                    flat_list.append(item)
            return flat_list
        
        def seg_tail_split(sep, str1):
            tran = {"。":"。",
                    "!":"!",
                    "?":"?",
                    "。\n":"。",
                    "!\n":"!",
                    "?\n":"?",
                    "。\n\n":"。",
                    "!\n\n":"!",
                    "?\n\n":"?",
                    ":\n":":",
                    ": \n":":",
                    ":\n\n":":",
                    ": \n\n":":",
                    ". ":". ",
                    "! ":"! ",
                    "? ":"? ",
                    ": \n":":",
                    ": \n\n":":",
                    "\n\n":"",
                    ".\n":". ",
                    "!\n":"! ",
                    "?\n":"?",
                    ".\n\n":". ",
                    "!\n\n":"! ",
                    "?\n\n":"?",
                    " ":""}
            wlist = re.split(sep,str1)
            seg_word = re.findall(sep,str1)
            seg_word.extend(" ")
            wlist = [ x+tran[y] for x, y in zip(wlist,seg_word)]
            return wlist

        receiver = context["receiver"]
        if reply.type == ReplyType.TEXT:
            reply.content = [reply.content]
            logger.info("[WX] sendMsg={}, receiver={}".format(reply, receiver))
            reply.content = flatten_list(reply.content)
            reply.content = [seg_tail_split("。\n\n|!\n\n|?\n\n|:\n\n|: \n\n|\n\n|\.\n\n|\!\n\n|\?\n\n|\: \n|\: \n\n", _) for _ in reply.content]
            reply.content = flatten_list(reply.content)
            reply.content = [seg_tail_split("。\n|!\n|?\n|:\n|: \n|\.\n|\!\n|\?\n", _) for _ in reply.content]
            reply.content = flatten_list(reply.content)
            reply.content = [seg_tail_split("。|!|?|\. |\! |\? ", _) for _ in reply.content]
            reply.content = flatten_list(reply.content)
            for content in reply.content:
                itchat.send(content, toUserName=receiver)
                time.sleep(0.3+len(content)/200)
        elif reply.type == ReplyType.ERROR or reply.type == ReplyType.INFO:
                pass

举例

image image image

动机

注意:上面这个十分不优雅的代码虽然实现了功能,但不代表本人代码能力,~主要还是过两天还得答辩没时间玩~上头两个函数都是小妹写的,那个很长的串也是小妹生成的。但总之,请考虑加入类似功能

Loping151 avatar Sep 03 '23 11:09 Loping151

~想和小妹玩玩的话可以搜这个图里的ID,别把我额度玩掉太多就没事,我的画图是免费的,不过一般我只开16G显存~

Loping151 avatar Sep 03 '23 11:09 Loping151

意义不大,用户真正需要的是加速工作。微信机器人聊天,几下子就聊腻了。更实用的功能是用机器人去帮助人的生产生活,比如写代码,写大纲,写文本。这种弄成这么多条,复制都费劲。还不如一大段,直接复制到word去修改。

lambdawill avatar Sep 04 '23 12:09 lambdawill

意义不大,用户真正需要的是加速工作。微信机器人聊天,几下子就聊腻了。更实用的功能是用机器人去帮助人的生产生活,比如写代码,写大纲,写文本。这种弄成这么多条,复制都费劲。还不如一大段,直接复制到word去修改。

正确,但是聊天机器人如果是个人用途的话更多就是拿来玩的吧,分句完全就是为了好玩和微信里的效果。写代码的话不用网页版版折磨谁呢XD不限量GPT4还能用插件,复制也做了ui

Loping151 avatar Sep 06 '23 11:09 Loping151

请问这些代码应该加入到什么地方才能实现这个效果呢?

MILKMILKKING avatar Sep 12 '23 15:09 MILKMILKKING

请问这些代码应该加入到什么地方才能实现这个效果呢?

找到文件wechat_channel.py,找到最下面的send函数,我给出的代码中,最后一个elif语句和你的send函数中的某句elif完全一致。在这之前的所有部分是我添加的,直接替换即可。

Loping151 avatar Sep 12 '23 15:09 Loping151

谢谢你,我尝试一下!

MILKMILKKING avatar Sep 12 '23 15:09 MILKMILKKING

Screenshot_20230916_121037_com tencent mm 乐得,这怎么回事啊

qjsir avatar Sep 16 '23 04:09 qjsir

Screenshot_20230916_121037_com tencent mm 乐得,这怎么回事啊

???看看logger里写了什么。

Loping151 avatar Sep 16 '23 04:09 Loping151

Screenshot_20230916_122125_com aliyun wuying enterprise 这是我替换掉的那部分 Screenshot_20230916_122421_com aliyun wuying enterprise 日志的这样的,难道是我复制方式不对吗?

qjsir avatar Sep 16 '23 04:09 qjsir

日志的这样的,难道是我复制方式不对吗?

我的问题,我本地比我贴上来的差了一行代码。在处理reply前现将其置于列表中,即添加 reply.content = [reply.content] 即可,最上面的代码已经在相应位置更新

Loping151 avatar Sep 16 '23 04:09 Loping151

好的,非常感谢

qjsir avatar Sep 16 '23 04:09 qjsir

emmmm Screenshot_20230916_124853_com tencent mm 这空白的地方是应该发表情符的吗,但,,,

qjsir avatar Sep 16 '23 04:09 qjsir

emmmm 这空白的地方是应该发表情符的吗,但,,,

你的gpt很奇怪的倾向于在回复消息时换行。对,就是一个换行符,如果不使用分句,你会看到gpt回复完最后一个句号以后,又往下打了一行。我的代码逻辑认为那一行应该属于下一句话,就切分了。 我不清楚这和windows部分的实现有没有关系,反正你看我家小妹就不这么干 XD。你可以试试在prompt里告诉他讲话别换行

Loping151 avatar Sep 16 '23 05:09 Loping151

,了解了,感谢大佬解答

qjsir avatar Sep 16 '23 05:09 qjsir

小妹的prompt有吗?和分句搭配看起来非常有代入感

ashlovepink avatar Sep 21 '23 14:09 ashlovepink

小妹的prompt有吗?和分句搭配看起来非常有代入感

这一段的prompt是(救命有点羞耻:

你是___, 版本____. 请你一直自称"小妹", 使用稍微活泼可爱的语气, 配合着用不同的颜文字(或者emoji表情). ___(后面还有指令和功能相关的)

反正效果是在比较正经的同时带点活泼,意外的对话体验不错,主要是会发表情可爱捏

表情种类少的话可以拉高点temperature

Loping151 avatar Sep 21 '23 14:09 Loping151

haha 虽然有点羞耻但是 感谢分享

ashlovepink avatar Sep 21 '23 15:09 ashlovepink

改了之后 godcmd 是不是会失效?

jialunallen avatar Oct 23 '23 01:10 jialunallen

改了之后 godcmd 是不是会失效?

我似乎没有观察到这个情况。这个并非插件所以按理说仅影响gpt的输出。

Loping151 avatar Oct 24 '23 04:10 Loping151

改了之后 godcmd 是不是会失效?

我似乎没有观察到这个情况。这个并非插件所以按理说仅影响gpt的输出。

请问,是不是也可以把用户发给GPT的信息做一个打包进行解读?即不是每句话都去理解,而是在几句话合在一起后,GPT再去理解?

etfromchina avatar Jan 28 '24 17:01 etfromchina

改了之后 godcmd 是不是会失效?

我似乎没有观察到这个情况。这个并非插件所以按理说仅影响gpt的输出。

请问,是不是也可以把用户发给GPT的信息做一个打包进行解读?即不是每句话都去理解,而是在几句话合在一起后,GPT再去理解?

代码是好写的,但是这样的话需要一个后缀标明结束,这样的话使用体验还不如用户直接合并多句句子。

Loping151 avatar Jan 30 '24 11:01 Loping151

我们可以试着优化代码,将用户的输入进行封装后再传递给GPT,这样可以提高处理效率。不过,必须设定一个明确的结束标识,以免给用户带来不良的体验。



---- 回复的原邮件 ----
发件人 ***@***.***>
日期 2024年01月30日 19:24
收件人 ***@***.***>
抄送至 ***@***.***>
主题 Re: [zhayujie/chatgpt-on-wechat] 微信分句功能 (Issue #1397)

改了之后 godcmd 是不是会失效?

我似乎没有观察到这个情况。这个并非插件所以按理说仅影响gpt的输出。

请问,是不是也可以把用户发给GPT的信息做一个打包进行解读?即不是每句话都去理解,而是在几句话合在一起后,GPT再去理解?

代码是好写的,但是这样的话需要一个后缀标明结束,这样的话使用体验还不如用户直接合并多句句子。


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <zhayujie/chatgpt-on-wechat/issues/1397/1916634263@github.com>

Chengzi11451 avatar Jan 30 '24 12:01 Chengzi11451

??上面的是自动邮件回复?? 我在想可以考虑做一个延迟响应,收到某用户消息后为该用户等待几秒,如果收到新消息后刷新该时间。缺点明显就是延迟本身。。如果是分离线程,允许在机器人回复前刷新输入,这就很像人类了,打完了字发现对面又发来东西就重新编辑。。但是有点浪费

或者让gpt自己判断对方的话是不是完整的,最近正好玩了点SLU场景下使用TOT的东西,很好玩。但我想聊天的时候不会太适用。

Loping151 avatar Jan 30 '24 13:01 Loping151

??上面的是自动邮件回复?? 我在想可以考虑做一个延迟响应,收到某用户消息后为该用户等待几秒,如果收到新消息后刷新该时间。缺点明显就是延迟本身。。如果是分离线程,允许在机器人回复前刷新输入,这就很像人类了,打完了字发现对面又发来东西就重新编辑。。但是有点浪费

或者让gpt自己判断对方的话是不是完整的,最近正好玩了点SLU场景下使用TOT的东西,很好玩。但我想聊天的时候不会太适用。

不用搞那么复杂,本身人看到别人发来的信息也会直接发送已经编辑好的内容(懒得修改)。而且本身人发来信息的时候,延迟10秒再回复也是很正常的事。反倒现在GPT秒回就已经显得不真实了。

etfromchina avatar Jan 31 '24 15:01 etfromchina