最近一直在多角度的测试不同模型的会话记忆能力,还是有挺多的发现,诚如部分大佬所说,例如:
- 即便携带了所需的上下文,但是模型就像不认得它一样,选择性无视
- 例如deepseek目前遵循系统system prompt比较弱,或者说时常无视,deepseek各群都有在反馈。
- 等等
今天又使用deepseek故意进行了超长的对话,但对话长度显然没有超出上下文128k的。突然发现它的记忆不连贯,断层。于是我就去控制台“监视每一轮对话携带的消息情况和ChatHistory保存情况”,有以下发现:
①第一次对话,正常携带2条会话记录
②第二次对话,正常携带4条会话记录
③继续对话…携带消息记录增加至7条(有一次响应失败,所以丢失一个assistant)
③此时chat history与请求携带的记录是同步的
④继续增加对话,请求携带的记录突然减到了4条!
④而此时,chat history中的记录仍然完整
⑤继续对话,发现请求无法完整携带chat history到messages中,数量缺失
⑥继续对话,chat history正常增加,但是请求messages很拘谨~~~~~~
最后补充一下,会话设置附带历史消息数我是拉的足够的,例如16条,20条都有尝试,并且取消了历史摘要防止干扰。
一直认为记忆丢失是大模型自身的问题(大部分情况确实是),但nextchat这种现象也是第一次发现,不知道是什么原因,在此请教,是不是我忽视了什么细节。
- 例如nextchat设定了上下文tokens总长度的一个自动裁剪的阈值? 因为我的对话是比较长的,我测试过短小精悍的对话,似乎能携带10多条。
- 如果是以上原因,那就需要修改调优。让它完整携带chat history去请求对话
- 以上情况测试过多次,也有偶尔不丢失的情况。
@zhong_little @Cook_Sleep 求助
在佬友共同探讨下,确实是发现了nextchat 的历史问题或者说openai给出的小坑,如果想要正常的超长上下文会话,可以尝试修改项目的chat.ts文件,将get recent messages 部分的代码块进行如下修改即可:
// 获取最近消息的代码
const reversedRecentMessages = [];
for (
let i = totalMessageCount - 1;
i >= contextStartIndex;
i -= 1
) {
const msg = messages[i];
if (!msg || msg.isError) continue;
reversedRecentMessages.push(msg);
}
// 组合消息
const recentMessages = [
...systemPrompts,
...longTermMemoryPrompts,
...contextPrompts,
...reversedRecentMessages.reverse(),
];
return recentMessages;
修改后的代码,可以获取所有最近的消息,而不需要考虑token阈值。确保所有消息都被收集。
直接修改max_tokens可以应急,但不优雅。
2024年8月14日继续更新(关于claude模型会话过程中的报错,见楼层讨论)
19 个赞
nextchat 这个地方很操蛋,我是知道的,就是你猜测的,它设置了一个上下文 token 的自动裁剪阈值,并且这个阈值又很操蛋的使用了 max_token 这个变量(于是max_token 你设置大了影响模型回复,甚至报错,设小了又影响上下文,一切都要从gpt-3.5-turbo起的坏头说起),我自己二开的版本是把这个判断条件屏蔽掉了
4 个赞
不好意思哈,我已经很久很久没用NextChat了()
2 个赞
无语,原来如此啊。那我去找一下去掉。
感觉得去pr一下
感谢!
1 个赞
我一直在用克劳德也是遇到这个问题
上面提到一个专辑名叫《数字梦境》
此时已经对话了六轮 现在让他给这个专辑写一个简介
他就原创了一个和原文有关系但不大的 《四季交织》专辑的简介…
bbb
7
nextchat设置里的 单次回复限制
改大能解决吗
那他为啥子 要把上下文携带的tokens阈值和max_token 这个变量关联呀
1 个赞
这个我一直开的是51万2千 反正不是我自己的
不过克劳德本身就有输出上限 好像达不到1万
1 个赞
有些模型会验证 max_token 不能超过 4096(前面提到的可能会报错就是这个原因),所以调整这个参数只能缓解,不能根本性解决问题
1 个赞
因为 gpt-3.5-turbo 刚开始的上下文只有 4k,那时候 max_token 是用来限制上下文+回复token的,后来才变成最大回复限制
1 个赞
取决于模型会不会验证这个参数,不检验该参数的模型就无所谓
1 个赞
EXXD
(衣叉插地)
15
API模式的对话是不是都得带上原聊天记录才能保持记忆?
不是作者改了,是 openai 改了,nextchat 适配 3.5 后就没修这个问题了
bbb
18
我意思是nextchat作者什么时候能把这判断条件改了,真的很坑爹啊
至少openai是这样的,也有一些api是能自动保存会话的,在一个统一的conversation id里。 有auto save history参数。 但是一般手动管理,更灵活。