ASTER MEMORY / 03
Memory 向量检索与验证
调用方向量、精确 Top-K、SQLite 持久化、修订 CAS 和检索验证。
VectorIndex 是独立的派生检索能力。调用方负责文档准入、Embedding 生成、生命周期和结果融合。
精确向量检索
InMemoryVectorIndex 使用不可变 Partition Snapshot 执行精确有界 Top-K。它不访问 SQLite,不持久化,也不启动后台任务。
use aster_memory::{
InMemoryVectorIndex, VectorIndex, VectorIndexDescriptor, VectorRecord,
VectorRevision, VectorSearchRequest,
};
let index = InMemoryVectorIndex::new(
VectorIndexDescriptor::new(3)
.with_max_records(10_000)
.with_max_bytes(64 * 1024 * 1024),
)?;
index.replace_partition_if_revision(
"src/lib.rs",
VectorRevision::new(0),
vec![VectorRecord::new("src/lib.rs:1-20", vec![0.8, 0.1, 0.2])
.with_label("language", "rust")],
).await?;
let result = index.search(
VectorSearchRequest::new(vec![0.7, 0.2, 0.1], 10)
.with_label("language", "rust"),
).await?;
维度在创建 Descriptor 时确定。Cosine 索引在准入时规范化记录和查询,并拒绝零向量与非有限值。结果页带有产生该页的不可变索引修订。
Partition 与全局 CAS
替换 Partition 会原子发布完整的新记录集,未变化的 Partition Block 继续共享。搜索不会看到部分替换状态。
index_revision_cas 在发布前比较全局索引修订。延迟写入者不能覆盖或删除更新后的代际。无关 Partition 的变化也可能保守地拒绝已准备更新。
自定义后端默认只保证 partition_atomic。未实现条件接口时,条件写入会失败闭合。
SQLite 持久化
启用 sqlite 后,SqliteVectorIndex::open 把 Descriptor、历史身份、修订、字节记账、Partition 摘要和向量行保存在一个数据库中。
aster-memory = { version = "0.1", features = ["sqlite"] }
Mutation 使用 IMMEDIATE 事务,让独立进程共享全局修订 CAS 线性化点。重新打开时会校验 Descriptor、记录形状和完整性摘要。
SQLite 后端提供本地持久化和文件身份绑定,不是远程复制存储或分布式租约。恢复时先关闭数据库,再替换数据库文件。原地覆盖和带外并发写文件不受支持。
正确性敏感调用使用异步 observe() 获取一致的状态和 Token。同步 status() 与 change_token() 只是兼容性视图。
词法检索与相关性
V2 的默认词法 Profile 保留小写字母数字词,并为连续 CJK 文本添加重叠 Bigram。MEMORY_LEXICAL_QUERY_PROFILE_V1 用于识别算法漂移。
该 Profile 不是跨语言语义检索。翻译或没有词汇重叠的改写仍需调用方提供经过评估的检索扩展。
MemoryItem 的相关性公式为:
score = importance × importance_weight + decay × recency_weight
decay = exp(−age_days / decay_days)
默认权重为 0.7 和 0.3,decay_days 为 30。精确或更具体的词法匹配排在一般的高 Importance 记忆之前。
验证清单
- 验证向量维度、有限值和容量边界。
- 验证 Partition 替换期间没有部分视图。
- 使用两个写入者验证全局 Revision CAS。
- 重启 SQLite 后核对历史身份和完整性。
- 验证复制数据库会派生新的历史身份。
- 把词法命中与语义评估分开报告。
- 运行
cargo test和目标向量基准。