
日期:2026-03-14 问题:Quiz 增加新题目时响应慢(2分钟以上)
一、问题现象
最近总是感觉 openclaw 发送 quiz 增加 指令后,bot 长时间处于 typing 状态,需要 2-3 分钟才能回复,且随着 quiz 条目增加,速度越来越慢。
二、根本原因分析
2.1 数据文件结构
排查发现 quiz 数据分散在两个文件:
| 文件 | 用途 | 大小 | 条目数 |
|---|---|---|---|
quiz_state.json | 练习大脑,含 SRS 数据(totalCorrect/totalWrong/weight) | 56KB | 225条 |
pt_learning_quiz.json | 原始题库备份,含详细 explanation/category/tags | 77KB | 224条 |
练习时只读取 quiz_state.json,pt_learning_quiz.json 基本闲置。
2.2 慢的直接原因
quiz_state.json 原来是标准 JSON 数组格式:
[
{"id": "...", "question": "...", "srs": {...}},
{"id": "...", "question": "...", "srs": {...}}
]每次新增题目,agent 必须:
- 读取整个文件(56KB ≈ 15,000+ tokens)
- 解析整个数组
- 追加新条目
- 整体写回
文件越大,每次操作消耗的 token 越多,速度越慢。
2.3 去重检查的额外消耗
原有规则要求新增前检查重复 id,进一步增加了处理时间(需完整扫描所有条目)。
三、优化措施
3.1 关闭去重检查
在 memory/quiz_rules.md 增加第7条:
Bulk Addition: Skip duplicate checking and verification during additions.
Simply append new items to the records.效果:新增时跳过全文扫描,但仍需全文读写。
3.2 迁移 NDJSON 格式(核心优化)
将 quiz_state.json 从标准 JSON 数组迁移为 NDJSON 格式(每行一条独立 JSON):
{"id":"verb_chegar...","question":"...","srs":{...}}
{"id":"sentence_ele...","question":"...","srs":{...}}
{"id":"sentence_eu...","question":"...","srs":{...}}迁移结果:
- 备份原文件为
quiz_state.json.bak(56KB) - 迁移后文件 44KB,缩小 12KB
- 225 条数据完整保留
在 quiz_rules.md 增加第8、9条规范操作方式:
8. Storage Format: NDJSON,每行一条独立 JSON 对象
9. Operations:
- Add: 直接 append 新行(无需读取原文件)
- Update: 读全文 → 修改对应行 → 写回四、优化效果对比
| 操作 | 优化前 | 优化后 |
|---|---|---|
| 新增题目 | 读全文(56KB)+改末尾+写回 | 直接 append 一行 ✅ |
| token 消耗(新增) | 15,000+ tokens | < 100 tokens ✅ |
| 答题更新 SRS | 读全文+修改+写回 | 读全文+修改+写回(无改善) |
| 文件大小 | 56KB | 44KB |
五、遗留说明
答题更新 SRS 无法优化:每次答题后需要更新某条记录的 totalCorrect/totalWrong,NDJSON 格式同样需要全文读写(无法原地修改某一行)。目前 225 条影响不大,若将来增长到数千条,可考虑迁移至 SQLite。
pt_learning_quiz.json 保留为备份:不建议合并 explanation 字段到 quiz_state.json,避免文件进一步膨胀。
六、相关文件
/root/clawd/memory/quiz_state.json # NDJSON 格式,当前使用
/root/clawd/memory/quiz_state.json.bak # 原 JSON 数组格式备份
/root/clawd/memory/pt_learning_quiz.json # 原始题库备份(闲置)
/root/clawd/memory/quiz_rules.md # SRS 规则文件(已更新)