AI 网关语义缓存与命中率优化落地

日期:2026-07-17

一、项目背景

在这个项目里,我们服务于某多部门共用底座的企业,业务侧每天有大量的 AI 对话、知识问答与辅助写作请求涌向模型侧。上线初期我们很快发现一个现象:同一个部门乃至不同部门之间,每天打进来的问题高度重复——例如"某商品的退货规则是什么""上月销售额怎么看"这类口径固定的问题,原始问法略有差异,但语义几乎一致。由于我们没有在网关层做语义层面的去重,这些近似问题每一句都被原样转发到下游大模型去做完整推理,导致 token 消耗随着调用量线性上涨,单日推理成本居高不下,GPU 显存与算力也频繁出现排队。

我们当时算过一笔账:在采样的一周里,约 62% 的调用在语义层面是与其他请求重复或近似的,也就是说,超过六成的模型推理其实是在"重复劳动"。对一个按 token 计费、算力又受私有化部署规模约束的底座来说,这种浪费是不可接受的。于是我们决定在我们采用的 AI 网关技术平台上落地一套语义缓存机制,把"已经回答过且语义近似"的请求在网关层就地返回,避免无谓地穿透到模型。

二、落地场景

我们把语义缓存的能力放在网关的接入层与路由层之间,作为一道前置的"语义命中判定"环节。整体上覆盖三类典型场景:

第一类是高频问答类。比如客服与运营同学反复询问固定业务规则、商品政策、流程口径,这类问题措辞千变万化但语义收敛,非常适合做语义缓存。

第二类是批量辅助写作与改写。业务系统会批量生成商品文案、活动话术,很多批次之间的提示词模板相同、仅替换少量变量,在归一化后仍可命中历史结果或结果骨架。

第三类是内部知识库的近似检索问答。同一份制度文档被不同人用不同方式提问,网关若能在语义层面识别"问的是同一件事",就能复用已有回答,显著降低 RAG 链路的向量检索与大模型重排开销。

在缓存管理上,我们按业务域做了分层:热数据(分钟级高频)走内存层,温数据走我们采用的向量数据库做近邻检索,冷数据过期淘汰。缓存的写入发生在一次完整推理完成、结果经质量校验之后;命中则直接由网关返回,不经过模型编排层。

案例片段(已脱敏): 语义缓存命中判定核心逻辑(伪代码):python def semantic_cache_lookup(query, domain, threshold=0.92):    emb = embed(normalize(query))            # 请求归一化后向量化    hits = vector_db.search(emb, domain, top_k=3)    for h in hits:        sim = cosine(emb, h.vector)        if sim >= threshold and fresh(h):     # 相似度 + 新鲜度双判定            return h.answer, sim    return None, 0.0

三、关键技术挑战与解决思路

挑战一:语义相似度如何判定,阈值定多少才不过钝化也不漏命中。我们一开始直接用余弦相似度卡 0.85,结果发现误命中率偏高——把"退货规则"和"换货规则"当成同一问题返回了错误答案。我们当时的做法是把阈值按业务域分别校准:政策类口径严格的域定到 0.93 以上,泛问答域放宽到 0.88;同时引入请求归一化(去停用词、统一同义词、抽取关键实体)再向量化,让"上月"和"上个月"这类表述先被抹平差异,相似度判定的稳定性明显提升。

挑战二:缓存命中与结果新鲜度之间的权衡。知识类内容会随制度更新而失效,若一味追求命中率而返回过期答案,反而会造成业务错误。我们的解决思路是给每条缓存打"新鲜度"标签:政策类缓存设置较短 TTL(如 10 分钟)并绑定知识库版本号,一旦知识库更新即批量失效对应域缓存;通用闲聊类可放宽 TTL 到数小时。命中判定必须是"高相似度且仍在新鲜窗口内",二者缺一即视为未命中,回源到模型重新推理并刷新缓存。

挑战三:缓存分层与失效。随着缓存量增长,纯内存缓存既贵又难管理。我们改成分层架构:热数据驻内存 LRU,温数据下沉到向量数据库做近邻检索,冷数据定期清理。失效策略上,除了 TTL 自动过期,还提供按业务域、按知识版本、按手动触发三种失效通道,管控台可一键让某域缓存失效,避免脏数据长时间存在。

挑战四:规避缓存污染与误命中带来的质量风险。我们加了命中结果的质量兜底:对命中返回的答案做轻量级校验(如关键实体一致性、长度异常检测),一旦校验不通过则放弃命中、回源重算,并把该条缓存标记为待清理。这样即便相似度阈值偶发偏差,也不会把错误答案稳定地扩散出去。

四、效果数据

语义缓存上线约六周后,我们抽样对比了上线前后的关键指标(数据为脱敏示意值,非审计级精确数字):

关键指标上线前(示意)上线后(示意)变化
缓存命中率约 0%约 58%提升至约 58%
日均 token 成本基准 100约 47降至约 47%
P99 延迟约 2.8s约 1.1s降至约 1.1s
缓存误命中率约 0.7%控制在 1% 以内

从表中可见,语义缓存把接近六成的重复/近似请求拦在网关层,token 成本直接降至约原先的一半以下,P99 延迟也因为省掉了模型推理与 RAG 检索链路而明显下降。误命中率在阈值校准与质量兜底双重作用下被压到约 0.7%,没有引发明显的业务错误投诉。

五、可复用经验总结

第一,缓存是 AI 应用里性价比最高的降本手段之一。相比去优化模型、扩算力,网关层语义缓存的改动面小、收益直接,几乎不侵入业务代码,值得优先做。

第二,相似度阈值必须按业务域校准,不能一刀切。口径严格的域要卡得紧,泛问答域可适度放宽;配合请求归一化,能同时改善命中率与误命中率。

第三,命中必须和新鲜度绑定。缓存不是越快返回越好,要带 TTL 与知识版本失效,避免把过期答案当成正确结果扩散。

第四,给缓存加质量兜底。即便判定逻辑再严谨,也要有"命中后校验、异常则回源"的保险,防止脏数据稳定存在。

案例片段(已脱敏): 缓存分层与失效的网关策略片段(YAML 示意):yaml semantic_cache:  layers:    hot:  { store: memory,  ttl: 600 }      # 热数据 10 分钟    warm: { store: vector_db, ttl: 3600 }   # 温数据 1 小时  domains:    policy:  { threshold: 0.93, ttl: 600,  bind_kb_version: true }    faq:     { threshold: 0.88, ttl: 7200 }  invalidation:    triggers: [ttl_expire, kb_version_change, manual]