语义缓存是什么
高频场景里大量问题是同一件事的不同问法:语义缓存把用户问题的向量当键,先按相似度查缓存,命中就直接返回已有答案,省掉 embedding、检索与生成三段开销。它的收益直接体现在成本与延迟上,风险则集中在阈值上——阈值过高命中率低,等于是白做;阈值过低会把不相关问题的答案返回给用户,属于体验事故。此外知识更新或权限变化时必须按文档或租户维度失效相关缓存。
基本信息
| 匹配方式 | 问题向量相似度查缓存,命中即返回 |
|---|---|
| 关键参数 | 相似度阈值,按业务与模型分布校准 |
| 过期策略 | TTL 加事件驱动的主动失效 |
| 失效维度 | 按 doc_id、租户、权限变更定向清理 |
| 观测指标 | 命中率、误命中率、节省的调用量 |
典型使用场景
- 高频FAQ:同一问题被反复提问,缓存命中可以省掉绝大部分生成调用
- 促销与活动问答:短期内流量集中且答案稳定
- 多租户平台:缓存按租户隔离,避免答案串台
- 知识更新:文档变更后定向失效相关缓存,避免继续返回旧结论
- 配额保护:高峰期用缓存削峰,维持稳定的响应时间
缓存命中伪代码
缓存命中伪代码
qv = embed(question)
hit = cache.search(qv, threshold=0.95, # 阈值按业务校准
namespace=tenant_id) # 按租户隔离
if hit:
return hit.answer
ans = rag_answer(question)
cache.add(qv, ans, ttl=7 * 86400, doc_ids=hit_doc_ids) # 记下依据文档阈值与行为
| 阈值 | 命中率 | 风险 |
|---|---|---|
| 过高(0.97+) | 很低 | 缓存形同虚设 |
| 适中(0.93~0.96) | 较高 | 需要按语料实测调优 |
| 过低(0.85-) | 很高 | 答非所问,用户明显感到错乱 |
缓存条目必须记录依据的文档 id:文档更新或权限变化时按这些 id 定向失效,否则用户会持续拿到已废止的答案,而系统看上去一切正常。