记忆框架
· 9 min read
基本概念
记忆的几个维度
- Wing (侧翼/顶级项目区): 记忆的最高物理隔绝边界。通常代表一个独立的项目。
- Room (房间/话题域): Wing 下的子分类。依靠命名(如
frontend,general,database)来聚集相关的记忆碎片。 - Drawer (抽屉/记忆切片): 真正存储原文的载体。存入 ChromaDB。
- Hall (大厅/特殊模态): 旧设计里用于特殊类型记忆的附加标记。当前主路径更应理解为
Wing -> Room -> Drawer,Hall已不是最核心的组织层。
RAG之外的概念
- KG (知识图谱): 独立于向量库的 SQLite 图谱数据库。存放绝对的逻辑三元组(主语-关系-宾语),作为向量模糊检索无法精确表达事实时的定向兜底。
- Tunnel (隧道/跨界桥梁): 跨 Wing 的关联机制。既可以来自同名
Room带来的隐式联想,也可以通过 MCP 显式创建、列出、删除和跟随,不再只是“同名 Room 自动连线”这一种形式。
写读流程
写入流程
- 组装对话,存入向量数据库
{
"method": "mempalace_add_drawer",
"params": {
"wing": "test_project",
"room": "frontend",
"content": "明天需要把登录页面的按钮改成蓝色。补充说明细节:..."
}
}
- 记录今日总结:tool_diary_write
{
"method": "mempalace_diary_write",
"params": {
"agent_name": "Claude-3.5-Sonnet",
"topic": "frontend",
"entry": "发现登录页面的 Argon2 加密逻辑有问题,今天修复了验证部分的盐值计算。"
}
}
- 提取关系约束:tool_kg_add
主谓宾,以主语为中心,绝对匹配,只能通过主语当参数查询
{
"method": "mempalace_kg_add",
"params": {
"subject": "LoginButton",
"predicate": "depends_on",
"object": "AuthService"
}
}
读取流程 (Retrieve / Read - 典型的L0~L3分层抽取)
- L0 (Identity): 全局基础身份。死板读取
~/.mempalace/identity.txt作为最高级的 System Prompt。 - L1 (Essential Story): 直接拉取一小批高权重 / 高优先级的记忆碎片作为开局常驻上下文送给模型。仓库里有
layers.py实现,但它不是 MCP 主调用面的核心工具。- 读"importance", "emotional_weight", "weight"的权重,排他性取最重要的那个
- 然后排序取前15个
- L2 (On-demand): 先尝试根据某一话题查找,即搜索具体Room的原文本数据。
- L3 (Semantic Search): 深度检索主入口。主动发起
mempalace_search。当前实现不是“只靠向量”,而是向量检索 + BM25/fallback 的混合搜索。 - KG Query: 逻辑关系读取。当向量模糊搜索(L3)不靠谱,或者需要查询明确关系(如“组件A到底依不依赖服务B?”)时,主动发起
mempalace_kg_query查 SQLite 里存好的三元组,做精确的节点关系验证。 - Tunnel Traverse: 发散与灵感寻找。主动发起
mempalace_find_tunnels、mempalace_traverse、mempalace_follow_tunnels等工具,在不同 Wing 之间发现和跟随跨域连接。
向量存储的metadata
{
"wing": "test_project", // 物理隔离基座(必填)
"room": "frontend", // 话题分类(必填),跨wing同名将形成 Tunnel
"source_file": "backend_notes.txt", // 法医级溯源证据,提供复查路径
"chunk_index": 0, // 长文本分块位置
"added_by": "mcp / AgentName", // 责任倒查:标识动作是扫描系统发起还是具体的AI角色注入
"filed_at": "2026-04-13T...", // 绝对时间戳,保留记忆演进的历史脉络,解决新旧设定冲撞
"ingest_mode": "convos", // 【仅CLI扫描模式拥有】数据来源模式
"extract_mode": "exchange", // 【仅CLI扫描模式拥有】特定的提取切片颗粒度
"type": "diary_entry" , // 【仅日记模式拥有】标记自身模态为主观感想
"weight":10 // 权重,衡量该记忆的重要性,用于排序
}
MCP对LLM暴露方法
为了让 Agent 完全接管自己的记忆,Mempalace的 MCP Server (Model Context Protocol) 向大模型暴露了以下工具集(Tools):
【查壳探底(结构探针)】
mempalace_status: 获取宫殿总容量(有多少个抽屉、侧翼、房间)。mempalace_get_taxonomy: 拉取全局分类树(Wing -> Room 结构),在大模型不知该搜哪时进行前置探路。mempalace_list_wings/mempalace_list_rooms: 靶向列出所有存在的物理隔离区。mempalace_get_aaak_spec: 读取 AAAK 压缩记忆格式说明,帮助 Agent 理解日记和压缩记忆的写法。
【日常搜存(向量抽屉系统)】
mempalace_search: 核心组件。根据自然语言发起混合检索查找记忆,可指定 Wing/Room 作为硬过滤条件。mempalace_add_drawer: 大模型觉得某段对话或产出非常重要时,将其注入为原文 Drawer。强制带上物理基座(Wing/Room)。mempalace_check_duplicate: 写入前查重,防止大模型陷入复读机循环污染库。mempalace_list_drawers/mempalace_get_drawer: 分页列出某个 Wing/Room 下的具体 Drawer,或按 Drawer ID 取回全文。mempalace_update_drawer: 修改已有 Drawer 的内容或元数据。mempalace_delete_drawer: 永久删除某个切片(需传 入确切 Drawer ID)。mempalace_sync: 按源文件状态同步清理失效 Drawer。
【逻辑织网(知识图谱系统)】
mempalace_kg_add: 把绝对事实存入 SQLite(如LoginButton->depends_on->AuthService)。mempalace_kg_query: 根据 Entity(实体)查它发散出去或连接进来的所有关系树。mempalace_kg_timeline: 顺着时间线查询关系图谱的演化(如小明2020年单身,2024年结婚的纪年表)。mempalace_kg_invalidate: 当发现某事实过期时(如 Bug 被修了),标为失效而非删除,保留系统演进脉络。mempalace_kg_stats: 查看图谱里总共有多少实体、关系和关系类型。
【AI主观能动(日记与隧道漫游)】
mempalace_diary_write: Agent 完成一天工作后,用特殊的AAAK言简意赅地写下自己的心路历程、重要结论,甚至带有情绪符号(★、♡、⚠)供未来反刍。mempalace_diary_read: 阅读此 Agent 或前人写过的反思日记。mempalace_traverse: 顺着 palace graph 进行多跳探索,获取跨 Room 的相关线索。mempalace_find_tunnels/mempalace_follow_tunnels: 发现跨 Wing 的连接,并顺着这些连接继续追踪相关内容。mempalace_create_tunnel/mempalace_list_tunnels/mempalace_delete_tunnel: 显式维护隧道,而不只是依赖隐式的同名 Room 联想。
【维护与运行时】
mempalace_hook_settings: 调整 Hook 保存行为。mempalace_memories_filed_away: 检查最近是否已经完成 palace checkpoint / 存档。mempalace_reconnect: 当外部 CLI 或脚本修改 palace 后,强制刷新 MCP server 的连接和缓存。
Generative Agents
基本概念
记忆的几个维度
- Memory Stream (记忆流/长期记忆): 包含了智能体经历的所有事件记录,是一个包含大量离散记忆节点(ConceptNode)的数据库。负责持久化存储。
- Scratch (便签本/短期工作记忆): 存储智能体当前的核心身份、实施状态、此刻所在的物理坐标以及今天的总体计划,支持高频覆写。
- Spatial Memory (空间记忆/心智地图): 智能体对物理世界的感知树状结构(如
世界 -> 小镇 -> 房子 -> 厨房 -> 冰箱),协助寻路和交互。 - ConceptNode (概念节点/记忆切片): 记忆流中的基本存储载体,可具体分为
event(观察到的客观事件)、chat(与他人的对话记录)和thought(基于过往记忆反思产生的主观想法)。
认知与行为之外的概念
- Reflection (深度反思): 当新写入记忆的累积重要性(Poignancy)得分超过一定阈值时触发。LLM 会查询最近的记忆,提炼出更高维度、更抽象的洞察,作为
thought类型写入记忆流,慢慢搭建角色的深度性格。 - Planning (层级规划): 自顶向下的计划生成体系。首先在每天早上生成粗略的 Daily Plan,然后逐步细化为小时级、分钟级的具体动作节点(Action/Event)。
写读流程
写入流程 (Perceive & Log)
- 感知视距内的世界变化或产生新思考,组装为 ConceptNode。
- LLM 会为该记录打分(Poignancy,1-10分),评估其情感重要程度(如路上遇到熟人比吃早饭得分高很多)。
- 提取出核心的主谓宾三元组(Subject-Predicate-Object)以及关键词结构。
- 调用大模型接口生成该文本描述的向量(Embedding)并存入本地文件。
读取流程 (Retrieval - 类似L3+智能融合搜索) 当智能体面临新情况决定对策或对话时,会提取一系列最相关的ConceptNode作为LLM的上下文,给记忆节点打分并排序公式如下,取最高分的综合子集:
- Recency (近因效应): 距离当前游戏内时间越近的记忆,得分越高(随着时间指数衰减)。
- Importance (绝对重要性): 直接提取该节点自身存储的
poignancy特征分数。 - Relevance (语义相关性): 使用当前情境(Query)的 Embedding 与节点自带的
embedding_key计算余弦相似度。 - 计算逻辑:
最终得分 = alpha * 近 因 + beta * 重要性 + gamma * 相关性。
节点数据结构 (ConceptNode Metadata)
{
"node_id": "node_123", // 节点唯一ID
"type": "event", // 记忆载体类型:event(事件) / chat(人际对话) / thought(升维反思)
"created": "2023-02-13 18:00:00", // 创建时间戳,用于计算提取时的近因时间衰减(Recency)
"expiration": null, // 过期时间
"subject": "Isabella", // 主语 (S) - 支持类似于三元组逻辑关系匹配
"predicate": "is making", // 谓语 (P)
"object": "coffee", // 宾语 (O)
"description": "Isabella is making coffee...", // 完整的文字描述(交给LLM的直接上下文)
"embedding_key": "Isabella is...",// 用于寻找对应语义向量字典的键(去除了特殊格式的原话文本)
"poignancy": 8, // 情感重要性得分(1-10),决定此记忆是否能长久不被遗忘
"keywords": ["Isabella", "coffee"]// 关键词索引列表
}
核心方法
【世界认知与运转】
perceive(): 按轮询感知周围视距半径(vision_r)内的格子变化事件。retrieve(): 核心检索器,基于近因、重要性、相关性三维打分公式,返回当下最需回想的那些记忆。execute(): 驱动动作器输出坐标位移、交互、或向前端发送聊天气泡。
【自我精神迭代】
plan(): 计划生成与重写器,根据过往记忆及短期目标,结构化分解当下的时间规划。reflect(): 周期检查阈值并自动自问自答,对近期高分事件形成提纯过的thought写入记忆流底库。