语义缓存:把 LLM 账单砍半的隐藏利器

同一个问题一百人问,就要调一百次模型?语义缓存按「意思相近」命中直接返回,省下大量调用。本文讲清它与精确缓存的区别、做法、阈值与时效等取舍,并给出向量命中最小示例。

语义缓存:把 LLM 账单砍半的隐藏利器

同一个问题,一百个用户来问,你就要调一百次模型、花一百份钱?语义缓存说:相似的问题,答案也相似,命中就直接返回,别再烧模型。它是把 LLM 账单砍半的隐藏利器,却常被忽略。

背景:为什么缓存不简单

普通缓存靠「精确匹配 key」,对 LLM 几乎没用——用户问法千变万化,同一意思「北京天气」「帝都今天啥天」,字面完全不同,精确 key 永远不命中。语义缓存按「意思相近」命中,才真正起作用。

它怎么做

把用户问题做 embedding,存进向量库;新问题来时,先检索语义最相近的历史问题,若相似度超过阈值,直接返回缓存答案(或微调后返回)。只有未命中才调模型,并把新问题加答案写入缓存。

一个最小可运行的例子

用向量检索判断是否语义命中:

query_vec = embed(user_question)
hit = vector_db.search(query_vec, top_k=1)
if hit and hit["score"] > 0.92:        # 语义相似度超过阈值即命中
    return hit["answer"]               # 直接返回缓存,不再调模型
answer = model(user_question)
vector_db.add(embed(user_question), {"answer": answer})
return answer

取舍与边界

  • 阈值难调:太松会把不同问题当相同,答非所问;太紧缓存形同虚设,要靠线上数据反推。
  • 时效性问题不适合缓存:实时数据(股价、天气、库存)会过期,要么不缓存,要么配很短 TTL。
  • 答案可能过时:知识更新后缓存要失效(TTL 或主动淘汰),否则模型「学会」了新东西,缓存还在喂旧答案。
  • 隐私:缓存里存了用户问题,注意脱敏与合规,别把敏感query 落库。

Tips

  • 高频重复问答的产品(客服、助手),第一件事就上语义缓存。
  • 阈值从 0.9 起调,结合「答错率」指标逐步校准。
  • 实时类问题设短 TTL 或干脆不缓存,避免返回过期答案。
  • 缓存条目要能按知识更新批量失效。
  • 缓存命中率本身是个重要监控指标,盯住它看省钱效果。

KEEP READING