1. 项目概述:为AI Agent构建结构化记忆系统
在AI Agent逐渐成为我们日常工作流中“同事”的今天,一个根本性的矛盾日益凸显:这些智能体拥有强大的即时推理能力,却缺乏持续、稳定、结构化的长期记忆。想象一下,你每天都要向一位新来的同事重新介绍自己的项目背景、工作习惯和审美偏好,这无疑是低效且令人沮丧的。这正是当前许多AI助手,包括OpenClaw等优秀项目,所面临的“记忆失忆症”困境。它们要么依赖一个不断膨胀、难以维护的MEMORY.md文件,要么将海量对话记录一股脑塞进有限的上下文窗口,导致成本飙升和关键信息被稀释。
HeyCube(黑方体)正是为了解决这一核心痛点而生。它不是一个简单的聊天记录存储器,而是一个专为AI Agent设计的结构化个人档案管理系统。其核心思想是:将关于“你”的碎片化信息,从海量的对话文本中抽离出来,按照“身份认知”、“心理结构”、“审美偏好”等维度进行结构化归档,存储在本地的SQLite数据库中。当AI需要了解你时,它不再需要通读所有历史记录,而是像查询数据库一样,精准、按需地调用相关维度的信息,每次仅消耗约2000个tokens。这不仅是技术上的优化,更是对AI与人类协作关系的一次重新定义——从每次对话都“重新认识”,转变为基于一个持续生长、深度理解的“人格档案”进行协作。
2. 核心设计理念与架构解析
2.1 破解AI记忆的“不可能三角”
在构建AI记忆系统时,我们通常面临一个“不可能三角”:记忆容量、理解深度与成本控制三者难以兼得。
- 传统RAG(检索增强生成):虽然能处理大量文档,但其检索结果是碎片化的文本片段,缺乏对“人”的整体性结构化理解。检索效果随文档量增长而衰减,且无法建立跨文档的关联认知。
- 超长上下文窗口(如128K/1M):看似一劳永逸,将所有历史对话都塞进去。但这带来了两个致命问题:一是成本呈指数级增长,二是模型在处理超长文本时会出现“中间遗忘”现象,位于上下文中间部分的信息被有效利用的概率大大降低。
- 静态记忆文件(如MEMORY.md):这是目前许多AI助手采用的方案。它的优点是信息集中、可控。但缺点同样明显:文件会无限膨胀,每次对话都需要全量载入,消耗大量tokens;并且维护全靠手动,AI无法自动从中学习和更新结构化知识。
黑方体的设计哲学跳出了这个三角。它承认“记住一切”既不经济也不智能,转而追求“在正确的时间,提供正确的记忆”。通过将记忆结构化、维度化、本地化,实现了:
- 无限增长:新的记忆被分类归档到已有的维度或新维度中,数据库可以轻松扩展。
- 深度理解:结构化的字段(如
决策风格: calculated + growth)比一段模糊的描述文本更易于AI理解和运用。 - 成本可控:每次对话仅动态加载最相关的几个维度,上下文消耗稳定在低位。
2.2 系统架构总览
黑方体采用“云端策略,本地数据”的混合架构,在智能与隐私之间取得了精妙的平衡。
服务端(云端“大脑”):
- 角色:策略制定者与维度仓库。
- 核心功能:
- 维护海量维度池:定义和管理“身份认知”、“审美偏好”等数百个结构化维度及其
focus_prompt(引导AI如何提取该维度信息的提示词)。 - 执行智能召回策略:当客户端发起查询时,服务端基于对话语义,运行多路召回算法,判断本次对话需要哪些维度参与。
- 提供元数据:仅向客户端同步维度ID、名称等元信息,绝不接触用户的实际个人数据。
- 维护海量维度池:定义和管理“身份认知”、“审美偏好”等数百个结构化维度及其
- 技术栈:通常采用PostgreSQL(利用其JSONB字段灵活存储维度定义)和高效的向量检索服务(用于语义召回)。
客户端(本地“保险箱”):
- 角色:数据存储与执行终端。
- 核心功能:
- 本地SQLite数据库:所有结构化个人数据的安全港湾。这是整个系统的核心,数据永不离开。
- OpenClaw Hook集成:通过OpenClaw的Pre-Conversation和Post-Conversation Hook机制,无侵入地嵌入工作流。
- 执行查询与更新:根据服务端下发的维度列表,从本地SQLite中查询数据并注入对话上下文;在对话后,将AI生成的结构化摘要写入本地数据库。
- 技术栈:SQLite(轻量、单文件、零配置)、OpenClaw Skill框架。
工作流程:
- 对话前(Pre-Hook):用户发起对话。客户端将当前对话的初始消息或主题发送至服务端。服务端进行语义分析,通过多路召回策略,生成一个本次对话需要的“维度ID列表”返回给客户端。客户端根据此列表,从本地SQLite中查询这些维度的最新数据,拼接成一段精炼的
focus_prompt,注入到即将发给大模型的系统提示词中。 - 对话中:大模型在包含了相关维度信息的上下文中与用户对话,因此能做出更个性化、更懂用户的回应。
- 对话后(Post-Hook):将完整的对话记录发送至服务端。服务端分析内容,判断本次对话更新了哪些已有维度的信息,或创建了哪些新维度的记录,并生成结构化的数据更新指令(如:
维度[审美偏好.色彩]:新增记录{“value”: “偏好低饱和度莫兰迪色系”})返回客户端。客户端执行这些指令,更新本地SQLite。
关键设计优势:隐私分离。你的具体数据(“我喜欢蓝色”)永远在本地SQLite里。云端只知道“这次对话需要用到‘色彩偏好’这个维度”,但不知道你的色彩偏好具体是什么。这既享受了云端智能调度的便利,又确保了数据的绝对私有。
3. 核心组件深度剖析
3.1 维度体系:结构化记忆的基石
维度是黑方体将非结构化文本转化为结构化知识的原子单位。一个维度不仅仅是一个标签,而是一个有明确语义定义的数据收集单元。
维度的构成:
id: 唯一标识符,如aesthetic_visual_minimalism。name: 人类可读的名称,如视觉风格-极简主义。focus_prompt:灵魂所在。这是一段引导AI从对话中识别和提取该维度信息的指令。例如,对于“决策风格”维度,其focus_prompt可能是:“请从对话中识别用户做决策时的特点。是快速直觉型还是深思熟虑型?是风险偏好型还是风险规避型?是独自决定还是寻求共识?请用关键词概括,如‘intuitive, risk-taking, solo’。”
八大域分类示例:
- 身份认知:
core_values(核心价值观)、self_definition(自我描述)。 - 心理结构:
decision_making_style(决策风格)、stress_response(压力应对模式)。 - 审美偏好:
visual_style(视觉风格)、music_genre_preference(音乐流派偏好)。 - 职业画像:
technical_skills(技术技能栈)、career_goals(职业目标)。 - 计划目标:
fitness_goal(健身目标)、learning_objectives(学习目标)。 - 日程节奏:
productive_hours(高效工作时间段)、meeting_preference(会议偏好)。 - 杂项偏好:
coffee_preference(咖啡喜好)、commute_mode(通勤方式)。 - 关系网络:
key_relationships(重要人际关系)、communication_style_with_family(与家人的沟通方式)。
实操心得:如何设计一个好的focus_prompt
- 具体而非抽象:避免“记录用户的偏好”,而应说“记录用户对UI设计中色彩饱和度、留白空间和字体样式的具体评价”。
- 输出结构化:引导AI输出易于解析的格式,如“关键词1,关键词2”或JSON片段。
- 包含正反例:如果可能,在提示词中给出例子,说明什么是符合该维度的信息,什么不是。
- 迭代优化:初期维度定义可能不完美。通过观察AI提取的结果,持续迭代
focus_prompt,使其更精准。
3.2 智能召回策略:从“检索”到“推理”
这是黑方体区别于简单关键词检索的核心。它的目标不是找出包含某个词的所有记录,而是推理出当前对话情境下,AI需要了解“你”的哪些方面。
多路召回机制:
- 语义召回:将当前对话的query进行向量化,与所有维度的
focus_prompt或描述进行相似度计算(如余弦相似度),召回最相关的维度。这是主力通道。 - 历史召回:查询历史日志,当用户过去谈论类似话题时,调用了哪些维度?这些维度本次很可能仍然相关。
- 热度召回:统计全局范围内最常被调用的维度(例如
communication_style可能总是很高),这些通用性强的维度有基础权重。 - 共现召回:分析维度之间的共现关系。例如,当
decision_making_style被调用时,risk_tolerance也经常被一起调用。这是一种基于图的关联推理。 - 无数据召回(探索机制):特别重要!系统会识别那些尚未被填充数据但可能与当前话题相关的维度。这鼓励系统主动探索和补全你的个人档案,实现“越用越准”。
打分排序与重排: 各路召回的结果会形成一个候选维度列表,每个维度有一个初始分数。一个简化的打分公式可能是:最终分数 = 语义相关度权重 * 语义分 + 历史共现权重 * 历史分 + 全局热度权重 * 热度分 + 探索奖励 - 疲劳度惩罚 - 过度覆盖惩罚
- 疲劳度惩罚:防止同一维度在短时间内被反复调用。
- 过度覆盖惩罚:避免一次性加载过多维度,挤占上下文窗口。 最后,这个经过加权的列表会交给一个轻量级LLM进行最终重排和精简,生成一个最优的、数量可控的维度子集,用于本次对话。
3.3 本地存储与同步机制
SQLite:为何是它?
- 零依赖与便携性:单个
.db文件,无需安装数据库服务,复制即用,完美契合“本地优先”理念。 - 性能足够:对于个人档案级别的读写(毫秒级响应),SQLite的性能绰绰有余。
- 成熟的生态:几乎所有编程语言都有良好的驱动支持,便于脚本编写和数据处理。
数据库表结构设计(简化示例):
-- 维度值表:存储具体的个人数据 CREATE TABLE dimension_values ( id INTEGER PRIMARY KEY AUTOINCREMENT, dimension_id TEXT NOT NULL, -- 对应云端维度池的ID user_id TEXT NOT NULL, value_json TEXT NOT NULL, -- 存储结构化的值,如 {"level": "expert", "preference": "Python"} source_conversation_id TEXT, -- 来源于哪次对话 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, confidence_score FLOAT -- AI提取该信息时的置信度 ); -- 为频繁查询的字段建立索引 CREATE INDEX idx_dimension_user ON dimension_values (dimension_id, user_id); CREATE INDEX idx_updated ON dimension_values (updated_at); -- 对话日志表:用于历史召回分析 CREATE TABLE conversation_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, conversation_id TEXT UNIQUE, preview_text TEXT, -- 对话摘要或开头几句 used_dimensions TEXT, -- 本次对话使用的维度ID列表,JSON数组 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );数据同步策略: 服务端与客户端之间同步的仅仅是元数据和指令,这是一个关键的安全设计。
- 维度元数据同步:客户端定期(或启动时)从服务端拉取最新的维度定义列表(id, name, focus_prompt),更新本地缓存。这个过程不涉及任何个人数据。
- 更新指令同步:对话后,服务端下发的“更新指令”只包含维度ID和结构化的值,客户端负责将其写入本地数据库。服务端并不知晓写入是否成功,也不存储这些值。
注意事项:备份!虽然SQLite很稳定,但
personal.db文件是记忆的核心。务必建立定期备份机制(如通过脚本自动复制到云盘或其他位置)。可以编写一个简单的cron任务或使用版本控制工具(但需注意忽略敏感数据)。
4. 与OpenClaw的集成实操
4.1 Hook机制详解
OpenClaw的Skill Hook机制为黑方体提供了完美的无侵入集成点。你不需要修改OpenClaw的核心代码,只需将其作为一个Skill安装。
Pre-Conversation Hook:
- 触发时机:在OpenClaw将用户消息发送给大模型之前。
- 黑方体工作:
- 调用本地服务(或直接运行脚本),将用户消息作为query发送给黑方体服务端。
- 接收服务端返回的维度ID列表。
- 根据ID列表,查询本地
personal.db,获取最新的维度值。 - 将这些维度值按照
focus_prompt的格式组织成一段连贯的文本。 - 将这段文本作为“系统提示词”的一部分,插入到OpenClaw即将发送的请求中。
- 效果:大模型在回复时,已经“知道”了与当前话题相关的你的背景信息。
Post-Conversation Hook:
- 触发时机:在OpenClaw收到大模型的完整回复,且一次对话轮次结束后。
- 黑方体工作:
- 将本轮完整的对话记录(用户输入+AI回复)发送给黑方体服务端进行分析。
- 接收服务端返回的结构化数据更新指令。
- 在本地执行这些指令,向
personal.db插入或更新记录。 - (可选)记录本次对话的日志到
conversation_logs表,用于后续的历史召回分析。
4.2 配置与部署步骤
假设你已经在本地运行了OpenClaw,以下是集成黑方体的详细步骤:
步骤一:获取并配置黑方体客户端
- 从仓库克隆或下载黑方体的客户端代码。
- 在配置文件中设置你的服务端API地址和认证密钥(API Key)。
- 运行数据库初始化脚本
python scripts/init_db.py,它会在指定位置创建personal.db文件及所需的数据表。
步骤二:编写OpenClaw Skill
- 在OpenClaw的
skills目录下创建一个新的技能文件夹,例如heycube_memory。 - 创建技能的主文件(如
skill.py),其中需要实现两个主要函数:# 伪代码示例 import requests import sqlite3 from openclaw.skill_base import SkillBase class HeyCubeSkill(SkillBase): def pre_conversation(self, state): user_message = state.get('latest_user_message') # 1. 调用本地/远程黑方体服务,获取相关维度IDs relevant_dims = self.call_heycube_server_for_dims(user_message) # 2. 从本地SQLite查询这些维度的值 dims_data = self.query_local_db(relevant_dims) # 3. 格式化数据,拼接到系统提示词中 memory_prompt = self.format_memory_prompt(dims_data) state['system_prompt_suffix'] = memory_prompt # 假设通过此字段追加提示 return state def post_conversation(self, state): full_conversation = state.get('full_conversation_text') # 1. 将完整对话发送给黑方体服务端分析 update_commands = self.call_heycube_server_for_update(full_conversation) # 2. 在本地执行更新命令 self.execute_update_commands(update_commands) # 3. 记录日志 self.log_conversation(state['conversation_id'], relevant_dims) return state - 在OpenClaw的配置中启用这个Skill。
步骤三:验证与测试
- 启动OpenClaw,开始一次新的对话。
- 观察OpenClaw的日志,确认Pre/Post Hook被正常调用。
- 尝试谈论一个你之前从未涉及,但属于已有维度的话题(例如,“我觉得极简主义的设计看起来很舒服”)。
- 对话结束后,使用提供的查询脚本(如
python scripts/query_records.py --dimension aesthetic_visual)检查本地数据库,确认“审美偏好-视觉”维度下是否新增了关于“极简主义”的记录。 - 再次开启一个相关话题的对话(例如,“帮我设计一个海报”),观察AI的回复是否已经体现了你对极简风格的偏好。
4.3 与原生MEMORY.md的协同
黑方体并非要取代OpenClaw原生的MEMORY.md,而是与之形成互补的“记忆分层体系”。
- MEMORY.md:充当手动维护的、高度精炼的“核心备忘录”。存放那些绝对重要、不容有误、需要人类强监督的信息。例如:“我的真名是张三”、“我公司的项目代号是‘天穹’”、“我对花生严重过敏”。这部分信息稳定,变化少,适合手动编辑。
- 黑方体SQLite:充当AI自动维护的、不断生长的“结构化人格档案”。存放从日常对话中衍生出的偏好、习惯、风格等软性知识。例如:“我写代码时喜欢先写注释”、“做PPT时偏好深色背景”、“周五下午是我效率低点”。这部分信息动态变化,由AI自动捕捉和更新。
- OpenClaw Session上下文:存放本次对话的临时工作记忆。
在系统提示词中,可以将三部分内容按优先级拼接:
# 系统提示词 你是一个AI助手。以下是一些关于用户的固定信息: [MEMORY.md的内容] 此外,根据本次对话的主题,以下是一些相关的用户背景和偏好: [黑方体动态注入的结构化档案] 请基于以上信息,结合当前对话内容,与用户交流。这样,AI既拥有了稳定的身份锚点,又具备了动态的个性化理解能力。
5. 高级应用、问题排查与未来展望
5.1 数据维护与自检脚本
随着时间推移,数据库里可能会积累不一致或过时的记录。定期维护是必要的。
常用维护脚本:
- 数据导出与查看:使用
export_csv.py脚本,将指定维度的数据导出为CSV,用Excel打开进行人工审阅。这是理解AI如何“看待”你的最佳方式。 - 数据清理:编写脚本,根据
confidence_score(置信度)和updated_at(更新时间)清理低质量或过于陈旧的记录。例如,删除置信度低于0.7且一年未更新的记录。 - 维度贡献度分析:分析哪些维度最常被调用,哪些维度从未被填充。这可以帮助你优化对话方式,或者向黑方体团队反馈哪些维度需要调整
focus_prompt。
实操心得:处理冲突数据当AI从不同对话中提取到关于同一维度的矛盾信息时(例如,一次说“喜欢安静”,另一次说“喜欢热闹”),简单的覆盖可能不合理。可以在dimension_values表中增加conflict_flag字段,并在写入时进行简单的冲突检测(如对比新值与最近三次的历史值)。如果检测到潜在冲突,可以暂不更新,而是通过一个“待审核”列表,留待用户下次对话时由AI主动询问确认(例如,“我之前记录您偏好安静环境,但刚才的对话似乎提到喜欢社交活动,请问哪种描述更符合您通常的情况?”)。这引入了人机协作的校准循环。
5.2 常见问题与排查
问题1:对话中感觉AI没有调用我的记忆。
- 排查步骤:
- 检查OpenClaw日志,确认Pre-Conversation Hook是否被触发,以及黑方体服务端是否返回了维度列表。
- 检查本地SQLite数据库,确认相关维度下是否有数据。
sqlite3 personal.db "SELECT * FROM dimension_values WHERE dimension_id='xxx';" - 检查服务端的维度池,确认该维度的
focus_prompt定义是否清晰、可操作。 - 检查用户query是否过于宽泛或模糊,导致语义召回失败。尝试更具体地开启话题。
问题2:AI提取的记忆信息不准确或奇怪。
- 原因与解决:
focus_prompt不明确:这是最常见原因。需要迭代优化维度的focus_prompt,使其指令更清晰,并包含示例。- 源对话信息模糊:AI只能基于你提供的对话文本进行提取。如果对话本身没有明确表达偏好,提取结果自然会模糊。尝试在对话中更明确地表达你的观点。
- 多轮对话上下文干扰:Post-Hook分析时,可能包含了不相关的历史上下文。可以考虑在发送给服务端时,只截取最相关的几轮对话。
问题3:本地数据库文件损坏或丢失。
- 预防与恢复:
- 定期备份:如前所述,设置自动化备份脚本。
- 使用WAL模式:在连接SQLite时启用Write-Ahead Logging模式,可以提高并发性和减少损坏风险。
- 从导出文件恢复:如果你定期导出CSV,可以从CSV文件重新导入数据到新的数据库。编写一个
import_from_csv.py脚本作为恢复手段。
5.3 未来演进方向
黑方体目前已经构建了一个强大的框架,但仍有广阔的演进空间:
- 跨平台与跨Agent记忆同步:未来的你,可能不仅在OpenClaw上使用AI,还在Cursor、Claude Desktop等多个Agent上工作。黑方体可以演进为一个中心化的个人记忆服务,通过安全的端到端加密同步协议,让所有被你授权的AI Agent都能共享同一套不断进化的个人档案,实现真正的“数字人”一致性。
- 主动记忆与目标驱动:系统不应只是被动记录,还可以主动规划。例如,当识别到你在“学习目标”维度下设置了“三个月内学会吉他”,它可以定期在对话中主动询问进度,或推荐相关的学习资源,推动目标的达成。
- 记忆可视化与交互式修正:提供一个图形化界面,让你可以直观地浏览、编辑、修正你的“人格档案”。你可以手动调整某个维度的权重,标记某条记录已过期,或者直接告诉AI“这条记错了,应该是……”。让人类保持在记忆循环中,实现更精准的协同进化。
- 联邦学习与群体匿名洞察:在绝对保障隐私(数据不离本地)的前提下,能否通过联邦学习技术,从海量用户的脱敏元数据(如维度共现模式、
focus_prompt有效性)中学习,持续优化核心的召回算法和维度体系?这能让系统越用越智能,且不触及任何个人敏感数据。
我个人在实际部署和使用中的体会是,黑方体最大的价值在于它改变了我与AI交互的预期。我不再觉得每次对话都是孤立的,而是能感受到一种连续的、积累的“被理解”。这种“被记住”的感觉,是让AI从工具真正迈向“同事”或“伙伴”的关键情感纽带。初期需要一些耐心来“喂养”数据和调优维度,但一旦系统运转起来,它所带来的个性化体验提升是指数级的。开始尝试时,不妨从一个你最关心的领域开始(比如“工作习惯”或“创作偏好”),集中对话几次,快速看到效果,这会给你坚持用下去的动力。