Files
JARVIS/development-doc/plan/memory-update/checklist.md

411 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Jarvis Memory 升级执行清单
日期2026-04-04
状态:执行清单
升级方向:拟人化记忆系统
---
## 使用说明
- 完成前使用 `- [ ]`
- 完成后改成 `- [x]`
- Day M.2 默认依赖 Day M.1 的重要性评分完成后再推进
- Day M.3 默认依赖 Day M.1 和 M.2 完成后再推进
---
## Day M.1重要性评分系统4天
Day M.1 目标:让 Jarvis 知道「什么对你重要」。
### Task M.1.1:实现 FrequencyTracker
- [ ] 新增 `backend/app/services/memory/frequency_tracker.py`
- [ ] 实现 `FrequencyTracker`
- [ ] 实现 `increment()` 方法
```python
def increment(self, memory: UserMemory) -> UserMemory:
memory.frequency_count += 1
memory.last_recalled_at = datetime.now()
return memory
```
- [ ] 实现 `get_time_decay()` 方法
### Task M.1.2:实现 EmotionAnalyzer
- [ ] 新增 `backend/app/services/memory/emotion_analyzer.py`
- [ ] 实现 `EmotionAnalyzer` 类
- [ ] 定义 `EMOTION_KEYWORDS` 字典
```python
EMOTION_KEYWORDS = {
"急": 1.0,
"很重要": 0.9,
"困扰": 0.8,
"担心": 0.7,
"想解决": 0.6,
"无所谓": 0.1,
}
```
- [ ] 实现 `extract()` 方法 - 从文本提取情绪关键词
- [ ] 实现 `calculate_score()` 方法 - 计算情绪分数
### Task M.1.3:实现 ImpactEvaluator
- [ ] 新增 `backend/app/services/memory/impact_evaluator.py`
- [ ] 实现 `ImpactEvaluator` 类
- [ ] 实现 `evaluate()` 方法
```python
def evaluate(self, memory: UserMemory) -> float:
# 关联话题越多,影响面越大
return min(1.0, len(memory.associated_topics) / IMPACT_THRESHOLD)
```
### Task M.1.4:实现 ImportanceScorer
- [ ] 新增 `backend/app/services/memory/importance_scorer.py`
- [ ] 实现 `ImportanceScorer` 类
- [ ] 实现 `calculate_score()` 综合评分方法
```python
def calculate_score(self, memory: UserMemory) -> float:
frequency = self.tracker.get_frequency_score(memory) * 0.35
recency = self.tracker.get_recency_score(memory) * 0.20
emotion = self.emotion_analyzer.calculate_score(memory) * 0.25
impact = self.impact_evaluator.evaluate(memory) * 0.20
return frequency + recency + emotion + impact
```
- [ ] 实现 `get_importance_level()` 方法
- [ ] 实现 `should_escalate()` 方法
### Task M.1.5:修改 UserMemory 模型
- [ ] 修改 `backend/app/models/memory.py`
- [ ] 增加字段:
```python
frequency_count: int = 0
last_recalled_at: DateTime = None
emotion_tags: list[str] = []
importance_score: float = 0.5
importance_level: str = "medium"
associated_topics: list[str] = []
```
### Task M.1.6:集成到 MemoryService
- [ ] 修改 `backend/app/services/memory_service.py`
- [ ] 集成 `ImportanceScorer`
- [ ] 修改 `add_memory()` 方法计算重要性
- [ ] 修改 `recall_memories()` 方法按重要性排序
### Task M.1.7:补测试
- [ ] 新增 `backend/tests/services/test_importance_scorer.py`
- [ ] 测试频率追踪
- [ ] 测试情绪分析
- [ ] 测试重要性评分
- [ ] 测试重要性等级划分
### Day M.1 验收
- [ ] 频率追踪正常recall_count 每次 +1
- [ ] 情绪识别准确(「急」「很重要」等能识别)
- [ ] 重要性分数正确(高频+情绪 = importance >= 0.8
- [ ] 评分影响排序(高重要性记忆排在前面)
- [ ] 单元测试覆盖率 > 80%
---
## Day M.2遗忘曲线系统3天
Day M.2 目标:让 Jarvis 知道「什么可以忘记」。
### Task M.2.1:实现 ForgettingCurve
- [ ] 新增 `backend/app/services/memory/forgetting_curve.py`
- [ ] 实现 `ForgettingCurve` 类
- [ ] 实现 `calculate_decay()` 方法
```python
def calculate_decay(self, memory: UserMemory) -> float:
half_life = self.get_half_life(memory)
days = (datetime.now() - memory.last_accessed_at).days
return exp(-days / half_life)
```
- [ ] 实现 `get_half_life()` 方法(重要性影响半衰期)
### Task M.2.2:实现 MemoryDecay
- [ ] 新增 `backend/app/services/memory/memory_decay.py`
- [ ] 实现 `MemoryDecay` 类
- [ ] 实现 `should_archive()` 方法decay < 0.2
- [ ] 实现 `should_deprioritize()` 方法decay < 0.5
- [ ] 实现 `archive_memory()` 方法
- [ ] 实现 `restore_from_archive()` 方法
### Task M.2.3:实现 MemoryReinforcement
- [ ] 新增 `backend/app/services/memory/reinforcement.py`
- [ ] 实现 `MemoryReinforcement` 类
- [ ] 实现 `trigger()` 方法(召回时强化)
- [ ] 实现 `auto_reinforce()` 方法(定期强化 high 级别)
### Task M.2.4:修改 UserMemory 模型
- [ ] 修改 `backend/app/models/memory.py`
- [ ] 增加字段:
```python
decay_score: float = 1.0
is_archived: bool = False
last_accessed_at: DateTime = None
archive_at: DateTime = None
```
### Task M.2.5:集成到 MemoryService
- [ ] 修改 `backend/app/services/memory_service.py`
- [ ] 集成 ForgettingCurve
- [ ] 修改 recall_memories() 更新 last_accessed_at
- [ ] 集成 MemoryReinforcement
### Task M.2.6:添加调度任务
- [ ] 修改 `backend/app/services/scheduler_service.py`
- [ ] 添加每日遗忘检查cron: 03:00
- [ ] 添加每周强化任务cron: 周一 04:00
### Task M.2.7:补测试
- [ ] 新增 `backend/tests/services/test_forgetting_curve.py`
- [ ] 测试遗忘曲线计算
- [ ] 测试高重要性记忆衰减慢
- [ ] 测试归档/恢复
### Day M.2 验收
- [ ] 遗忘曲线正确30 天后 decay ≈ 0.5
- [ ] 高重要性记忆衰减慢high 衰减速度是 low 的 1/6
- [ ] 归档正常decay < 0.2 自动归档)
- [ ] 恢复正常(归档记忆可以恢复)
- [ ] 调度任务正常(每日检查、周强化执行)
- [ ] 单元测试覆盖率 > 80%
---
## Day M.3主动提醒系统6天
Day M.3 目标:让 Jarvis 从「等用户问」变成「主动关心」。
### Task M.3.1:实现 DailyDigestGenerator
- [ ] 新增 `backend/app/services/memory/daily_digest.py`
- [ ] 实现 `DailyDigestGenerator` 类
- [ ] 定义 `DailyDigest` 数据类
- [ ] 实现 `generate()` 方法
```python
async def generate(self, user_id: int, date: date = None) -> DailyDigest:
# 1. 获取今日对话摘要
# 2. 获取高重要性记忆
# 3. 获取待解答问题
# 4. 生成建议
```
- [ ] 实现 `get_recent_digests()` 方法
### Task M.3.2:实现 ReminderScheduler
- [ ] 新增 `backend/app/services/memory/reminder_scheduler.py`
- [ ] 定义 `Reminder` 数据类
- [ ] 实现 `ReminderScheduler` 类
- [ ] 实现 `create_reminder()` 方法
- [ ] 实现 `get_due_reminders()` 方法
- [ ] 实现 `snooze()` 方法
- [ ] 实现 `dismiss()` 方法
### Task M.3.3:实现 ProactiveInformer
- [ ] 新增 `backend/app/services/memory/proactive_informer.py`
- [ ] 实现 `ProactiveInformer` 类
- [ ] 定义 `TRIGGERS` 配置
- [ ] 定义 `INFORM_PROBABILITY` 配置
- [ ] 实现 `should_inform()` 方法
- [ ] 实现 `get_inform_message()` 方法
- [ ] 实现 `check_and_inform()` 方法
### Task M.3.4:创建提醒数据模型
- [ ] 修改数据库支持 `reminders` 表
- [ ] 新增 `backend/app/models/reminder.py`
- [ ] 或在现有模型文件中增加 Reminder 类
### Task M.3.5:集成到 MemoryService
- [ ] 修改 `backend/app/services/memory_service.py`
- [ ] 集成 DailyDigestGenerator
- [ ] 集成 ProactiveInformer
- [ ] 修改 recall_memories() 触发主动告知检查
### Task M.3.6:集成到 SchedulerService
- [ ] 修改 `backend/app/services/scheduler_service.py`
- [ ] 添加每日摘要生成cron: 22:00
- [ ] 添加提醒检查任务cron: 每 15 分钟)
### Task M.3.7:前端 - 每日摘要展示
- [ ] 修改前端对话页面
- [ ] 新增每日摘要卡片组件
- [ ] 获取和展示今日摘要
### Task M.3.8:前端 - 主动提醒推送
- [ ] 新增主动提醒 Toast 组件
- [ ] 实现稍后/知道了按钮
- [ ] 推送 WebSocket 集成
### Task M.3.9:补测试
- [ ] 新增 `backend/tests/services/test_proactive_reminder.py`
- [ ] 测试每日摘要生成
- [ ] 测试提醒创建和调度
- [ ] 测试主动告知概率
### Day M.3 验收
- [ ] 每日摘要生成正常22:00 自动生成)
- [ ] 提醒创建正常(用户可创建提醒)
- [ ] 提醒到期触发(定时推送)
- [ ] 主动告知概率正确(按配置的概率触发)
- [ ] 告知消息自然(像人说话,不生硬)
- [ ] 用户可控制(可以关闭主动提醒)
- [ ] 单元测试覆盖率 > 80%
---
## 总验收清单
### Phase M.1-M.3 必须完成
- [ ] 重要性评分系统正常工作
- [ ] 遗忘曲线系统正常工作
- [ ] 主动提醒系统正常工作
- [ ] 单元测试覆盖率 > 80%
- [ ] 集成测试通过
- [ ] 原有记忆功能无回退
---
## 总工作量估算
| Phase | 工作量 |
|-------|--------|
| M.1 重要性评分 | 4 天 |
| M.2 遗忘曲线 | 3 天 |
| M.3 主动提醒 | 6 天 |
| **合计** | **13 天** |
---
## 产出清单
| 产出 | 对应 Phase |
|------|-----------|
| `services/memory/frequency_tracker.py` | M.1 |
| `services/memory/emotion_analyzer.py` | M.1 |
| `services/memory/impact_evaluator.py` | M.1 |
| `services/memory/importance_scorer.py` | M.1 |
| `services/memory/forgetting_curve.py` | M.2 |
| `services/memory/memory_decay.py` | M.2 |
| `services/memory/reinforcement.py` | M.2 |
| `services/memory/daily_digest.py` | M.3 |
| `services/memory/reminder_scheduler.py` | M.3 |
| `services/memory/proactive_informer.py` | M.3 |
| `models/memory.py` 更新 | M.1, M.2 |
| `models/reminder.py` 新增 | M.3 |
| 前端摘要卡片 | M.3 |
| 前端提醒 Toast | M.3 |
| 单元测试 > 80% | M.1, M.2, M.3 |
| 集成测试通过 | M.1, M.2, M.3 |
---
## 与 Agent Phase 关系
| Agent Phase | Memory 协作内容 |
|-------------|----------------|
| Phase 1 | Memory 追踪用户交互频率 |
| Phase 2 | Memory 服务被 Librarian Agent 调用 |
| Phase 3 | 支持动态协作时的记忆共享 |
| Phase 4 | Memory 重要性可视化 |
| Phase 5 | 高级记忆关联分析 |
**Phase M 可与 Agent Phase 1-5 并行推进。**