本文介绍四层记忆系统分别怎么实现以及使用到的各种数据库分别存储什么内容
四层记忆的数据库归属
| 记忆层 | 运行态(工作副本) | 持久化数据库 | 存的具体内容 |
|---|---|---|---|
| 1. 短期记忆 | JVM 内存 List<ConversationMessage>(滑动窗口 maxTurns*2 条,默认 10 条) |
PostgreSQL chat_history |
每轮 user/assistant 原话 + 时间戳 |
| 2. 长期记忆 | JVM 内存 List<MemoryItem> + TF 词表(向量召回/去重/衰减都在内存算) |
PostgreSQL long_term_memory |
content 事实文本、importance 重要度、embedding(JSONB 向量)、created_at、last_accessed |
| 3. 偏好记忆 | JVM 内存ConcurrentHashMap<String,String> |
PostgreSQL user_preferences |
用户画像KV(user_id+key+value,如 姓名/城市/喜好);同一份也会写成一条长期记忆进 long_term_memory("用户喜好: xxx",importance 0.7~0.8) |
| 4. 图记忆 | 无独立工作副本,只在 LongTermMemory 之上叠加引用 |
Neo4j | :Memory {mem_id, content, importance} 节点 + FOLLOWS / SIMILAR_TO / CAUSES / BELONGS_TO 四类边。注意:记忆正文的真身仍在 PostgreSQL,Neo4j 只存关系结构和 mem_id(mem_id 就是 PG 的 id) |
RAG 知识层(易混)
HybridStore 的"三路混合检索"是 PG + Milvus + ES + Neo4j 四库协作,
和记忆层共享Neo4j 与 PG
| 数据库 | 结构 | 存什么 |
|---|---|---|
| Milvus | collection rag_chunks:pg_id(主键) + content + embedding(FloatVector, dim=1024, IVF_FLAT/L2) |
文档分块的语义向量 |
| Elasticsearch | index rag_chunks:pg_id(long) + content + doc_hash + chunk_idx |
分块原文,跑 BM25 关键词召回 |
| PostgreSQL | 表 rag_chunks |
分块正文 + embedding(JSONB),是取回内容的唯一来源(Milvus/ES 只回传 pg_id 再来 PG 查正文) |
| Neo4j | :Entity 实体关系图 |
文档实体/关系,第三路召回,分数经 RRF 融合 |