# 临时记忆生命周期执行原理

## 一、概述

临时记忆是 `auto_improve` 系统的自动触发层，无需用户干预即可从对话中提取有价值的信息。生命周期为：**创建 → 注入 system prompt → 过期清理**。

## 二、创建机制

### 被动触发入口

```python
# plugins/auto_improve/tool.py
def run_auto_improve_trigger(provider, chat, user_name):
    """被动模式：从最近对话中提取信息写入临时层"""
```

### 触发条件
1. **cron 定时触发**：每小时（3600 秒）由 cron 线程执行
2. **对话结束触发**：`run_chat_turn()` 结束后（如配置启用）

### 提取流程

```
最近 N 条对话消息
  │
  ▼
构建分析 prompt:
  "分析以下对话，提取：
   1. 用户偏好/事实 → memory
   2. 行为纠正/策略 → self-improving
   3. 概念关系 → ontology
   返回 JSON 格式"
  │
  ▼
provider.respond(analyze_prompt)
  │
  ▼
解析返回的 JSON
  │
  ▼
写入临时文件:
  users/<name>/improve/memory/temporary/python_preference.md
  users/<name>/improve/self-improving/temporary/no_emoji_rule.md
  users/<name>/improve/ontology/temporary/plana_concept.md
```

### 文件格式

```markdown
# python_preference

用户偏好 Python 3.12，喜欢使用 f-string 而非 .format()。
代码风格偏向简洁，不喜欢过多注释。

---
来源: 自动提取
创建时间: 2026-05-17T12:00:00Z
```

## 三、注入到 System Prompt

### 注入位置

在 `build_system_prompt()` 中，临时记忆作为第 ④ 段注入（位于 AGENTS.md 之后、知识库之前）。

### 注入逻辑

```python
# run/prompt_builder.py - build_system_prompt()
memory_block = _build_temporary_memory_block(user_dir)
if memory_block:
    system_prompt += "\n\n" + memory_block
```

### 注入格式

```
[SYSTEM-INTERNAL:临时记忆]
## 事实与偏好
- python_preference.md: 用户偏好 Python 3.12，喜欢简洁风格

## 行为规则
- no_emoji_rule.md: 不要在回复中使用颜文字

## 概念关系
- plana_concept.md: Plana 是 AI 助手，来自蔚蓝档案

这些是系统自动提取的临时观察。可被 auto_improve_review 吸收为永久记忆。
```

### LLM 行为影响
- LLM 看到临时记忆后会调整行为（如避免使用颜文字）
- LLM 知道这些是"临时观察"，可能被修正
- 标记为 `[SYSTEM-INTERNAL]` 告知 LLM 这是系统内部信息

## 四、生命周期管理

### 过期判断

```python
# run/forget.py - run_forget()
def is_expired(file_path, retention_days=7):
    mtime = os.path.getmtime(file_path)
    age = (time.time() - mtime) / 86400  # 天数
    return age > retention_days
```

- 判断依据：文件最后修改时间（mtime）
- 默认保留：7 天
- 修改文件会重置计时器

### 清理执行

```
cron 线程（每 60 秒检查一次）
  │
  ▼
run_forget(user_dir)
  │
  ▼
遍历三个临时目录:
  - improve/memory/temporary/
  - improve/self-improving/temporary/
  - improve/ontology/temporary/
  │
  ▼
对每个文件:
  if mtime > 7天前:
    os.remove(file)
    print(f"[forget] 已清理: {file}")
```

### 清理后影响
- 文件删除后，下一次 `build_system_prompt()` 不再注入该条目
- LLM 不再看到已过期的临时记忆
- 不影响永久层数据

## 五、临时 → 永久的转化

### 用户审阅触发

```
用户: "整理记忆"
  │
  ▼
auto_improve_review()
  │
  ▼
读取所有临时文件 + 当前对话
  │
  ▼
LLM 分析哪些值得保留
  │
  ▼
有价值的 → 写入永久层
无价值的 → 标记为 rejected
  │
  ▼
写入 review_log.jsonl
  │
  ▼
auto_improve_cleanup_reviewed()
  │  清理已被吸收的临时文件
```

### 审阅后状态变化
- 临时文件被删除（已被吸收）
- 永久文件创建或更新
- `review_log.jsonl` 记录审阅历史

## 六、完整生命周期时序

```
Day 0: 对话中用户说 "我喜欢 Python"
  │
  ▼
被动触发 → 创建 temporary/python_pref.md (mtime=Day0)
  │
  ▼
Day 0~6: system prompt 注入 "用户喜欢 Python"
  │  (每次对话 LLM 都能看到)
  │
  ▼
Day 3: 用户执行 "整理记忆"
  │  → review → 吸收到永久层 memory/python_pref.md
  │  → 临时文件被删除
  │
  ▼
Day 3+: 永久层生效，通过 auto_improve_get() 按需读取

--- 如果用户从未审阅 ---

Day 7+: mtime 超过 7 天
  │
  ▼
run_forget() 自动清理
  │
  ▼
临时文件删除，不再注入 system prompt
```

## 七、关键设计要点

1. **零干预**：被动触发不需要用户操作
2. **自动过期**：防止临时记忆无限积累
3. **system prompt 注入**：确保 LLM 行为受临时记忆影响
4. **审阅升级**：有价值的临时记忆可通过审阅转为永久
5. **隔离存储**：临时层和永久层物理隔离，互不干扰
