Skip to content

perf(ai): 按业务边界持久化,降低回复与索引进度写盘 - #182

Open
xiaoshengbao wants to merge 2 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/ai-write-on-business-boundaries
Open

xiaoshengbao wants to merge 2 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/ai-write-on-business-boundaries

Conversation

@xiaoshengbao

@xiaoshengbao xiaoshengbao commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

生成回复时,原逻辑每 80ms 将累计全文写入任务记录、时间线和 SSE 事件;索引读取/计算计数也会反复保存完整任务。2.8 已限制索引事件表增长,但仍存在明显的高频写入与 WAL 回写。本 PR 按业务边界保存状态,同时保留实时展示、暂停、恢复和通知。

行为变化

  • 回复片段沿用原来的实时推送节奏,通过内存快照供 SSE 消费;约每 2 秒提交草稿,完成、停止、失败和中断时立即保存最新正文。
  • 索引 read_count / embedded_count / 动态读取批量仅作为内存展示状态;消息、向量和恢复游标仍由原来的 index.commit 原子提交,阶段变化与终态立即保存。
  • 复用由存储锁保护的 SQLite 连接,同一业务更新合并为一个事务;嵌套事务使用 savepoint,失败时同步恢复内存覆盖层,重复内容跳过保存。
  • 内存事件按逻辑条目合并,保留已验证的引用映射并限制缓存数量/体积;现有重连 GET 可以补齐最新状态。预留事件编号保证进程重启后 SSE 游标继续递增,通知保持持久化。删除任务和清理账号同步清除内存状态。
  • 正常关闭在工作线程收尾后关闭连接;存储维护重建/压缩前释放连接。运行自检在正常和异常路径释放自己持有的连接,保证 Windows 能删除临时数据库。SQLite 的默认同步持久性级别未降低。

写入量对照

Windows 隔离测试,对照基线 b02c569;使用 GetProcessIoCounters 测量进程写入量,包含最终保存及连接关闭。回复场景以可控时钟模拟 100 帧、80ms 间隔、最终 5 万中文字符,不是实际模型调用或硬盘物理写入测速。

场景 修改前 修改后 减少
回复 100 帧并最终保存 114,895,504 B 2,972,012 B 97.4%
索引计数更新 100 次并暂停 5,815,176 B 61,584 B 98.9%

验证

  • 全部 test_ai_* 与 test_local_search*:802 passed。
  • 前端聊天、时间线、引用、压缩、子任务和本地索引相关测试:182 passed。
  • 新增 15 项回归,验证展示更新不产生 SQL 数据写入、周期草稿检查点、所有终态保存、SSE 唤醒/重放/账号隔离、引用映射合并、索引恢复游标、事务回滚、跨线程连接复用、维护重建、进程突然退出及服务重启恢复;额外复跑全部通过。
  • 补充运行自检清理回归:正常结束、配置失败、提交失败、校验失败均主动停止工作线程并关闭连接;与写盘预算一起复跑 19 passed。Windows 实际 tools/verify_ai_runtime.py 返回 ok=true。
  • Python compileall 与 git diff --check 通过。

恢复边界

进程突然退出时,尚未提交的展示片段会回退到最近的草稿检查点;已提交证据、工作流检查点、索引数据/游标和未投递通知仍持久保存。正常终态会保存最新正文。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant