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

source实测 array('f') · 离线 15 用例 · 2026-10-23
结果
  • 缓存值从 list[float] 改成 array('f'),对外接口和返回类型不变。
  • 单条 41 KB 降到 4.3 KB,满 10000 条约占 42 MB,原来约 400 MB。
  • 精度影响测不出来:往返余弦相似度 1.0000000000。
  • 已重启验证:冷启 91 MB,健康,记忆召回正常。
A

改了什么

项目 原实现 补丁后
缓存值类型 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,其余代码零改动。
B

精度验证

往返余弦相似度最小值
1.0000000000
单元素最大绝对误差
3e-8
召回影响
无可测差异
  • float32 只有 7 位有效数字,但余弦相似度在 1e-8 级别没有可测影响。
  • 嵌入模型本身输出精度也在这个量级,缓存不是精度瓶颈。
C

功能验证(离线 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 往返不会逐位相等。
D

生效与耐久

重启后冷启 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