AI 应用缓存键怎么设计?租户、模型、提示词与索引版本的 7 项离线验证

同一个问题命中了缓存,答案却属于另一个租户,问题往往出在缓存键过于简单。AI 应用的输出不仅由问题文字决定,还可能取决于租户、模型、提示词版本、检索索引和权限上下文。

一、先列出输出依赖

模型、提示词和索引更新后,旧答案可能不再符合要求。把这些依赖做成显式版本,才能决定哪些结果可以复用。Python 的 lru_cache 缓存可哈希参数,但不会理解业务身份与权限。

二、可运行的最小键

下面只使用固定 fixture,不调用模型。排序键与紧凑分隔符固定 JSON 序列化,再计算 SHA-256。哈希不是加密,不会让敏感问题自动安全。

python 复制代码
import json, hashlib

def key(tenant, model, prompt_version, index_version, question):
    payload = dict(tenant=tenant, model=model, prompt_version=prompt_version, index_version=index_version, question=question)
    raw = json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":"), allow_nan=False).encode("utf-8")
    return hashlib.sha256(raw).hexdigest()

base = ["tenant-a", "model-v1", "prompt-v1", "index-v1", "库存是多少?"]
k = key(*base)
assert k == key(*base)
for i in range(5):
    other = base.copy()
    other[i] += "-changed"
    assert key(*other) != k
cache = {k: "fixture answer"}
assert key("tenant-b", *base[1:]) not in cache
print("7 assertions passed; tenant/model/prompt/index/question are isolated")
print("key:", k)
print("No model API or production cache used")

本机 Python 3.13.13 已运行原始实验,结果为 7 assertions passed,键为 a32a751198fef4a514816914286b3a85af820ca1aad196cd594d550b4e383afe。这里验证相同输入可重现、五项依赖分别变化时键不同、不同租户不能命中本例条目,没有测试模型效果、成本或并发性能。

三、键相同还不够

读取缓存仍需核对当前权限。用户撤权后,能定位旧条目不等于仍被授权。应查询权威权限版本,或对敏感答案禁用跨请求缓存。TTL 只限制保存时间,不能保证内容始终最新。保存来源、创建时间与依赖版本;索引更新时隔离命名空间。不要把错误、超时和半截流式输出缓存成正常答案。

四、语义缓存与并发

相似问题只能进入候选,仍须核对租户、语言、时间和版本。"明天库存"和"今天库存"不能因相似度高就共用答案。未经业务验证,不要随意删除标点、转换大小写或规范化空白。

缓存复用已完成结果;single-flight 合并进行中的计算。并发首次请求可能重复计算,锁的释放、取消和异常传播需要另测。对有写入或发消息副作用的工具,缓存不能代替幂等设计。

五、验收清单

覆盖同问题不同租户、新模型、新提示词、新索引、撤权和部分输出。除命中率和延迟外,还记录错误命中和失效原因。本文只验证依赖隔离,没有真实模型、向量库、分布式锁或撤权实验。

参考:https://docs.python.org/3/library/functools.html#functools.lru_cache

相关推荐
北京地铁1号线1 小时前
后端开发:缓存(Cache)简介
后端·缓存·cache
李纲明1 小时前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
程序猿编码19 小时前
纯 C++ 手写 LLM 推理引擎:分页 KV 缓存、连续批、多卡张量并行全部内置
c++·深度学习·缓存·大模型推理·自动微分·模型推理
code2cat19 小时前
【随笔】RAG检索缓存:复用证据之前,先把权限和版本放进缓存键
java·人工智能·缓存·知识库·rag
牧瀬クリスだ1 天前
Redis五大数据类型全解析:从入门到实战
java·数据库·redis·后端·缓存
讯捷蓝达1 天前
HPE Nimble CS3000存储,断电恢复后,双控缓存异常,存储卷无法正常启动
缓存
Lucis__1 天前
Redis持久化机制解析
redis·缓存·操作系统·文件·非关系型数据库·1024程序员节
李纲明2 天前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
码士集团小青2 天前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节