LLM 的缓存比传统缓存难在哪
传统接口缓存看 URL 与参数;LLM 的请求体是自然语言,同一个意思有无数种写法,
所以"键怎么定"就是核心难题。做错了会出现两种糟糕结果:该命中没命中(白花钱),
或者不该命中却命中(答非所问)。
三层缓存(强烈建议按这个顺序做)
一、精确缓存(最稳)
键 = 请求体的规范化哈希:模型 + 提示词版本 + 参数 + 输入文本(去首尾空白、统一换行、统一大小写规则按需)。
- 只对幂等、无时效的任务开(分类、抽取、格式化);
- 命中率通常已不低(模板化任务重复率很高);
- 键里必须含模型与提示词版本,否则换了版本还在吃旧结果。
二、语义缓存(要克制)
把输入向量化,相似度超过阈值就复用旧结果。
- 阈值调低 → 把"相似但不同"的问题答错(这是它最大的风险);
- 必须有白名单:只对"答案不依赖细节差异"的任务开(例如常见问题);
- 必须记录命中率与人工抽检命中结果,否则你无法知道它错在哪。
三、前缀缓存 / 上下文复用(省在输入侧)
很多推理服务对"相同前缀"有优惠。做法:把稳定部分放前面(系统提示、固定示例),
变化部分放后面(用户输入)。这样前缀能复用,输入成本明显下降。
三类不要缓存的东西
- 带时效的(价格、库存、新闻、政策);
- 带个人数据的(缓存键会泄露、结果会串号);
- 有副作用的(下单、发信、写库 —— 重放会重复执行)。
该观测什么
- 命中率(分精确/语义两侧看);
- 误命中率(抽检命中结果,错误的占比 —— 这个指标最容易被忽略);
- 缓存带来的成本节省与延迟改善;
- 失效策略是否生效(过期、版本变更后旧键是否被绕过)。
落地顺序
- 先做精确缓存(含版本号),立刻见效且风险低;
- 加前缀复用(把稳定内容前置,几乎无风险);
- 最后才考虑语义缓存(白名单 + 抽检 + 可关闭开关)。