Semantic Caching
语义缓存会在新查询与先前查询含义相同时返回已存储的 LLM 响应,通过匹配嵌入来跳过模型调用并降低成本。
语义缓存会存储大型语言模型(LLM)或其他生成模型的响应,并在新请求与先前请求含义相同时重复使用这些响应,即使措辞不同也可以。缓存会将每个提示转换为嵌入,找到相似度最高的已存储提示,并在相似度超过阈值时返回保存的答案。命中缓存后完全跳过模型调用,因此延迟会降至毫秒级,而且请求不会消耗任何 token。由于匹配依据是含义,“我忘了密码”和“如何重置密码?”可以共用一个已存储的答案;若缓存按提示文本进行精确匹配,则必须分别存储两份答案。Zilliz 于 2023 年发布了用于此模式的开源 GPTCache 库,如今向量数据库和 API 网关也将其作为内置功能提供。
语义缓存的工作原理#
句子嵌入模型会对传入的提示进行编码,向量搜索会将其与先前已回答提示的嵌入进行比较,通常使用余弦相似度。小型缓存可以放在内存中,大型缓存则存储在带有近似最近邻索引的向量数据库中。缓存未命中时,模型会生成新答案,并将新提示的嵌入与响应一起存储,通常还会设置过期时间。
缓存键必须涵盖所有其他会改变正确答案的因素。在不同系统提示、模型版本、用户权限级别或检索文档集合下生成的响应会分别存储在不同范围中,因此一个客户的缓存答案绝不会提供给另一个客户。新鲜度也需要同样谨慎处理:当价格、政策或源文档发生变化时,基于旧版本创建的条目仍会匹配新提示,因此每个条目都要设置生存时间,并在源数据变化时清除受影响范围内的条目。
选择相似度阈值#
阈值决定了两个提示可以有多大差异,但仍能共用一个答案。以下示例使用 Sentence Transformers 中的 all-MiniLM-L6-v2 模型作为编码器,构建一个包含三条记录的缓存:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")密码问题的改写得分为 0.89,命中正确。营业时间问题的改写只得 0.61,未命中。“如何取消我的订单?”与“如何取消我的订阅?”的相似度为 0.71,会返回错误的操作说明。嵌入相似度衡量的是措辞和主题的相似程度,因此,没有一个阈值能区分这三种情况。生产环境中的缓存会通过以下方式缩小这一差距:用自身流量中的改写句对微调编码器、按类别设置阈值,或将每个候选命中交给重排器,由其对两个提示进行联合评分后再返回缓存答案。
语义缓存适用的场景#
语义缓存适用于许多用户会提出相同问题、且答案变化缓慢的场景,例如客服聊天机器人、内部服务台,以及基于稳定文档的检索增强生成(RAG)助手。个性化、时效性强或需要创意的请求则很少能从中受益,因为复用答案可能会出错或显得重复。
LLM 服务中还有另外两种缓存,它们工作在不同层级:
- 提示缓存:模型服务器存储完全重复的提示前缀所计算出的状态,从而缩短预填充时间;模型仍会生成新答案。
- KV 缓存:在单次生成过程中保留先前 token 的键和值,使每个新 token 无需重新计算这些内容。
语义搜索使用相同的嵌入查找方式为查询检索文档;语义缓存则用它检索已完成的答案,通常部署在位于应用和模型提供商之间的AI 网关中。
图像也可以用同样的方式作为缓存键。Ultralytics YOLO 中的 embed() 会为每张图像返回一个特征向量,因此,针对图像分类训练的 YOLO26 模型可以提供查找键,让近乎重复的摄像头帧复用视觉语言模型先前生成的描述。










