OpenClaw Quiz 响应速度优化工作记录

技术专业 · 今天

日期:2026-03-14 问题:Quiz 增加新题目时响应慢(2分钟以上)


一、问题现象

最近总是感觉 openclaw 发送 quiz 增加 指令后,bot 长时间处于 typing 状态,需要 2-3 分钟才能回复,且随着 quiz 条目增加,速度越来越慢。


二、根本原因分析

2.1 数据文件结构

排查发现 quiz 数据分散在两个文件:

文件用途大小条目数
quiz_state.json练习大脑,含 SRS 数据(totalCorrect/totalWrong/weight)56KB225条
pt_learning_quiz.json原始题库备份,含详细 explanation/category/tags77KB224条

练习时只读取 quiz_state.jsonpt_learning_quiz.json 基本闲置。

2.2 慢的直接原因

quiz_state.json 原来是标准 JSON 数组格式

[
  {"id": "...", "question": "...", "srs": {...}},
  {"id": "...", "question": "...", "srs": {...}}
]

每次新增题目,agent 必须:

  1. 读取整个文件(56KB ≈ 15,000+ tokens)
  2. 解析整个数组
  3. 追加新条目
  4. 整体写回

文件越大,每次操作消耗的 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读全文+修改+写回读全文+修改+写回(无改善)
文件大小56KB44KB

五、遗留说明

答题更新 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 规则文件(已更新)
Theme Jasmine by Kent Liao