摘要
缓存是降低推理成本最直接的手段之一:命中一次,成本几乎归零。但它也是最容易被做错的组件——缓存了不该缓存的内容,省钱的同时悄悄降低了质量;阈值设错,命中率好看而用户投诉上升。本文拆解从精确匹配到语义匹配的三层缓存、相似度阈值的标定方法、必须禁止缓存的四类请求,以及决定命中率的真实因素。2026 奇点智能技术大会(11 月 20-21 日 · 北京万达文华酒店)将讨论 AI 工程实践与成本治理。
一、三层缓存,从严格到宽松
| 层级 | 匹配方式 | 命中条件 | 风险 | 适用 |
|---|---|---|---|---|
| 精确缓存 | 请求内容完全一致 | 最严格 | 无语义风险 | 模板化请求 |
| 归一化缓存 | 去除无关差异后一致 | 较严格 | 低 | 格式差异多的场景 |
| 语义缓存 | 嵌入相似度超过阈值 | 宽松 | 中到高 | 问答类、容错高的场景 |
精确缓存最安全,但命中率通常很低——用户很少两次输入完全相同的文本。
归一化缓存是性价比最高的一层:去除大小写、空格、标点差异,对字段名排序,往往能显著提升命中率且不引入语义风险。这一层常被跳过,直接从精确跳到语义,是常见失误。
语义缓存潜力最大,风险也最高。它的核心难题是:相似不等于相同。
二、语义缓存的真实风险
语义缓存失效时,表现不是报错,而是"给了个差不多但不对的答案"。三类典型事故:
事故一:否定句被当成肯定句。"这个功能支持吗"与"这个功能不支持吗"在嵌入空间里非常接近,语义却相反。
事故二:数值差异被忽略。"2024 年的数据"与"2025 年的数据"文本高度相似,答案完全不同。涉及数值、日期、版本号的请求,语义缓存风险极高。
事故三:上下文不同但问题相同。同一句话在不同用户的上下文里含义不同。如果缓存键不包含上下文标识,就会串味。
defsafe_to_cache(request,threshold,hit):"""缓存安全判断:相似度只是必要条件,还要过这几道关。"""ifhit.similarity<threshold:returnFalseifcontains_numbers_or_dates(request):returnFalse# 含数值/日期:不进语义缓存ifrequest.has_negation!=hit.has_negation:returnFalse# 否定极性不同:拒绝复用ifrequest.context_id!=hit.context_id:returnFalse# 上下文不同:拒绝复用returnTrue这几道关卡看起来繁琐,但每一条都对应一类真实事故。语义缓存的门槛宁可高一些——少命中几次只是没省钱,错命中一次就是质量事故。
三、阈值怎么标定
阈值不能拍脑袋。推荐流程:
第一步:收集真实请求对。从历史流量中取若干请求对,人工标注"答案是否可以复用"。
第二步:计算相似度分布。对标注为"可复用"与"不可复用"的两组,分别统计相似度分布。
第三步:选一个保守阈值。通常取"不可复用"组的相似度上分位数作为下限,宁高勿低。
第四步:上线后持续抽检。随机抽取命中请求,人工检查答案是否合适。这一步不能省,它是发现阈值漂移的唯一手段。
阈值标定:标注 → 分布 → 取保守值 → 上线抽检 ↑ 宁可低命中率,不要错命中四、四类必须禁止缓存的请求
- 含个人数据的请求:缓存会跨用户泄露,这是安全事故而非质量问题
- 需要实时信息的请求:股票价格、库存状态、新闻类问题
- 生成类且要求多样性的请求:缓存会让输出变得千篇一律
- 带随机性参数的请求:温度不为零时结果本就不确定,缓存会掩盖这一点
第一类是最严重的:个人数据进入共享缓存,等于把 A 用户的信息返回给 B 用户。缓存设计里,隐私检查应当作为硬拦截,而不是可选项。
五、决定命中率的真实因素
很多团队期望语义缓存带来 30% 以上的命中率,实际往往只有个位数。原因通常是:
其一,请求本身重复度低。如果业务是开放域问答,重复本来就少,缓存空间有限。
其二,前缀变化。多轮对话里每轮都带完整历史,即使新问题相同,整体文本也不同。解决办法是只对"新增部分"做匹配,而不是整段匹配。
其三,参数分散。不同调用方用不同的 temperature、top_p,导致缓存键不同。应当先统一参数再谈缓存。
判断缓存是否值得做的简单方法:统计一周内精确重复与归一化后重复的请求占比。如果这个比例很低,语义缓存的收益大概率也不高。
六、失效策略
缓存内容的有效期如何定?三种策略:
按时间失效:简单,但可能缓存过期信息,也可能过早丢弃仍有价值的结果。
按事件失效:知识更新、模型换代、提示词变更时主动清空。这是最重要的一条——提示词改了而缓存没清,用户会拿到旧逻辑生成的结果。
按访问频率淘汰:常规的 LRU/LFU,用于容量控制。
必备的主动失效触发点: · 提示词模板变更 · 模型版本变更 · 知识库更新 · 工具定义变更第三项最容易被遗漏:知识库更新后缓存仍在,系统就会持续给出基于旧知识的答案,而且看起来一切正常。
七、缓存的容量与淘汰设计
语义缓存的容量规划常被忽略,直到缓存把内存吃满。三个设计要点。
要点一:容量按条目数与总 token 双重限制。只限制条目数会存进大量长文本;只限制 token 会被大量短条目占满索引。两个上限都要有。
要点二:淘汰要综合考虑时效与价值。单纯 LRU 会保留频繁但低价值的条目。更好的做法是结合命中频率、重建成本与新鲜度加权。
要点三:索引要能持久化。重启后缓存全丢会让系统在恢复期承受全额成本与延迟。索引持久化能显著改善重启后的表现。
classCachePolicy:"""缓存容量与淘汰:双重上限 + 加权淘汰。"""def__init__(self,max_entries,max_tokens):self.max_entries=max_entries self.max_tokens=max_tokensdefevict_score(self,entry,now):# 命中频率越高、重建成本越高、越新 → 越该保留freq=entry.hits/max(1,(now-entry.created)/3600)returnfreq*entry.rebuild_cost*(0.5**((now-entry.last_hit)/86400))八、读者问答
问:缓存命中率多少算好?
取决于业务。模板化场景可以做到 30% 以上;开放问答通常在个位数。把目标定得过高会导致阈值放松,进而引发质量事故。
问:缓存要不要跨用户共享?
对通用知识类问题可以,对任何含个人信息或上下文的请求绝对不行。判断标准是:这条请求的内容是否与特定用户绑定。
问:如何发现缓存串味?
在缓存条目里记录调用方标识,并定期抽检命中记录,检查是否存在跨调用方命中。这是唯一可靠的发现手段。
问:缓存对延迟的影响?
命中时延迟大幅下降,未命中时增加一次检索开销。建议做异步检索——先尝试精确匹配,未命中再走语义检索,避免语义检索阻塞主链路。
九、缓存与提示词工程的协同
缓存效果与提示词设计密切相关,两者应当一起考虑。
其一是把可变部分与固定部分分离。提示词里的动态内容(时间、用户标识、上下文)如果混在开头,会让几乎所有请求都不同。把固定模板放在前面、动态内容放在后面,能显著提升前缀缓存与精确缓存的命中率。
其二是避免不必要的动态信息。有些系统在提示词里插入当前时间戳,导致缓存永远不命中。除非模型真的需要知道当前时间,否则不要插入。
其三是给缓存友好的请求结构。相同语义的请求用相同的表述方式提交(例如先做一次规范化改写),命中率会明显提升。
缓存友好度检查: · 固定模板是否在动态内容之前 · 是否包含不必要的时变信息 · 相同语义是否有相同的表述 · 参数(温度等)是否统一十、读者问答
问:缓存能否与前缀缓存叠加?
可以,两者作用的层次不同:前缀缓存复用计算,结果缓存复用输出。叠加使用收益更大,但要注意失效联动。
问:命中率高但用户投诉增加,可能是什么原因?
大概率是阈值过低导致错命中。此时应提高阈值并抽检命中样本,而不是简单关掉缓存。
问:缓存的收益如何量化?
统计命中次数 × 平均单次成本,减去缓存本身的存储与检索开销。只有净收益为正时,缓存才值得存在。
问:新业务上线时是否启用缓存?
建议初期关闭,等请求模式稳定后再开启。早期流量不稳定时开启缓存,容易把早期的不良结果固化下来。
十一、最后几个问题
问:缓存是否适合所有推理场景?
不适合。生成类、创意类、实时信息类场景都不适合缓存。适合缓存的是"答案稳定且重复度高"的场景。
问:缓存能否跨模型复用?
谨慎。不同模型的输出风格与质量不同,跨模型复用可能让用户感到不一致。建议按模型版本隔离缓存。
问:如何监控缓存的健康度?
三个指标:命中率、抽检错命中率、以及缓存引入的平均延迟变化。第二个指标最能反映风险。
十二、衔接大会专题
问:缓存是否应该区分读写?
缓存只作用于读类请求,任何可能改变外部状态的请求都不应缓存,哪怕它们的输入文本相同。
问:缓存的收益会不会随模型降价而消失?
会缩小,但不会消失——延迟收益与稳定性收益与价格无关。缓存的价值不只是省钱。
11 月 20-21 日,北京万达文华酒店,2026 奇点智能技术大会将讨论推理优化、成本治理与工程实践;C++ 及系统软件技术大会则从缓存系统、内存管理与一致性角度给出底层视角。
带着"我们的缓存命中率是多少、抽检出多少错命中"这两个数字去参会,会立刻知道缓存是在省钱还是在埋雷。
大会信息
2026 奇点智能技术大会 + C++ 及系统软件技术大会
时间:2026 年 11 月 20-21 日
地点:中国·北京万达文华酒店
大会报名:点击报名,领取大会PPT资料
立即报名,锁定 Lukasz Kaiser Keynote 与 70+ 场演讲完整资料!