AI 大模型开发

embeddings 缓存处理

JACIN··5 分钟阅读

缓存 store 处理

python
store = LocalFileStore("./.cache/embeddings/", update_atime=True)

# 同一段文本,用不同模型算出来的向量不一样。

# 所以缓存 key 里要区分模型命名空间,不然会串缓存。
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    openai_embeddings, store, namespace=openai_embeddings.model
)

当缓存文件被读取时,主动更新这个文件的“访问时间 atime”。

这里有三个常见时间概念:

  • mtime:modified time,文件内容最后修改时间
  • ctime:metadata change time,元数据变化时间
  • atime:access time,最后访问时间

这个参数的作用是:

有些文件系统默认不会可靠更新 atime,或者更新策略很弱,所以 LocalFileStore 在读取缓存时,手动帮你刷新“最近访问时间”。

store会帮你做这件事:

  • 先根据输入文本生成缓存 key
  • store 里查
  • 查到了就直接返回缓存的 embedding
  • 查不到才调用 openai_embeddings
  • 然后把结果写回 store

所以你可以把它理解成:

LangChain 帮你做了“带缓存的 embeddings 代理对象”。

LRU#

意思是:

优先淘汰“很久没被访问”的缓存项。

比如有 4 个缓存文件:

  • A:1小时前访问
  • B:10分钟前访问
  • C:昨天访问
  • D:刚访问

如果缓存满了,LRU 会优先删:

C

因为它最久没被用过。

LRU 的特点

它假设:

过去经常用、最近刚用过的东西,未来大概率还会再用。

所以 LRU 很适合大多数缓存场景。

比如:

  • embedding 缓存
  • 页面缓存
  • Redis 热数据
  • 数据库 buffer pool

MRU#

Most Recently Used

最近最多使用

意思是:

优先淘汰“刚刚才被访问过”的缓存项。

同样那 4 个文件:

  • A:1小时前访问
  • B:10分钟前访问
  • C:昨天访问
  • D:刚访问

如果用 MRU,可能优先删:

D

因为它是最近刚访问的。

比如一种场景:

数据是一遍扫过去的,刚用过的内容短期不会再回头访问。

例如:

  • 顺序扫描大文件
  • 某些批处理任务
  • 一次性遍历数据集

这时最近刚访问过的内容,反而最不可能马上再用,所以删它反而更合理。

评论

还没有评论,来发第一个吧