Skip to main content

记忆框架

· 9 min read

基本概念

记忆的几个维度

  • Wing (侧翼/顶级项目区): 记忆的最高物理隔绝边界。通常代表一个独立的项目。
  • Room (房间/话题域): Wing 下的子分类。依靠命名(如 frontend, general, database)来聚集相关的记忆碎片。
  • Drawer (抽屉/记忆切片): 真正存储原文的载体。存入 ChromaDB。
  • Hall (大厅/特殊模态): 旧设计里用于特殊类型记忆的附加标记。当前主路径更应理解为 Wing -> Room -> DrawerHall 已不是最核心的组织层。

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_tunnelsmempalace_traversemempalace_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 写入记忆流底库。

Open Claw

Claude Code

Codex

Warp

Hermes Agent

Hi! 有什么可以帮你的吗?