Skip to main content

记忆框架

· 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_tunnelsmempalace_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 写入记忆流底库。
Hi! 有什么可以帮你的吗?