学习笔记 · Obsidian

Key-Value Stores:缓存与字节持久化

LangChainPython

公共接口

BaseStore 面向批量键值操作,主要用于 embedding cache:

  • mget(keys) -> list[bytes | None],缺失位置返回 None;
  • mset([(key, bytes), ...]);
  • mdelete(keys);
  • yield_keys(prefix=None)。

批量是核心语义,可减少网络往返;但公共接口没有跨 key 事务、CAS、TTL、版本、加密或 exactly-once 保证。

6 个路由

路由包/类持久化与限制
stores总索引说明 BaseStore 和本地实现;还列出未在本站展开的社区 stores。
astradblangchain-astradb / AstraDBByteStoreAstra endpoint/token,远程持久化,提供批量 get/set/delete。
bigtablelangchain-google-bigtable / BigtableByteStoresync/async m*/am*,ayield_keys;复用一个 BigtableEngine 管理 async 执行上下文。
elasticsearchlangchain-elasticsearch / ElasticsearchEmbeddingsCache远程持久 cache;缓存向量默认不可搜索,如需 searchable vector 必须子类化并只做 additive mapping/document 扩展。
file_systemlangchain-classic / LocalFileStore单机目录持久化,适合能容忍文件被外部增删的场景;不提供分布式一致性。
in_memorylangchain-core / InMemoryByteStorePython dict,进程退出丢失,只适合测试或不要求持久化的场景。

Cache key 与一致性

Embedding cache key 必须包含规范化 input hash、embedding provider/model/version、dimension、预处理版本和 tenant/namespace;否则升级模型或跨租户时会命中错误向量。值应带 schema version 和校验和,反序列化前限制大小和类型。

mset 的批量接口不证明原子性。对远程 store 要验证 partial failure、重试、重复写和读后写一致性;对 yield_keys 不假设稳定 snapshot,也避免在请求路径全量扫描。删除/过期和数据主体请求需要可观测且可验证,不能只依赖自然淘汰。

LocalFileStore 需独占或应用级锁、受限根目录和原子 rename 策略;多进程/多主机不要共享未声明并发语义的普通目录。Elasticsearch cache 的认证、TLS、index mapping 与生命周期策略应由运维配置,而不是把示例密码写进代码。

验证边界

已逐页核对 6 个官方 Markdown 路由和明确的 sync/async/persistence 边界。未对后端进行并发、故障、TTL、备份或恢复测试;BaseStore 本身也不承诺这些能力。