[Feature Request] 关于 Bot 的记忆
缺了什么
话说咱项目有没有考虑过使用 Mem0 之类的记忆层框架,让 Bot 能记住一些群里的东西?
应用场景
比如这个群是聊什么的... 群里大家的人物关系是怎么样的... 群友又制造了哪些~~专有的~~梗... 之类的。
如何实现
~~其实我也不懂。TwT~~
或许是修改提供给 AI 的提示词吧, 告诉 AI 要怎么存储记忆... 然后再在下一次的提示词中把存的记忆喂给 AI。(应该吧 (?´・ω・ ` )
( •̀ ω •́ )y 看来你和我想得一样耶
啊... 我 !? Collaborator !?
算了算了,~~权力越大,责任越大,咱还是别当了 (不是~~
下次有什么想法就发 PR (确信 (>ω<。人)
( •̀ ω •́ )y 看来你和我想得一样耶
草,~~不要学我发颜文字啊喂~~
同意~尽快加入专门的记忆处理储存,这样才能更好的扮演数字生命~
刚才研究了一下mem0框架,原理稍微搞懂了一点,感觉在js上也不难实现 但是完全依赖于LLM和向量数据库,成本太大了
add添加一条记忆
用预设构建提示词,发送给LLM提取记忆
对返回的记忆条目进行embedding处理
搜索向量数据库,有重复的记忆内容就进行更新,没有则新建
更新操作:
搜索旧记忆,同新记忆条目一起提交给LLM进行总结,向量化并更新数据库
search搜索记忆倒是简单
向量化查询条件,从数据库中找到距离最近的k条
更新一次记忆要调用1~2次API,数据库更是灾难级。想用纯本地方式实现向量数据库,发现200条维度为768的向量用json存大小为4mb,用annoy.js建立索引后可以达到15mb。也许用bson存会好一点?
或许是修改提供给 AI 的提示词吧, 告诉 AI 要怎么存储记忆... 然后再在下一次的提示词中把存的记忆喂给 AI。(应该吧 (?´・ω・ ` )
可以让 AI 主动控制记忆,有需要了解的内容自己去查数据库;也可以根据当前对话在向量数据库中搜寻相关的记忆条目传递给 AI
前者会和AI进行多轮交互,可能会浪费token
可以参考同类项目 https://github.com/ChatLunaLab/chatluna/tree/v1-dev/packages/vector-store-service#readme
目前尝试过多种记忆方式
- AI主动维护记忆
将记忆分为核心记忆,对话历史记录和归档记忆 分别对应传统意义上的系统提示词,短期记忆和长期记忆。
同时提供了多种工具供AI访问和修改这些记忆内容,以期在对话过程中丰富和完善AI的人设,逐步成长。
核心记忆是用户和AI共同编写的,这部分内容会永久嵌入提示词中,成为智能体性格的一部分 可以通过 core_memory_append/replace 工具来更新核心记忆。
聊天记录以有限的上下文窗口提供,避免提示词无限增长。
归档记忆是一个无限容量的数据库,可以看做AI的笔记本或者数据库。可以通过 archival_memory_insert 工具新增一条归档记忆,也可以使用 archival_memory_search 搜索相关记忆。可以通过关键词进行向量搜索,也可以通过记忆关联用户,主题等元数据进行检索。
但是这种方式过于理想化,而且完全依赖于LLM自身的能力,因此大多数情况下效果不佳。其原因在于核心提示词所描述的任务太过复杂,并且偏向于角色扮演(即对话)方面,使得LLM调用记忆工具的可能性大大降低。故此方法被淘汰。
- 自动生成的用户画像
既然让聊天智能体维护记忆的方法行不通,我们可以将记忆维护任务分离出来,使用专门的工作流来更新记忆。