酒馆聊天向量化优化,为自动hide节省token并动态检索当前聊天记
sillytavern吧
全部回复
仅看楼主
level 1
猫鱼哦º 楼主
重制向量存储插件的聊天向量化功能:
在游玩SillyTavern的过程中,通常会使用聊天摘要和表格增强来弥补LLM在长期记忆方面的不足,并使用/hide命令来防止上下文过长。但是这种方法通常会引发一个问题,就是实际上AI会丢失掉被hide掉的具体聊天信息,导致一些细节问题需要被回溯时可能会产生灾难性的遗忘。
基于向量数据库(知识库)的检索增强生成方法可以通过文本向量化和相似度查询的方式,从外部的文本中向当前对话引入知识,目前酒馆的“向量存储”插件已经实现了这个功能,可以从利用ollama本地部署或外部服务提供的嵌入模型来实现向量数据库。(通过勾选插件的“为文件启用”来开启)
然而这个功能实际上并没有解决最开始提到的那个问题:对于单个聊天的对话过长,如何实现这种检索增强。因为“为文件启用”功能本质上是外部的文本,需要通过手动添加来实现,而很显然,这不支持对当前对话的自动添加。
实际上,“向量存储”插件已经实现了另一个功能——聊天向量化,但是由于原有逻辑的设置,并没有很好地利用这个功能。通过勾选插件的“已启动聊天信息”来开启聊天向量化功能。插件实现的聊天向量化功能实际上是一个重排。你可以设置2个参数,“保持”代表着最新的N个聊天不会被重拍,而“插入”代表着最新的N个以后,将会有“插入”设置个数的聊天会被向量匹配相似度,并重新排列到最新的消息部分,以此来调整消息结构,帮助AI更好地理解上下文。
然而这种做法实际上用处有限,因为既没有解决上下文限制的问题,这种不稳定的重排可能也无法很好地让模型捕捉到上下文语义。我们想要做的更改是:保持那N个最新的消息不变(这一点是相同的),然后再陈旧的消息,我们将会主动抛弃不加入历史(以此来实现预设数量的自动hide来保持上下文长度)。不过这些抛弃的消息我们是有选择地抛弃,具体来说,可以通过已实现的向量存储和查询功能,获得与当前对话最相关的“插入”设置数量个聊天,并将这些数量的聊天按照原有顺序排列到历史记录中。这样就做到了,既能够控制token数量,节省开销以及保持模型能力,并且在利用摘要与表格增强的基础上,保持AI对细粒度历史信息的捕捉。
举个例子,我现在有90条信息,此时token长度达到了100k,AI已经开始明显地说胡话。在使用这个功能后,我设定了保持为50(和/hide 0-40的功能等效,不过区别在于这里是会一直取最新的50)和插入为10。于是就会传入最新的50条记录,以及10条最相关的记录(假设为1,3,11,15,20,…)。最终的token数量能够降低到30k-60k,可以有效改善上述问题。
请注意,使用此修改需要你理解两个情况:
1. 如果你习惯性的做法是永远不使用/hide,无论聊天记录多长也全部传输,并且你可以由于过长上下文导致的AI对于历史消息的错乱,那么这么做可能会导致你的体验受到影响(因为无论如何,依然会丢失信息,只是智能保留了最相关的)。但如果你有良好的习惯,会主动使用/hide来提升回答质量或减少开销,那么这个修改基本上是纯正面的。
2. 检索的结果取决于嵌入模型生成向量的质量以及向量检索方法的有效性,所以并不能保证如果你提到某个历史的关键词,就一定能从历史消息中检索出最对应的那一条消息。必须说明,这是在“大体上”最相关的。
具体修改方法(2选1即可)
无论哪种方法,一定要将你原来的index.js做好备份!一定要将你原来的index.js做好备份!一定要将你原来的index.js做好备份!数据无价,防止你的文件损坏无法回退!
方法1:见附件,在目录中自行修改代码(使用记事本复制即可),好处在于基本不会因为你的插件版本而产生不适配。
方法2:直接使用压缩包中的index.js替换SillyTavern\public\scripts\extensions\vectors下的index.js。但是可能因具体版本问题产生影响。
通过网盘分享的文件:酒馆聊天向量化优化,为自动hide节省token并动态检索当前聊天记录.zip
链接: 百度网盘 提取码: w4ug
2025年06月13日 19点06分 1
level 1
猫鱼哦º 楼主
需要自行配置向量存储插件中的嵌入模型,ollama或者其他外部api
2025年06月13日 19点06分 2
level 2
感谢大佬分享
2025年09月05日 06点09分 3
1