# 聊天记录总结功能测试指南

## 测试数据说明

已创建测试聊天：**帝国骑士维尔 / 恶魔女友长篇测试**

### 故事架构
- **主题**：日式恶魔女友角色扮演
- **情节**：User召唤魅魔，发现对方是前女友 → 签订契约 → 前女友表面嫌弃但内心不舍
- **长度**：10层消息，前5层每层约2000字符，后5层为占位符
- **总字符数**：约10,894字符

### 角色设定
- **雪乃（莉莉丝）**：前女友变成的高阶魅魔，银发红眼，哥特萝莉装，口是心非
- **我（User）**：召唤者，深情且坚定，愿意为爱牺牲

---

## 测试步骤

### 1. 在UI中选择总结模式

1. 打开左侧栏角色卡片
2. 选择"帝国骑士维尔"角色
3. 进入编辑模式（点击角色卡片）
4. 在"历史记录模式"下拉框中选择 **"总结模式（定期总结历史）"**
5. 配置总结参数：
   - **总结间隔**：2（每2条AI回复触发总结）
   - **保留最近楼层**：2（最后2层不总结）
   - **包含用户输入**：勾选
   - **总结提示词**：保持默认或自定义
6. 保存设置

### 2. 开始对话测试

#### 预期行为

**初始状态**：
- L1-L10：正常显示所有消息

**当AI回复达到2条时**（L2、L4、L6、L8）：
- 前端计数器检测到阈值
- 异步调用总结API：`POST /api/chats/帝国骑士维尔/恶魔女友长篇测试/summarize`
- 传递参数：
  ```json
  {
    "start_floor": 1,
    "end_floor": 2,
    "summary_config": {
      "interval": 2,
      "recentFloorsToKeep": 2,
      "includeUserInput": true,
      "summaryPrompt": "...",
      "maxSummaryLength": 500
    }
  }
  ```

**总结完成后**：
- L1：`mes=""`, `is_summarized=true`（清空内容）
- L2：`mes="总结文本"`, `is_summary=true`, `summary_range="L1-L2"`
- L3-L10：保持不变

**继续对话到L4时**：
- L3：`mes=""`, `is_summarized=true`
- L4：`mes="总结文本"`, `is_summary=true`, `summary_range="L3-L4"`
- L5-L10：保持不变

**到达L8时**（保护最后2层）：
- L7：`mes=""`, `is_summarized=true`
- L8：`mes="总结文本"`, `is_summary=true`, `summary_range="L7-L8"`
- **L9-L10：永远不会被总结**（因为设置了保留最后2层）

### 3. 验证总结效果

#### 检查点

✅ **数据结构验证**
```bash
# 查看聊天文件
cat data/chat/帝国骑士维尔/恶魔女友长篇测试.jsonl | jq .
```

应该看到：
- 被总结的楼层：`"mes": ""`, `"is_summarized": true`
- 总结楼层：`"mes": "总结内容..."`, `"is_summary": true`, `"summary_range": "Lx-Ly"`

✅ **前端显示验证**
- 空楼层应显示省略标记（如 "--- 已总结 ---"）
- 总结楼层应高亮显示，并显示范围提示
- 最后2层始终保持原始内容

✅ **Prompt组装验证**
- 发送给LLM的prompt中，`is_summarized=true`且`mes=""`的消息应被过滤
- 总结消息（`is_summary=true`）应保留并作为上下文

✅ **正则处理验证**
- 总结后的消息仍应经过正则处理器
- 空楼层不应影响正则匹配

---

## 手动测试API

如果前端集成尚未完成，可以手动测试API：

```bash
# 1. 获取聊天状态
curl http://localhost:8000/api/chats/帝国骑士维尔/恶魔女友长篇测试/summary-status

# 2. 触发总结（总结L1-L2）
curl -X POST http://localhost:8000/api/chats/帝国骑士维尔/恶魔女友长篇测试/summarize \
  -H "Content-Type: application/json" \
  -d '{
    "start_floor": 1,
    "end_floor": 2,
    "summary_config": {
      "interval": 2,
      "recentFloorsToKeep": 2,
      "includeUserInput": true,
      "summaryPrompt": "请总结以下对话内容，保留关键信息和上下文。用简洁的语言概括主要事件、人物状态和重要细节。",
      "maxSummaryLength": 500
    }
  }'

# 3. 再次获取状态，验证总结结果
curl http://localhost:8000/api/chats/帝国骑士维尔/恶魔女友长篇测试/summary-status
```

---

## 常见问题

### Q1: 总结后消息丢失怎么办？
A: 总结采用"楼层保留式"机制，原文被清空但楼层索引不变。可以通过查看JSONL文件恢复原始数据。

### Q2: 总结质量不理想怎么办？
A: 调整`summaryPrompt`提示词，或增加`maxSummaryLength`限制。

### Q3: 如何重置总结状态？
A: 目前需要手动编辑JSONL文件，将所有`is_summarized`和`is_summary`字段设为`false`，并恢复`mes`内容。

### Q4: RAG模式为什么不能取消？
A: RAG模式涉及数据库结构变更，一旦启用会产生持久化数据，为避免数据不一致，设计为不可逆操作。

---

## 性能指标

- **单条消息平均长度**：~1,000字符
- **总结触发频率**：每2条AI回复
- **预计总结次数**：(10-2)/2 = 4次
- **LocalStorage占用**：< 1KB（仅存储计数器）
- **API响应时间**：< 3秒（取决于LLM速度）

---

## 下一步优化

1. **前端集成**：在ChatBoxSlice中集成计数器逻辑
2. **自动触发**：用户发送消息时自动检查是否达到总结阈值
3. **进度显示**：在右侧栏任务队列中显示总结进度
4. **批量总结**：支持一次性总结多个区间
5. **总结历史**：保存每次总结的元数据（时间、长度等）

---

## 联系与支持

如有问题，请查看：
- 后端日志：`docker-compose logs -f backend`
- 前端控制台：浏览器开发者工具
- 相关文档：`WORLDBOOK_ACTIVATION_LOGIC.md`, `SETTINGS_TEST_GUIDE.md`
