第 18 篇
工程技术
向量检索如何处理模型档案、范围与缓存
结合实际开发项目,讨论向量检索如何处理模型档案、范围与缓存,说明设计理由、关键源码、验证方法及适用边界。
本文目录 · 8 节
本文属于 Memory Center:AI 编程上下文与记忆系统工程实践,第 18 篇,位于“检索与证据组合”模块。案例背景统一采用实际开发项目;复现步骤使用脱敏教学样例,不代表特定生产事故。
从实际问题出发
同一段文本被反复索引时,再次请求嵌入模型会浪费时间。可缓存的前提是“同一个输入和同一种模型语义”,不能只按文本哈希忽略模型档案。
缓存键表达计算身份
模型配置、维度与输入内容共同决定向量含义。缓存键应把这些条件纳入身份,模型切换后不能把不同空间的向量混用。缓存命中只节省计算,不会自动证明当前索引已按新设置重建。

图中展示的是本篇关注的职责和顺序。正常流程之外,还要结合下面的源码与实验检查失败分支;它不是对某次线上调用的运行时追踪。
设置与发布分开
项目可关闭向量或仅向量化知识,保存范围设置不应悄悄触发高成本索引。扩大范围后需要重建;在途任务还必须检查配置是否变化。缓存本身也有容量和损坏处理责任。
缓存身份可以怎样验证
# 教学示意:不是项目实际缓存格式
import hashlib
import json
def teaching_key(profile, text):
data = json.dumps([profile, text], ensure_ascii=False).encode()
return hashlib.sha256(data).hexdigest()
assert teaching_key('model-a', '相同文本') != teaching_key('model-b', '相同文本')
真实实现还要处理维度、返回值合法性、存储格式和预算。这个小例子只解释一个原则:缓存键必须覆盖所有会改变计算结果的输入。
关键源码与阅读方法
源码基线为 Memory Center 6e90553(文档标注 5.0.0b24)。定位:memory_center/platform/embedding_cache.py,函数 key_for,起始行 104。
以下为当前基线中的函数代码;依赖项目模块,不能作为独立脚本执行。
def key_for(self, profile: str, text_hash: str) -> tuple[str, str]:
"""返回 ``(内容寻址键, 分片名)``;分片名是键的前缀,便于人工核对。"""
key = cache_key(self.namespace, str(profile), str(text_hash))
return key, key[:SHARD_CHARS]
阅读时先找输入由谁提供,再区分纯计算、读取和写入;遇到异常或提前返回,追问调用方会得到什么,以及已有状态是否仍然有效。上面的代码只证明展示范围内的实现,跨模块行为应继续查看调用处和相应测试。
用一个小实验核对设计
建议在独立临时目录和隔离数据中操作,使用虚构的接口、文档与项目名称。
- 对相同文本和相同档案生成键。
- 改变模型档案再生成。
- 切换项目范围并检查重建提示。
**要核对的结果:**重复输入应能复用,不同模型档案必须隔离,关闭向量后关键词能力仍有明确行为。
可把观察记录为下表;没有执行的项写“未执行”,不能用设计预期冒充实测结果。
| 核对项 | 应保留的证据 |
|---|---|
| 使用条件 | 源码版本、配置、输入与项目范围 |
| 正常行为 | 实际返回、来源位置或状态变化 |
| 关键失败分支 | 错误码、可见结果与原状态是否保留 |
| 结论范围 | 已覆盖、未覆盖和需要进一步验证的条件 |
适用边界与继续阅读
本篇以静态源码与项目设计为依据,给出可执行的核对方法,未据此宣称已经完成新的性能或生产环境测试。不同版本的入口、默认值和底层实现可能变化,应先核对当前合同,再把方法用于自己的实际开发项目。
理解这一节后,可以回到专题总导航,沿同一模块继续阅读;顺序学习时使用专栏内的上一篇和下一篇。涉及具体技术选择,应连同本篇的代价与限制一起采用。