Files
JARVIS/development-doc/plan/memory-update/phase-m-2-forgetting-system.md

229 lines
5.8 KiB
Markdown
Raw Permalink 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.
# Phase M.2:遗忘曲线系统
日期2026-04-04
状态:规划中
依赖M.1 (重要性评分)
工作量3 天
---
## 1. 本阶段目的
实现「选择性遗忘」机制,让 Jarvis 知道「什么可以忘记」。
核心问题:
- 冷门知识不应该一直占存储
- 但不能直接删,要有归档机制
- 重要记忆应该被强化,不容易忘
---
## 2. 核心架构
```
┌─────────────────────────────────────────────────────────────┐
│ ForgettingCurve │
├─────────────────────────────────────────────────────────────┤
│ decay_score = exp(-time_since_access / half_life) │
│ │
│ 遗忘策略: │
│ - decay_score < 0.2 → 归档到 cold_storage │
│ - decay_score < 0.5 → 降权,不参与主动提醒 │
│ - importance_level=high → 半衰期延长 3x │
└─────────────────────────────────────────────────────────────┘
```
---
## 3. 艾宾浩斯遗忘曲线模型
### 3.1 基础遗忘曲线
```
保留率
100% |████████████
80% |██████████
60% |███████
40% |█████
20% |██
0% |________________________ 时间
1天 7天 30天 90天
```
### 3.2 Jarvis 遗忘策略
```python
# 基础半衰期30 天
BASE_HALF_LIFE_DAYS = 30
# 重要性影响半衰期
if importance_level == "high":
half_life = BASE_HALF_LIFE_DAYS * 3 # 90 天
elif importance_level == "medium":
half_life = BASE_HALF_LIFE_DAYS * 1 # 30 天
else:
half_life = BASE_HALF_LIFE_DAYS * 0.5 # 15 天
# 遗忘分数
decay_score = exp(-days_since_access / half_life)
```
---
## 4. 核心文件
### 4.1 新增文件
| 文件 | 职责 |
|------|------|
| `services/memory/forgetting_curve.py` | 遗忘曲线计算 |
| `services/memory/memory_decay.py` | 记忆衰减处理 |
| `services/memory/reinforcement.py` | 记忆强化触发 |
### 4.2 修改文件
| 文件 | 修改内容 |
|------|---------|
| `models/memory.py` | 增加 decay_score, is_archived, last_accessed_at 字段 |
| `services/memory_service.py` | 集成遗忘逻辑 |
---
## 5. API 设计
### 5.1 ForgettingCurve
```python
class ForgettingCurve:
def calculate_decay(self, memory: UserMemory) -> float:
"""返回 0.0-1.0 的保留分数"""
def should_archive(self, memory: UserMemory) -> bool:
"""是否应该归档"""
def should_deprioritize(self, memory: UserMemory) -> bool:
"""是否应该降权(不参与主动提醒)"""
```
### 5.2 Reinforcement
```python
class MemoryReinforcement:
def trigger(self, memory_id: int) -> None:
"""被召回时触发强化"""
# 频率 +1
# decay_score 重置
def auto_reinforce(self, user_id: int) -> None:
"""定期自动强化高重要性记忆"""
# 每周检查,对 high 级别记忆做轻量强化
```
---
## 6. 归档机制
### 6.1 热/冷存储分离
```python
# 热存储:活跃记忆,参与检索和主动提醒
HOT_MEMORIES = []
# 冷存储:归档记忆,不参与主动提醒,按需恢复
COLD_MEMORIES = []
```
### 6.2 归档恢复
```python
async def restore_from_archive(self, memory_id: int) -> UserMemory:
"""从归档恢复记忆"""
# 恢复后 decay_score 重置为 0.8
# 重新加入热存储
```
---
## 7. 调度任务
### 7.1 每日遗忘检查
```python
# 每天凌晨执行
@scheduler.scheduled_task("cron", hour=3)
async def daily_forgetting_check():
"""每日遗忘检查"""
# 1. 计算所有记忆的 decay_score
# 2. 归档 decay < 0.2 的记忆
# 3. 降权 decay < 0.5 的记忆
# 4. 强化被召回的记忆
```
### 7.2 每周自动强化
```python
@scheduler.scheduled_task("cron", day_of_week="mon", hour=4)
async def weekly_reinforcement():
"""每周自动强化"""
# 对 high 重要性记忆做轻量强化
# frequency_count *= 1.1 (上限 10)
```
---
## 8. 测试设计
### 8.1 遗忘曲线测试
```python
def test_decay_after_30_days():
memory = create_memory(last_accessed_at=days_ago(30))
decay = curve.calculate_decay(memory)
assert 0.4 < decay < 0.6 # 约 50% 保留
def test_high_importance_slower_decay():
high = create_memory(importance_level="high", last_accessed_at=days_ago(30))
low = create_memory(importance_level="low", last_accessed_at=days_ago(30))
assert curve.calculate_decay(high) > curve.calculate_decay(low)
```
### 8.2 归档测试
```python
def test_archive_low_decay():
memory = create_memory(decay_score=0.15)
assert curve.should_archive(memory) == True
def test_restore_from_archive():
memory = service.restore_from_archive(memory_id)
assert memory.is_archived == False
assert memory.decay_score > 0.5
```
---
## 9. 验收标准
| 标准 | 说明 |
|------|------|
| 遗忘曲线正确 | 30 天后 decay ≈ 0.5 |
| 高重要性记忆衰减慢 | high 级别衰减速度是 low 的 1/6 |
| 归档正常 | decay < 0.2 自动归档 |
| 恢复正常 | 归档记忆可以恢复 |
| 调度任务正常 | 每日检查、周强化执行 |
| 单元测试覆盖率 | > 80% |
---
## 10. 工作量估算
| 任务 | 工作量 |
|------|--------|
| ForgettingCurve | 0.5 天 |
| MemoryDecay | 0.5 天 |
| Reinforcement | 0.5 天 |
| 归档机制 | 0.5 天 |
| 调度任务 | 0.5 天 |
| 测试 | 0.5 天 |
| **合计** | **3 天** |