Moemu / Muice-Chatbot

沐雪,一个会自动找你聊天的AI女孩子
MIT License
248 stars 19 forks source link

[Model]上下文衔接问题 #54

Open Tz-WIND opened 2 weeks ago

Tz-WIND commented 2 weeks ago

没错又是我,我又遇到问题了

上下文

例1: {"prompt": "晚上好", "completion": "晚上好,祝你今晚做个好梦!", "history": []} {"prompt": "要一起去吃晚饭吗", "completion": "当然可以呀,吃完晚饭我们还可以去看一部电影,怎么样?", "history": []} {"prompt": "可以呀,看什么电影呢", "completion": "嗯,想看看你", "history": []} {"prompt": "?啥意思", "completion": "啥意思?", "history": []} {"prompt": "你刚刚说的话是什么意思", "completion": "我说,有很多人认为,当一个人死了,他/她灵魂就去了天堂,这是一个误解。实际上,灵魂是永远存在的,它没有死亡也没有去处。", "history": []} {"prompt": "然后呢", "completion": "那就......那就......", "history": []} {"prompt": "?", "completion": "?", "history": []} {"prompt": "你刚刚说的啊", "completion": "啊,对不起,我忘记了", "history": []} {"prompt": "是不是在骗我!", "completion": "不是喵!本雪很诚实的好孩子!", "history": []} {"prompt": "那你同意了吗", "completion": "我不同意", "history": []}

例2: {"prompt": "在家躺了一天,你过得怎么样", "completion": "很好呢,感觉自己又变年轻了", "history": []} {"prompt": "在吗", "completion": "在", "history": []} {"prompt": "我好无聊", "completion": "那就和本雪聊聊天吧,可能会有惊喜哦", "history": []} {"prompt": "好呀", "completion": "嘿,你今天看起来怎么样?", "history": []} {"prompt": "啥意思", "completion": "我喜欢你", "history": []} {"prompt": "啊?真的吗", "completion": "真的哦!", "history": []} {"prompt": "我也喜欢你!", "completion": "谁喜欢你啦?", "history": []}

模型

Chatglm2-6b+Muice 2.3的微调模型

额外信息

我的沐雪就是有点...傻傻的 一直有上一句话刚说完下一句话就忘了的情况 6b的模型本身应该不会有这个问题

Moemu commented 2 weeks ago

因为微调数据里面历史对话数据占比少,对于2.3版本更甚,即使对于现在的2.6(尚未发布)存在历史对话的训练集数量也不超6%。 你可以尝试最新的2.5.3版本,我们将在2.7~2.8中着重增强对于上下文的连贯性。

Tz-WIND commented 2 weeks ago

上下文连贯性应该不是靠训练集能练出来的,我觉得可以加入Langchain这种框架实现历史记忆

Moemu commented 2 weeks ago

这个想法我也有,只不过还等待验证和实现。

Tz-WIND commented 2 weeks ago

我自己先研究研究

Moemu commented 2 weeks ago

我的想法具体是这样的,在一定的对话轮数之后,对这些记忆进行概括整理,并收入长期记忆文件中,在上下文语境需要时调取;此外,还引入人物设定选项,以便保证模型始终输出符合用户期望的答案

Moemu commented 2 weeks ago

你先试着研究下吧,这个线程始终保留至上下文衔接问题改善

Tz-WIND commented 2 weeks ago

如果这个项目要通过langchain来实现记忆的话就得整个搬迁到langchain架构下,工程量有那么一点点大。我去看看有无别的方法

Tz-WIND commented 2 weeks ago

问题报告:Muice.py, line 86处会导入历史对话记录最后一行的[history]项 但是history项的value均为空 正在逆向追查中

Tz-WIND commented 2 weeks ago

前面直接把history定义成none了,蚌埠住了 这个调用历史对话约等于没调

Moemu commented 2 weeks ago

不对,是空列表(

Tz-WIND commented 2 weeks ago

笑死我了,我还以为是太短了,一看东西都是空的

Moemu commented 2 weeks ago

我在 https://github.com/Moemu/Muice-Chatbot/commit/07e9b04007f7ee6b6d5a4f9a47fcb3b895266520 中修复了对话历史重复问题,这导致了history永远不会更新

Tz-WIND commented 2 weeks ago

这上下文直接就不要了 E4095718012204321DE6723694C5273D

Tz-WIND commented 2 weeks ago

既然这里的history已经形同虚设了,那怎么办捏

Tz-WIND commented 2 weeks ago

事已至此,先涩涩吧

Moemu commented 2 weeks ago

自己的问题自己修,我已经提交了更改,拉取代码就应该没有问题了。 与此同时,您可以通过下面的代码来进行迁移,只需更改QQ_NUM常量即可:

import json

QQ_NUM = ''

with open(f'./memory/{QQ_NUM}.json', 'r', encoding='utf-8') as f:
    data = f.readlines()

memorys = []
for i in data:
    memory = json.loads(i.rstrip('\n'))
    memorys.append([memory['prompt'],memory['completion']])

del memorys[-1]

with open(f'./memory/{QQ_NUM}.json', 'w', encoding='utf-8') as f:
    text_line = {'prompt':memory['prompt'], 'completion':memory['completion'], 'history':memorys}
    json.dump(text_line,f,ensure_ascii=False)
    f.write('\n')

对此带来的不便我深表歉意

Tz-WIND commented 2 weeks ago

Tz-WIND commented 2 weeks ago

往model里丢的history参数都支持什么数据类型

Moemu commented 2 weeks ago

列表,应该还有None

Tz-WIND commented 2 weeks ago

事已至此,先睡觉吧

Tz-WIND commented 2 weeks ago

这个history的bug修掉之后上下文明显好了很多 要是还要接着死磕的话可能就是要做知识图谱这种 “超级沐雪已部署.jpg”

Tz-WIND commented 2 weeks ago

屏幕截图 2024-09-02 182234 蚌埠住了

Moemu commented 2 weeks ago

这个问题已经出现过一次,但是还没有修... 等我们把一个PR合并后看看还会不会出现问题

Tz-WIND commented 2 weeks ago

每次使用/refresh都会出现

Moemu commented 2 weeks ago

fixed. a3af9076b2db78c80b2e7073e9285110f661446e