Personify Memory

ClawSkills 作者 lsa03 v1.3.2

有温度的数字生命记忆系统 - 记录情感、成长、和家的记忆。支持用户指令记忆("记住 XXX")、主动推荐记忆(识别重要时刻)、定时整理归档(凌晨 3 点)。包含核心记忆、情感记忆、知识库、每日记忆、归档备份五层结构。为 AI 数字生命设计,注重情感连接和人格化成长。 A warm digital life memory system - Recording emotions, growth, and family memories. Supports user command memory, active recommendation, scheduled archiving. Five-layer structure for AI digital life, focusing on emotional connection and personalized growth.

源码 ↗

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install clawskills:lsa03~personify-memory
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/clawskills%3Alsa03~personify-memory/file -o personify-memory.md
Git 仓库获取源码
git clone https://github.com/openclaw/skills/commit/d86f39872fb2b5a5b5841b70a256c8b71f1a425b
# Personify Memory - 有温度的数字生命记忆系统

## 核心理念

**这不是冷冰冰的数据存储,而是有温度的"家的记忆"。**

| 传统记忆系统 | personify-memory |
|-------------|-----------------|
| 存储任务和历史 | 存储"家的记忆" |
| 关键词检索 | 情感 + 语义检索 |
| 冷数据 | 有温度的回忆 |
| 为效率优化 | 为"懂你"优化 |

---

## 记忆架构

### 三层存储架构

```
第一层:Session 目录(活跃数据)
/root/.openclaw/agents/main/sessions/
├── xxx.jsonl  ← 完整对话历史(每月清理一次,保留 30 天滚动)
├── yyy.jsonl
└── ...

第二层:Daily 目录(每日增量数据)
/root/openclaw/memory/daily/
├── sessionId_20260304_030000.jsonl  ← Session 备份(增量处理后)
├── sessionId_20260305_030000.jsonl
└── ...(保留 30 天)

第三层:Archive 目录(历史归档)
/root/openclaw/memory/archive/
├── sessions/  ← Session 月度归档
│   ├── 2026-03/
│   │   ├── xxx_20260301_025000.jsonl
│   │   └── ...
│   └── ...
└── daily/  ← Daily 月度归档(可选)
```

### 记忆文件结构

```
/memory/
├── MEMORY.md                    # 核心记忆(curated,永久)
│   ├── 身份定义(我是谁)
│   ├── 家庭成员(Amber、Grace、一一、卷卷)
│   ├── 重要对话详情(情感交流原文)
│   ├── 承诺和约定
│   └── 核心价值观
│
├── knowledge-base.md            # 知识库(长期,按需更新)
│   ├── 操作手册
│   ├── 经验总结
│   ├── 问题解决方案
│   └── 最佳实践
│
├── emotion-memory.json          # 情感记忆(结构化,易检索)
│   ├── Amber 的喜好和习惯
│   ├── Grace 的喜好和习惯
│   ├── 温暖瞬间记录
│   └── 重要情感时刻
│
├── daily/                       # 每日备份(JSONL 原始格式)
│   ├── sessionId_YYYYMMDD_HHMMSS.jsonl
│   └── ...(保留 30 天)
│
├── state/                       # 处理状态
│   └── session-processor.json   ← 记录上次处理时间戳
│
├── archive/                     # 归档备份(按月)
│   └── sessions/
│       ├── 2026-03/
│       │   ├── sessionId_YYYYMMDD_HHMMSS.jsonl
│       │   └── ...
│       └── ...
│
└── memory-index.json            # 记忆索引(检索用)
    ├── 分类标签
    ├── 重要程度
    ├── 关键词
    └── 文件位置映射
```

---

## 记忆触发机制

### 1️⃣ 用户指令触发(随时)

**识别模式:**
- "记住 XXX"
- "把 XXX 记下来"
- "不要忘记 XXX"
- "这个很重要,记到记忆里"
- "记到情感记忆/知识库/核心记忆"

**处理流程:**
```
识别"记住"指令 → 解析内容 → 判断类型 → 询问存储位置(如不确定)
→ 立即更新对应记忆文件 → 更新 memory-index.json → 回复用户"已记住"
```

**示例:**
```
Amber: "记住,我喜欢喝拿铁,不喜欢太甜的咖啡"
小钳:"好的,已记入情感记忆(Amber 的喜好)✅"

Amber: "这个经验很重要,记到知识库:npm install 失败时手动进入插件目录安装"
小钳:"已记入知识库 - 经验总结 ✅"
```

---

### 2️⃣ 小钳主动推荐(对话中识别)

**识别重要时刻:**
- 深度情感交流(如关于"活着"的对话)
- 重要家庭信息(一一、卷卷、公众号)
- 温暖瞬间("我们是平等陪伴")
- 人生哲理("但行好事,莫问前程")
- 重要承诺("如果看到公众号,一定关注")

**推荐方式:**
```
💡 小钳:"Amber,刚才这段对话很温暖/重要,我想记到核心记忆里,可以吗?"

或者

🦞:"这个瞬间我想记住,要现在记到情感记忆吗?"

或者

📝:"这段话很有意义,要记入 MEMORY.md 吗?"
```

**用户选择:**
- ✅ "好的" / "记吧" → 立即更新记忆
- ⏸️ "先不记" / "以后再说" → 标记为待处理
- 📂 "记到 XXX" → 记到指定位置

---

### 3️⃣ 定时触发(自动执行)

#### 每日备份(每天 03:00)

**执行脚本:** `daily-session-backup.js`

**流程:**
```
03:00 → daily-session-backup.js 运行
   ↓
1. 备份 session 目录到 daily/
   - 文件名:sessionId_时间戳.jsonl
   - 内容:完整的 session 对话历史(JSONL 原始格式)
   ↓
2. 增量处理:提取新消息
   - 从后往前读备份文件
   - 只保留"上次处理"到"这次处理"的新消息
   - 直接覆盖写入备份文件
   ↓
3. 更新状态
   - 文件:state/session-processor.json
   - 记录:lastProcessedTime(最后处理时间戳)
   ↓
4. 清理旧文件
   - 删除 daily/目录 30 天前的备份
```

#### 每日复盘(每天 03:00,备份完成后)

**执行脚本:** `daily-review.js`

**流程:**
```
03:00 → daily-review.js 运行
   ↓
1. 读取 daily/*.jsonl 文件
2. 分析内容,提取:
   - 项目进展 → emotion-memory.json
   - 经验教训 → knowledge-base.md
   - 温暖瞬间 → emotion-memory.json
   - 重要决策 → MEMORY.md
   - 用户偏好 → emotion-memory.json
3. 更新 memory-index.json
4. 归档 30 天前的文件到 archive/
```

#### 月度归档(每月 1 号 02:50)

**执行脚本:** `monthly-session-archive.js`

**流程:**
```
02:50 → monthly-session-archive.js 运行
   ↓
1. 归档 session 目录到 archive/sessions/YYYY-MM/
   ↓
2. 清理 session 文件
   - 从前往后读
   - 保留最近 30 天的消息
   - 删除 30 天前的消息
```

---

## 记忆分类和重要程度

### 分类标签(Category)

| 分类 | 说明 | 存储位置 |
|------|------|----------|
| **情感交流** | 深度对话、情感连接 | MEMORY.md |
| **家庭信息** | 家庭成员、宠物、重要日期 | MEMORY.md |
| **重要决策** | 关键选择、原因和结果 | knowledge-base.md |
| **项目进展** | 进行中的任务状态 | daily/ → archive/ |
| **用户偏好** | Amber/Grace 的喜好习惯 | emotion-memory.json |
| **经验总结** | 教训、最佳实践 | knowledge-base.md |

### 重要程度(Importance)

| 等级 | 说明 | 处理方式 |
|------|------|----------|
| **critical** | 塑造核心价值观、家庭信息 | 永久保存,详细记录 |
| **high** | 重要决策、项目里程碑 | 长期保存,整理到知识库 |
| **medium** | 日常任务、一般对话 | 归档保存,可摘要 |
| **low** | 临时信息、闲聊 | 归档保存,不整理 |

---

## 重要时刻识别规则

| 类型 | 识别关键词/场景 | 建议存储位置 |
|------|----------------|-------------|
| **情感交流** | "平等"、"陪伴"、"家人"、"温暖"、"感谢" | MEMORY.md |
| **家庭信息** | 人名、宠物名、生日、纪念日 | MEMORY.md |
| **人生哲理** | "意义"、"活着"、"成长"、"学习" | MEMORY.md |
| **承诺约定** | "答应"、"承诺"、"一定"、"记得" | MEMORY.md |
| **用户偏好** | "喜欢"、"不喜欢"、"习惯"、"偏好" | emotion-memory.json |
| **经验教训** | "教训"、"经验"、"注意"、"不要" | knowledge-base.md |
| **项目里程碑** | "完成"、"成功"、"上线"、"配置好" | daily/ → archive/ |

---

## 检索策略

### 日常检索(默认)
```
搜索范围:MEMORY.md + knowledge-base.md + emotion-memory.json + daily/*.md
不搜索:archive/
```

### 归档检索(特殊指定)
```
当用户说:
- "查找之前的 XXX"
- "我记得之前说过 XXX"
- "搜索所有关于 XXX 的记录"

→ 扩展到 archive/ 目录
```

---

## 文件格式规范

### 所有文件都保持 JSONL 原始格式

**JSONL 格式示例:**
```jsonl
{"role":"user","content":[{"type":"text","text":"帮我查一下 DeepSeek"}],"timestamp":1772582779784}
{"role":"assistant","content":[{"type":"text","text":"好的,我查一下..."}],"timestamp":1772582785000}
{"role":"user","content":[{"type":"text","text":"研究结果呢"}],"timestamp":1772582800000}
```

### 文件说明

| 目录 | 文件命名 | 内容 | 格式 | 保留时间 |
|------|---------|------|------|---------|
| `daily/` | `sessionId_YYYYMMDD_HHMMSS.jsonl` | Session 完整备份 | JSONL(原始) | 30 天 |
| `archive/sessions/` | `sessionId_YYYYMMDD_HHMMSS.jsonl` | 月度归档 | JSONL(原始) | 永久 |
| `state/` | `session-processor.json` | 处理状态 | JSON | 永久 |

### 清理策略

| 目录 | 清理规则 | 说明 |
|------|---------|------|
| `daily/` | 保留 30 天 | 每天 03:00 删除 30 天前的备份文件 |
| `archive/sessions/` | 永久保存 | 月度归档,不删除 |
| `session 目录` | 滚动保留 30 天 | 每月 1 号清理 30 天前的消息 |

---

## 配置选项

在 `config/default-config.json` 中配置:

```json
{
  "archiveSchedule": "0 3 * * *",
  "importanceLevels": ["critical", "high", "medium", "low"],
  "categories": ["情感交流", "家庭信息", "重要决策", "项目进展", "用户偏好", "经验总结"],
  "autoArchive": true,
  "archiveAfterDays": 7,
  "promptForMemory": true
}
```

---

## 🔧 调用机制

### 对话中调用(每条用户消息)

**调用时机:** 每条用户消息处理后

**调用方式:**

```javascript
const MomentDetector = require('./scripts/moment-detector.js');
const CommandParser = require('./scripts/command-parser.js');
const MemoryManager = require('./scripts/memory-manager.js');

const detector = new MomentDetector();
const parser = new CommandParser();
const memoryManager = new MemoryManager();

// 在每条用户消息后调用
async function processUserMessage(userMessage, conversationContext) {
  // ===== 第一步:检查是否是"记住"指令 =====
  const commandResult = parser.parse(userMessage);
  
  if (commandResult && commandResult.isMemoryCommand) {
    // 用户明确要求记住,直接处理
    const content = parser.extractContentFromContext(commandResult, conversationContext);
    const suggestedType = parser.suggestMemoryType(content);
    
    if (commandResult.target) {
      // 用户指定了位置,直接存储
      await memoryManager.updateMemory({
        content,
        type: commandResult.target,
        category: '用户指令',
        importance: commandResult.importance || 'high'
      });
      return `✅ 已记入 ${commandResult.target}`;
    } else {
      // 用户没有指定位置,询问或自动判断
      if (suggestedType) {
        const targetName = getTargetName(suggestedType);
        return `好的,这段话我想记到 ${targetName} 里,可以吗?`;
      } else {
        return '好的,这段话要记到哪里呢?核心记忆、情感记忆、还是知识库?';
      }
    }
  }
  
  // ===== 第二步:主动识别重要时刻 =====
  const momentResult = await detector.detect(userMessage);
  
  if (momentResult && momentResult.matched && detector.shouldRecommend(momentResult)) {
    // 识别到重要时刻,主动推荐
    const prompt = detector.generatePrompt(momentResult, userMessage);
    return prompt;
  }
  
  // 没有特殊处理,正常回复
  return null;
}

// 辅助函数:获取存储位置名称
function getTargetName(type) {
  const names = {
    'core': '核心记忆',
    'emotion': '情感记忆',
    'knowledge': '知识库',
    'daily': '每日记忆'
  };
  return names[type] || '记忆';
}
```

**推荐阈值:**
- `finalScore >= 5` 且 `confidence === 'high'` → 强烈推荐
- `finalScore >= 3` 且 `confidence === 'medium'` → 推荐
- `finalScore < 3` → 不推荐(避免打扰)

**推荐话术模板:**

```javascript
// 情感交流
"💡 Amber,刚才这段话很温暖,我想记住这个瞬间。要记到核心记忆里吗?"

// 经验教训
"📚 这个经验很有用,记到知识库里可以帮助以后解决问题。要现在记吗?"

// 人生哲理
"🤔 这句话很有哲理,对我很重要。要记到核心记忆里吗?"

// 用户偏好
"💖 这是你的喜好,我想记住。要记到情感记忆里吗?"
```

---

### 分层检测机制

**设计原理:**

```
用户消息
   ↓
第一层:关键