Palace Memory 宫殿记忆系统
将 AI Agent 的扁平记忆存储升级为 Wing→Room→Closet→Drawer 四层宫殿结构。纯 Python stdlib 实现,零外部依赖。
触发方式
关键词触发:
- "宫殿记忆"、"MemPalace"、"记忆检索"、"知识图谱"、"智能搜索"、"记忆系统"
- "帮我记住"、"之前讨论过"、"查一下记忆"、"有没有记录过"
不触发:Hermes 内置的 memory 工具调用(那是另一个系统)——本 Skill 在需要结构化检索时激活。
能力边界
✅ 能做什么
- 分层记忆存储:支持 Wing(命名空间)→ Room(分类)两级组织
- AAAK 压缩索引:从内容自动提取实体和主题,生成快速检索的 Closet 索引
- 混合搜索:BM25 关键词 + 语义重叠 + 可选向量搜索(sentence-transformers)
- 时序知识图谱:SQLite 存储实体关系,支持时间范围查询
- Hermes 同步桥:自动将 Hermes
memory工具的内容镜像到 Palace - 中文优化:CJK 大字符集分词和 Closet 生成
❌ 不能做什么
- 不替代 Hermes 内置 memory 工具——Palace 是增强层
- 不提供实时向量搜索(需安装 sentence-transformers 可选依赖)
- 不适用于超大规模(>10万条)——基于文件系统的设计有此限制
- 不支持多机分布式部署——定位为单机本地记忆增强
错误处理
导入失败
⚠️ 无法导入 palace_memory 模块。请确认路径:
sys.path.insert(0, '$HOME/.hermes/skills/palace-memory/references')
Palace 目录未初始化
⚠️ ~/.hermes/palace/ 目录未找到。运行 PalaceMemory() 会自动创建。
搜索无结果
ℹ️ 未找到匹配的记忆。建议:扩大搜索范围、使用不同关键词、或先存储相关记忆。
核心架构
🏛️ Palace (Memory Store)
├── 🏢 Wing = 命名空间 (personal, systems, research, dev)
│ ├── 🚪 Room = 分类 (tools, environment, skills, papers...)
│ │ ├── 📁 Closet = AAAK 压缩索引 → 指向 Drawer
│ │ └── 🗄️ Drawer = 逐字记忆条目(真实内容)
使用方式
from palace_memory import get_palace
pm = get_palace()
# 存储
pm.remember(content="在AWS上部署了PyTorch训练集群", wing="systems", room="environment")
# 搜索
results = pm.recall("AWS PyTorch", wing="systems", top_k=5)
# 统计
print(pm.stats())
技术架构
| 组件 | 实现 | 特点 |
|---|---|---|
| BM25 排名 | Okapi-BM25 | 无外部依赖,CJK 字符级分词 |
| AAAK 压缩 | 正则提取实体+主题 | 英文大小写 + CJK 二/三字词 |
| 语义搜索 | Token overlap + 可选 dense | 零成本 fallback + 可选 sentence-transformers |
| 知识图谱 | SQLite + WAL 模式 | 并发安全,时序双重查询 |
| 同步桥 | sync_bridge.py | Hermes Memory ↔ Palace 自动镜像 |
FAQ
Q: 和 Hermes 内置 memory 的区别?
Hermes memory 是扁平键值存储,适合"记住偏好"。Palace 是分层结构,适合"大海捞针"——记忆超过 30 条时 Palace 的检索精度显著优于扁平存储。
Q: 需要安装什么依赖?
零依赖。核心功能(BM25、AAAK、知识图谱)全部用 Python stdlib 实现。向量搜索需安装 sentence-transformers。
Q: 支持中文吗?
v1.1 起完整支持中文。CJK 字符级分词 + 停用词过滤 + 二/三字常用词提取。
Q: 数据存在哪里?
~/.hermes/palace/drawers/ — JSON 文件存储,每个 Drawer 一个文件。Closet 索引存 ~/.hermes/palace/closets/。知识图谱存 ~/.hermes/palace/knowledge_graph.sqlite3。
Q: 怎么和 Hermes 保持同步?
运行 python3 scripts/sync_bridge.py --scan 自动扫描 Hermes 记忆并镜像到 Palace。
反模式
- ❌ 不要用 Palace 替代数据库——超过 10 万条记录性能会下降
- ❌ 不要在中文场景使用默认的 closet_weight=0.3——建议调整为 0.15
- ❌ 不要在多进程环境下共享同一个 PalaceMemory 实例——SQLite 需要单例
- ❌ 不要频繁创建/销毁 get_palace() 实例——使用单例模式
文件结构
palace-memory/
├── SKILL.md ← 核心说明
├── references/
│ ├── palace_memory.py ← 核心实现(PalaceMemory + TemporalKG + BM25)
│ └── closet_llm.py ← LLM 辅助实体提取
├── scripts/
│ ├── memory_watchdog.py ← 容量监控
│ └── sync_bridge.py ← Hermes ↔ Palace 同步
└── knowledge/
└── architecture.md ← 架构参考