学习笔记 · Obsidian
Key-Value Stores:缓存与字节持久化
公共接口
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。 |
astradb | langchain-astradb / AstraDBByteStore | Astra endpoint/token,远程持久化,提供批量 get/set/delete。 |
bigtable | langchain-google-bigtable / BigtableByteStore | sync/async m*/am*,ayield_keys;复用一个 BigtableEngine 管理 async 执行上下文。 |
elasticsearch | langchain-elasticsearch / ElasticsearchEmbeddingsCache | 远程持久 cache;缓存向量默认不可搜索,如需 searchable vector 必须子类化并只做 additive mapping/document 扩展。 |
file_system | langchain-classic / LocalFileStore | 单机目录持久化,适合能容忍文件被外部增删的场景;不提供分布式一致性。 |
in_memory | langchain-core / InMemoryByteStore | Python 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 本身也不承诺这些能力。