记忆框架
· 8 min read
Mempalace
基本概念
记忆的几个维度
- Wing (侧翼/顶级项目区): 记忆的最高物理隔绝边界。通常代表一个独立的项目。
- Room (房间/话题域): Wing 下的子分类。依靠命名(如
frontend,general,database)来聚集相关的记忆碎片。 - Drawer (抽屉/记忆切片): 真正存储原文的载体。存入 ChromaDB。
- Hall (大厅/特殊模态): 用于特殊类型记忆的标记(如
hall_diary)。用以将带有主观情绪的AI日记与客观的项目文档在查询时彻底隔离防污染。
RAG之外的概念
- KG (知识图谱): 独立于向量库的 SQLite 图谱数据库。存放绝对的逻辑三元组(主语-关系-宾语),作为向量模糊检索无法精确表达事实时的定向兜底。
- Tunnel (隧道/跨界桥梁): 虚拟的关联机制。当且仅当完全相同的
Room名字出现在两个不同的Wing时,系统在内存中临时构建一条跨项目的连线,从而赋予 AI “触类旁通”的机制。
写读流程
写入流程
- 组装对话,存入向量数据库
{
"method": "mempalace/add_drawer",
"params": {
"wing": "test_project",
"room": "frontend",
"content": "明天需要把登录页面的按钮改成蓝色。补充说明细节:..."
}
}
- 记录今日总结:tool_diary_write
{
"method": "mempalace/tool_diary_write",
"params": {
"agent_name": "Claude-3.5-Sonnet",
"topic": "frontend",
"entry": "发现登录页面的 Argon2 加密逻辑有问题,今天修复了验证部分的盐值计算。"
}
}
- 提取关系约束:tool_kg_add
主谓宾,以主语为中心,绝对匹配,只能通过主语当参数查询
{
"method": "mempalace/tool_kg_add",
"params": {
"subject": "LoginButton",
"predicate": "depends_on",
"object": "AuthService"
}
}
读取流程 (Retrieve / Read - 典型的L0~L3分层抽取)
- L0 (Identity): 全局基础身份。死板读取
~/.mempalace/identity.txt作为最高级的 System Prompt。 - L1 (Essential Story): 统直接拉取前 15 个拥有最高权重的记忆碎片作为开局常驻上下文送给模型。这个原项目没实现
- 读"importance", "emotional_weight", "weight"的权重,排他性取最重要的那个
- 然后排序取前15个
- L2 (On-demand): 先尝试根据某一话题查找,即搜索具体Room的原文本数据。
- L3 (Semantic Search): 深度矢量搜索。主动发起
tool_search。 - KG Query: 逻辑关系读取。当向量模糊搜索(L3)不靠谱,或者需要查询明确关系(如“组件A到底依不依赖服务B?”)时,主动发起
tool_kg_query查 SQLite 里存好的三元组,做 100% 精确的节点关系验证。 - Tunnel Traverse: 发散与灵感寻找。主动发起
tool_find_tunnels或mempalace_traverse。通过在不同 Wing 之间寻找同名的 Room,实现跨项目的经验借用(比如在处理当前项目的前端问题时,顺着Room: frontend这根管子,摸到别的项目里以前写过的前端踩坑日记)。
向量存储的metadata
{
"wing": "test_project", // 物理隔离基座(必填)
"room": "frontend", // 话题分类(必填),跨wing同名将形成 Tunnel
"hall": "hall_diary", // 【针对特定通道】用于隔离客观文件与主观反思日记
"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_search: 核心组件!根据自然语言发起 L3 语义检索查找记忆,可指定 Wing/Room 作为硬过滤条件。mempalace_add_drawer: 大模型觉得某段对话或产出非常重要时,将其注入为原文 Drawer。强制带上物理基座(Wing/Room)。mempalace_check_duplicate: 写入前查重,防止大模型陷入复读机循环污染库。mempalace_delete_drawer: 永久删除某个切片(需 传入确切 Drawer ID)。
【逻辑织网(知识图谱系统)】
mempalace_kg_add: 把绝对事实存入 SQLite(如LoginButton->depends_on->AuthService)。mempalace_kg_query: 根据 Entity(实体)查它发散出去或连接进来的所有关系树。mempalace_kg_timeline: 顺着时间线查询关系图谱的演化(如小明2020年单身,2024年结婚的纪年表)。mempalace_kg_invalidate: 当发现某事实过期时(如 Bug 被修了),标为失效而非删除,保留系统演进脉络。
【AI主观能动(日记与隧道漫游)】
mempalace_diary_write: Agent 完成一天工作后,用特殊的AAAK言简意赅地写下自己的心路历程、重要结论,甚至带有情绪符号(★、♡、⚠)供未来反刍。mempalace_diary_read: 阅读此 Agent 或前人写过的反思日记。mempalace_traverse: 顺着图谱跨越 Wing/Room 进行定点多跳转发散(Tunnel 漫游),获取灵感启发。
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写入记忆流底库。