Generated by Answer me with HTML 0.5.7 · 2026-10-23 12:09 · ★ Star on GitHub
embedding 缓存补丁已落地
单条 41 KB 降到 4.3 KB,满额 400 MB 降到 42 MB
结果
- 缓存值从 list[float] 改成 array('f'),对外接口和返回类型不变。
- 单条 41 KB 降到 4.3 KB,满 10000 条约占 42 MB,原来约 400 MB。
- 精度影响测不出来:往返余弦相似度 1.0000000000。
- 已重启验证:冷启 91 MB,健康,记忆召回正常。
改了什么
| 项目 | 原实现 | 补丁后 |
|---|---|---|
| 缓存值类型 | Dict[str, List[float]] | Dict[str, array('f')] |
| 单条占用 | 41 KB | 4.3 KB |
| 满额 10000 条 | 约 400 MB | 约 42 MB |
| 写点 | 各自手写 if 判断 | 统一走 _cache_put |
| 读点 | 直接返回缓存值 | 统一走 _cache_get 转回 list |
| 对外接口 | 返回 List[float] | 返回 List[float] 不变 |
- 新增两个 helper:_cache_put 负责存 float32 数组,_cache_get 负责转回 list。
- 写点 5 处、读点 5 处,脚本按匹配数校验,数量不符就整体不写入。
- 只改一个文件 core/embed_service.py,其余代码零改动。
精度验证
- 往返余弦相似度最小值
- 1.0000000000
- 单元素最大绝对误差
- 3e-8
- 召回影响
- 无可测差异
- float32 只有 7 位有效数字,但余弦相似度在 1e-8 级别没有可测影响。
- 嵌入模型本身输出精度也在这个量级,缓存不是精度瓶颈。
功能验证(离线 15 个用例全过)
| 代码路径 | 验证点 | 结果 |
|---|---|---|
| embed | 命中缓存值一致 | 通过 |
| embed | 返回 list[float] | 通过 |
| embed_batch | 混合命中与未命中 | 通过 |
| embed_batch | 首条与单条结果一致 | 通过 |
| embed_with_cache_info | 命中标记为 True | 通过 |
| embed_with_cache_info | 未命中标记为 False | 通过 |
| embed_queued | 写路径攒批后命中一致 | 通过 |
| 缓存条目 | 实际类型为 array | 通过 |
- 用 monkeypatch 顶掉 _embed_texts,全程离线,不花一次 embedding 调用。
- 比较用 1e-6 容差,因为 float32 往返不会逐位相等。
生效与耐久
重启后冷启 RSSmax 91 MB
改动文件数max 1 个
离线用例15 / max 15 通过
- 已用看门狗 --force 重启,新进程 91 MB,看门狗判健康。
- 真机召回验证:memory_search 正常返回三条带分数的结果。
- 升级会把 site-packages 覆盖,补丁已登记进 reapply_local_patches.sh 第 5 段。
- 补丁脚本幂等,重复跑只打印已打过补丁并跳过。
- 回滚:备份在 /root/backups/mem_tune_20261023/embed_service.py.bak。 AM_EOF