多层记忆架构与 3D 向量检索
群聊机器人的常见痛点是大模型容易“遗忘”或者“Token 爆炸”。如果把全部历史记录都塞入 Prompt,不仅极其昂贵而且会撞到上下文窗口上限;如果简单丢弃历史,机器人就会显得没有记忆。
Yunzai-LLM-Plugin 采用分层记忆架构,兼顾低成本与长周期回忆。
四层记忆模型
▲ [第 4 层: 长期事实库 (User Facts)] 永久保留喜好、称呼、约定、雷区
▲▲▲ [第 3 层: 每日概要 (Daily Briefs)] 每日一篇,保留 365 天
▲▲▲▲▲ [第 2 层: 滚动片段档案 (Chat Archives)] 结构化对话块,保留 30 天
▲▲▲▲▲▲▲ [第 1 层: 近期滑动窗口 (Context Window)] 最近若干轮原始消息
-
第 1 层:滑动对话窗口
- 保留最近数轮真实对话上下文(由
chat.historyMaxTurns与chat.historyMaxTokens控制)。 - 包含提问者信息、群内名片与临时上下文,保证当前话轮衔接自然。
- 保留最近数轮真实对话上下文(由
-
第 2 层:滚动片段摘要 (Rolling Summaries) 与聊天档案
- 当历史超出滑动窗口时,被截掉的对话不会直接丢弃,而是后台异步整理为一段简短而富有信息的事件片段摘要。
- 详细档案保留 30 天。
- 开启
memory.groupChatArchive(默认开启)时,群里没有 @ 机器人的普通聊天也会整理成摘要存档。 - 支持跨对话回忆(
memory.crossChatRecall,默认关闭),用户私聊时也能检索对方所在群的档案;群聊永远不会检索到私聊内容。
-
第 3 层:每日概要 (Daily Digest)
- 每天的聊天档案会聚合成一条「当日概要」,默认保留 365 天(
memory.dailyDays)。 - 当用户询问“上周六我们聊了什么?”或“10月20日发生了什么?”时,大模型按日期索引直接调取。
- 每天的聊天档案会聚合成一条「当日概要」,默认保留 365 天(
-
第 4 层:长期事实 (Long-term Facts)
- 大模型在对话中察觉到关键信息时,用
memory工具记录关于某人或本群的事实(称呼、喜好、约定、被纠正的偏好等)。 - 条目数与字数有上限,接近上限时自动用便宜模型整理合并。用户可发送
#llm记忆查看、#llm忘记我清空。
- 大模型在对话中察觉到关键信息时,用
向量 + 关键词混合检索 (Hybrid Retrieval)
在 embeddingModels 中配置向量模型,并在 memory.embedding.model 中选择(默认 Voyage AI 的 voyage-context-4,也可以使用 OpenAI 兼容 /embeddings 接口的向量模型):
- 新生成的档案和每日概要在后台自动向量化并存入向量索引。
- 每轮对话会自动回忆少量相关片段;当对方提及“上次说的那个…”时,大模型也可以主动调用
recall工具。摘要会省略细节,结果附带「原文 id」时,模型可按 id 读取当时的聊天原文(含原话与图片路径),较长时分页续读。 - 系统结合关键词匹配与余弦向量相似度(
memory.embedding.minScore)找出关联度最高的历史片段注入当前上下文。 - 若向量提供商未配置 Key 或接口失败,系统自动回退至关键词 检索。
WebUI 3D 向量空间探索
在 Web 管理面板中打开 「对话与记忆 → 向量空间」:
- 系统利用主成分分析(PCA)算法,将多维稠密向量降维至三维笛卡尔坐标系。
- 您可以用鼠标旋转、缩放该 3D 点云,每个点代表一段记忆片段,可按主题、会话或日期着色。
- 在搜索框中输入任意一句话(需要向量 Key),可以看到它在语义空间中的位置,以及距离它最近的几个记忆片段。