# 记忆拟合 · 用户手册

<p align="center">
  <a href="./USER-GUIDE.md"><img alt="中文" src="https://img.shields.io/badge/%E4%B8%AD%E6%96%87-%E5%BD%93%E5%89%8D-blue?style=for-the-badge"></a>
  <a href="./USER-GUIDE_EN.md"><img alt="English" src="https://img.shields.io/badge/English-switch-lightgrey?style=for-the-badge"></a>
</p>

<p align="center"><a href="./README.md">← 返回 README</a></p>

---

## 目录

- [1. 什么时候用它](#1-什么时候用它)
- [2. 三分钟跑通一次拟合](#2-三分钟跑通一次拟合)
- [3. 悬窗的三个页签](#3-悬窗的三个页签)
- [4. 开关怎么设](#4-开关怎么设)
- [5. 两种发起方式](#5-两种发起方式)
- [6. 留档里有什么](#6-留档里有什么)
- [7. 常见问题](#7-常见问题)
- [8. 数据与隐私](#8-数据与隐私)

---

## 1. 什么时候用它

**该用**：

- 你说不清自己要什么，但能一眼认出"对/不对"
- 需求反复改口，来回几轮还在原地
- 你要开一个新方向，但脑子里只有模糊的感觉
- 你要给别人（或下一个 AI 会话）交代一件事，自己却还没想明白

**不该用**：

- 需求已经很明确 → 直接说，别绕
- 只是想问个事实 → 拟合帮不上忙
- 你赶时间 → 提问要花你的时间，这不是免费午餐

一句话判断：**如果你能一句话说清楚，就别用；如果你说三句还在打转，就用。**

---

## 2. 三分钟跑通一次拟合

**① 打开悬窗**

点右下角的「记忆拟合」按钮。第一次打开会停在**设置**页 —— 这是故意的，先让你看清开关状态。

**② 切到「开始拟合」页**

写下触发语，比如：

> 帮我把记忆这部分弄好一点，感觉不太行。

点「开始」。

**③ 回到聊天窗口答题**

AI 会先给出 3-5 个方向，然后提出第一轮的 2-4 个问题。**这些问题会以选项卡的形式出现在聊天窗口里**，直接点选即可；选项都不对时，可以在自定义输入框里自己写。

一轮答完，AI 消化后给出下一轮。**默认最多 4 轮。**

**④ 确认收敛**

某个方向明显领先时，AI 会提案：「我理解你要的是 X，对吗？」

- 对 → 确认，归档
- 不对 → 告诉它哪里不对，它会继续拟合

**⑤ 查看留档**

切到「留档」页，能看到刚才这次完整记录。点进去可以看事件流回放。

---

## 3. 悬窗的三个页签

### 设置（默认页）

四个开关 + 两个参数 + 环境自检。详见第 4 节。

### 留档

列出所有历史拟合记录：标题（收敛方向，或你手动改的名字）、状态徽章（已确认 / 待确认 / 进行中 / 已放弃）、时间与触发语。

**点任意一条**进入详情：

| 动作 | 说明 |
|---|---|
| **确认并归档** | 标记为已确认，并按开关决定是否写入记忆插件 |
| **改标题** | 起一个可读名字（建议用工作节点名） |
| **删除** | 删除会话文件与索引项，**不可恢复**，会二次确认 |

详情页下方是**完整事件流**：开始 → 预定方向 → 每轮提问 → 每轮作答 → 轮间思考 → 提案 → 确认。这是复盘"AI 当时为什么这么判断"的唯一凭据。

### 开始拟合

写触发语并创建拟合会话。这里也会显示当前是否开启了工具暴露 —— 开着的话，你也可以直接在聊天里让 AI 自己发起。

---

## 4. 开关怎么设

### 污染面开关（默认全关）

| 开关 | 打开后会发生什么 | 什么时候该开 |
|---|---|---|
| **注入会话上下文** | 每轮对话多一段说明，告诉模型"需求模糊时可主动发起拟合" | 你希望 AI **主动**帮你拟合时 |
| **写入记忆插件** | 拟合结论写进 dsh-auto-memory | 你希望结果**能被以后检索到**时 |
| **向模型暴露工具** | 模型能看到 memory_fit_* 四个工具 | 你希望**用嘴**让 AI 发起拟合时 |

**这三个默认关闭是有意的**：

- **注入要花 token**。每轮都注入，钱是你出。
- **注入越频繁，模型的注意力越衰减** —— 同一段话在第 1 轮很有效，到第 50 轮就变成背景噪音了。正确策略是"少而准"，不是"多而全"。
- **写入记忆是与另一个插件的耦合点**，默认不碰，避免出问题。

### 本插件自己的存储

| 开关 | 默认 | 说明 |
|---|---|---|
| **本地留档** | **开** | 拟合全过程写入 ~/.dsh/memory-fitting/sessions/ |
| **记住悬窗开合** | 开 | 关掉则每次启动都收起悬窗 |

> **本地留档关掉会怎样**：拟合无法开始（没有地方存过程）。这是刻意的 —— 与其产生一堆无处安放的会话，不如直接拒绝。

### 拟合参数

| 参数 | 默认 | 说明 |
|---|---|---|
| **每轮问题数上限** | 4 | 一轮最多问几个问题 |
| **整场轮数上限** | 4 | 防止"问上瘾"。**别再往上调了** —— 问第 5 轮时用户已经在想"你直接干不就完了" |

---

## 5. 两种发起方式

### 方式 A：悬窗里点（推荐先用这个）

不需要开任何开关。悬窗 → 「开始拟合」→ 写触发语 → 开始。

### 方式 B：让 AI 主动发起

需要开「向模型暴露工具」和（可选）「注入会话上下文」。然后直接对 AI 说：

> 我还没想清楚要什么，帮我拟合一下意图。

AI 会调用 memory_fit_start 创建会话，然后 memory_fit_ask 向你提问。

**注意**：工具暴露意味着每轮都会带上四个工具的 schema，这是一笔固定开销。只是偶尔用的话，**建议还是走方式 A**。

---

## 6. 留档里有什么

每条留档是一个 JSONL 文件，一行一帧：

| 帧类型 | 内容 |
|---|---|
| fit/start | 触发语、工作区、锚点 |
| fit/directions | AI 预定的方向 |
| fit/ask | 本轮提出的问题与选项 |
| fit/answer | 你的作答 |
| fit/reflect | 轮间对方向的更新 |
| fit/propose | 收敛提案 |
| fit/finish | 确认或放弃 |
| fit/feedback | 训练就绪的反馈三元组 |

**为什么用 JSONL**：追加写不用重写整个文件、崩溃不丢已写的轮次、可以直接当回放日志。

索引文件（index.json）只是为了让列表渲染快一点。**它坏了没关系，可以重建。**

---

## 7. 常见问题

**Q：拟合到一半我不想答了怎么办？**

直接关掉提问框 / 取消。已答内容**保留在本地留档**，不会丢。会话状态停在"进行中"。

**Q：AI 问的问题很蠢怎么办？**

选「不确定」或自己写。**拟合质量取决于 AI 预设的方向好不好** —— 如果第一轮方向就全跑偏，直接告诉它"都不对，我想要的是……"，这本身就是最有价值的一次输入。

**Q：为什么默认最多 4 轮？**

因为问第 5 个问题时，大多数人已经在想"你直接干不就完了"。

**Q：能同时跑多个拟合吗？**

能。每条会话是独立文件，互不影响。

**Q：留档会一直留着吗？**

会，直到你手动删除。索引只保留最近 200 条，但**会话文件不会自动删**。

**Q：写入记忆插件失败了怎么办？**

**本地留档不受影响。** 失败只影响"能不能被以后的检索命中"。悬窗会提示失败原因。

**Q：能和 dsh-auto-memory 之外的记忆插件配合吗？**

目前只实现了 auto-memory 适配器。没有它时自动降级到仅本地留档，不会报错。

---

## 8. 数据与隐私

**全部数据在本地**：~/.dsh/memory-fitting/。插件不向任何外部服务发送数据。

**什么时候会离开本地**：

- 你把「写入记忆插件」打开 → 收敛结论写进 dsh-auto-memory（也是本地文件）
- 拟合过程中模型看到的问答内容 → 会随正常对话请求发给模型服务商，**和平时聊天一样**

**不会离开本地的**：完整问答轨迹、方向列表、事件流。

### 归档前会发生什么

所有写进记忆插件的内容都会先过一道**字符级改写**：

- **为什么**：dsh-auto-memory 的写入侧不检查待写入正文。正文里一旦出现特定字符序列，**整个记忆文件会被锁死**，此后所有写入都被拒绝。
- **怎么处理**：检测到就改写为等价的描述性表述，其余逐字保留。
- **注意**：这是**改写措辞**，不是转义 —— 反引号、代码块对那个解析器统统无效。

因为拟合记录天然包含你的原话，这一步是强制的。

---

<p align="center">
  <a href="./README.md">← 返回 README</a> ·
  <a href="./docs/TRAINING.md">训练路线图 →</a>
</p>
