1. 项目概述:MemPalace 记忆系统的核心架构
MemPalace 是一个面向 AI Agent 的记忆管理系统,其核心目标是解决大语言模型(LLM)在长期对话和知识管理中的记忆问题。系统采用了独特的"记忆宫殿"隐喻,将记忆组织为可检索、可更新的结构单元。本篇重点解析 MemPalace 最具工程价值的三个子系统:AAAK 压缩方言、时序知识图谱和 ChromaDB 语义检索。
作为 MemPalace 三部曲的中间篇,本文承接前篇关于整体架构和对话挖掘流水线的介绍,深入技术实现细节。这三个子系统共同构成了 MemPalace 从原始文本到可被 LLM 使用的记忆转换管道,每个子系统都针对特定的记忆管理挑战提出了创新解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AAAK 方言:为 LLM 设计的结构化压缩文本
2.1 AAAK 的设计哲学与核心特性
AAAK(Structured Symbolic Summary Format)是 MemPalace 独创的一种文本压缩方言,其核心设计理念是:
- 人类与 LLM 双兼容:任何 LLM 都能直接理解 AAAK 格式,无需特殊解码器
- 有损压缩:专注于保留语义核心而非完整文本
- 结构化表示:将实体、主题、关键句、情感和标志提取为紧凑的结构化格式
典型的 AAAK 记录由 header 行和内容行组成,使用 | 作为分隔符:
code复制wing_code|chromadb_setup|2026-03-12|setup_notes
0:MAX+ALC|chromadb_persistent_client|"We switched to persistent client..."|determ+convict|DECISION+TECHNICAL
2.2 编码流水线与关键技术
AAAK 的编码过程涉及多个关键步骤:
- 实体识别:通过 EntityRegistry 区分专有名词和普通词汇
- 主题提取:基于特定规则从文本中抽取核心主题
- 关键句选择:根据决策词和句子长度评分选取代表性语句
- 情感编码:将情绪词映射为紧凑的三字符代码
- 标志检测:通过关键词字典标记重要记忆片段
实体识别是其中最复杂的部分。MemPalace 采用三级识别机制:
- Onboarding:用户明确告知的实体(最高优先级)
- Learned:从会话历史中高置信度推断的实体
- Researched:通过 Wikipedia API 查询的未知词汇
2.3 实际应用与性能考量
AAAK 的最佳使用场景是作为"唤醒文件"(Layer1)提供给 LLM,而非完全替代原始文本存储。性能测试表明:
- 在小规模文本上,AAAK 可能比原始文本占用更多 token(73 vs 66)
- 在大规模重复实体场景下,AAAK 可显著节省 token(约50%压缩率)
- 作为检索语料时,AAAK 模式的召回率(R@5)为84.2%,比原始模式低12.4个百分点
3. 时序知识图谱:基于 SQLite 的轻量级实现
3.1 数据模型设计
MemPalace 的知识图谱采用五元组模型扩展传统三元组:
code复制Fact = (subject, predicate, object, valid_from, valid_to)
这种时序模型允许系统记录事实的有效时间范围,而不仅仅是创建时间。
3.2 SQLite 实现细节
知识图谱的核心存储在单个 SQLite 文件中,主要包含两个表:
- entities 表:存储所有实体及其属性
- triples 表:存储所有关系事实及其时间有效性
关键设计选择包括:
- 实体 ID 使用名称的 slugified 形式(如"Max Chen"→"max_chen")
- 属性以 JSON 字符串形式存储,保持 schema 灵活性
- 采用 WAL(Write-Ahead Logging)模式支持多读一写并发
3.3 核心操作接口
系统提供四个主要操作接口:
- add_triple:添加新事实,自动处理实体创建和重复检查
- invalidate:标记某个事实不再有效
- query_entity:查询与特定实体相关的事实
- as_of:查询特定时间点有效的事实
这些接口共同构成了知识图谱的完整CRUD能力,同时维护了时间维度的一致性。
4. 语义检索系统:ChromaDB 与元数据过滤
4.1 整体架构
MemPalace 的检索系统基于 ChromaDB 实现,主要特点包括:
- 持久化客户端:避免会话模式下的数据丢失
- 默认 embedding 模型:使用 sentence-transformers/all-MiniLM-L6-v2
- 元数据过滤:支持 wing/room 级别的精确过滤
4.2 关键技术实现
检索系统的核心在152行的 searcher.py 中实现,主要功能包括:
- 初始化持久化客户端:
python复制self.client = PersistentClient(path=db_path)
self.collection = self.client.get_collection("mempalace_drawers")
- 执行带过滤的语义搜索:
python复制def search(self, query_text, limit=5, where=None):
return self.collection.query(
query_texts=[query_text],
n_results=limit,
where=where
)
- 处理 ARM64 架构的特殊情况:
python复制# Workaround for ARM64 ONNX runtime issues
if platform.machine() == 'arm64':
os.environ['OMP_NUM_THREADS'] = '1'
4.3 元数据过滤的价值
测试表明,合理的元数据过滤可以提升34%的检索准确率。系统支持复杂的 where 条件,例如:
python复制where={
"$and": [
{"wing": {"$eq": "project_x"}},
{"room": {"$in": ["meeting", "decision"]}}
]
}
5. 系统集成与性能对比
5.1 三子系统协同工作流程
三个子系统在记忆处理管道中扮演不同角色:
- AAAK 方言:压缩长文本,为 LLM 提供高效上下文
- 时序知识图谱:维护实体关系的时序视图
- 语义检索:快速定位相关记忆片段
5.2 与竞品的对比
-
Zep Graphiti:
- 基于 Neo4j 云服务($25+/月)
- 功能更全面但依赖网络
- 适合企业级应用
-
MemPalace KG:
- 基于 SQLite 本地存储
- 零云依赖,完全离线
- 适合个人和小型团队
测试数据显示,MemPalace 在本地化场景下的性能与 Zep 相当,但成本显著降低。
6. 实践经验与优化建议
6.1 实际部署中的挑战
- ARM64 兼容性:ONNX 运行时在 M1/M2 Mac 上需要特殊配置
- 初始索引速度:大型知识库的首次索引可能较慢
- 内存管理:需要合理配置 ChromaDB 的缓存策略
6.2 性能优化技巧
- 批量操作:对大量数据使用批量插入接口
- 索引优化:为常用查询模式创建合适索引
- 缓存策略:对高频查询结果实施缓存
6.3 扩展可能性
- 多模态支持:扩展系统以处理图像、音频等非文本记忆
- 分布式版本:基于 SQLite 的WAL模式实现读写分离
- 自动化清理:基于时间或重要性的记忆淘汰机制
7. 总结与未来方向
MemPalace 通过创新的三子系统设计,在本地环境中实现了高效的记忆管理。AAAK 方言解决了长上下文问题,时序知识图谱维护了事实的时间维度,而 ChromaDB 检索确保了快速访问。这种组合特别适合需要长期记忆保持的AI应用场景。
未来的发展方向包括:
- 更精细的记忆重要性评估算法
- 自动化记忆整理和摘要功能
- 增强的时序推理能力
- 跨会话的记忆关联分析
对于开发者而言,MemPalace 提供了有价值的参考实现,展示了如何在资源受限环境下构建高效的记忆系统。其设计理念和实现细节都值得深入研究和借鉴。
