🚀 语义缓存 — 扩展 LLM 的系统设计秘密 🧠💸
Source: Dev.to
介绍
欢迎来到我们新系列的第一期:AI at Scale。🚀
我们在过去的一周里构建了一个“弹性堡垒”——保护我们的数据库免受Thundering Herds的影响,并保护我们的服务免受Cascading Failures的影响。但当我们将重点转向 LLM 和生成式 AI 时,遇到了全新的瓶颈。
传统数据库快速且便宜。LLM 则慢且昂贵。
如果你是一名构建生产级 AI 应用的工程师 👷🏻♂️,你会很快意识到为每个用户请求调用 LLM API 是导致巨额云费用和迟缓用户体验的根源。
解决方案?语义缓存。
问题:为什么传统缓存对 AI 失效
在我们之前的文章中,我们使用了键值缓存(比如 Redis)。如果用户请求“Taylor Swift’s Birthday”,键就是完整的字符串。如果下一个用户再次请求“Taylor Swift’s Birthday”,我们就能匹配到。
但是在自然语言的世界里,用户从不会以完全相同的方式提问:
- 用户 A: “Taylor Swift 的生日是什么?”
- 用户 B: “Taylor Swift 何时出生?”
- 用户 C: “Taylor Swift 的生日?”
对传统缓存而言,这三个都是不同的键。对大语言模型(LLM)来说,它们表达的是相同的意图。因此传统缓存的命中率为 0 %,会为同一信息发起三次昂贵的 API 调用。
什么是语义缓存?
语义缓存不关注字母本身,而是关注意义。很简单!
我们不存储字符串,而是存储 向量(意义的数学表示)。当有新问题出现时,我们把它转化为向量,然后询问缓存:“你有没有在数学上足够接近的内容?”
3‑步工作流
- Embedding – 将用户的提示使用嵌入模型(例如 OpenAI 的
text‑embedding‑3‑small)转换为向量。 - Vector Search – 在向量数据库(Pinecone、Milvus,或支持向量的 Redis)中搜索最近邻。
- Similarity Threshold – 计算新提示与缓存提示之间的距离。如果相似度非常高(例如 0.98),返回缓存的响应;否则调用 LLM。
“真实”挑战:可能出错的地方?
1. 相似度阈值(Goldilocks 问题)
- 阈值过高(0.99) – 缓存命中率极低;仍需支付向量搜索 以及 LLM 调用的费用。
- 阈值过低(0.85) – 可能把“如何烤蛋糕”的答案提供给询问“如何做派”的用户。
找到最佳平衡点需要持续监控和微调。
2. 缓存陈旧(“真相”问题)
如果用户询问“苹果公司的当前股价是多少?”而你提供的是三小时前缓存的答案,这就是一次失败。与静态数据不同,语义缓存通常需要 元数据过滤(例如,“仅在数据不超过 5 分钟时使用此缓存”)。
为什么这对你的职业重要
当你在顶级公司面试时,他们并不只寻找会“连接 API”的人。他们想要能够进行优化的架构师。
提到语义缓存表明你理解:
- 成本管理 – 降低 token 消耗。
- 延迟优化 – 将 2 秒的 LLM 等待时间缩短至 50 毫秒的缓存命中。
- 向量基础设施 – 具备现代 AI 核心技术的经验。
收尾 🎁
Semantic Caching 本质上是 AI 时代对 “Celebrity Problem” 的解决方案。它可以防止重复工作,并在你扩展到数百万用户时保持基础设施的精简。
接下来在 “AI at Scale” 系列中: 向量数据库分片 — 如何在不让自己抓狂的情况下管理数十亿的嵌入。
给你的问题: 如果你已经实现了语义缓存,你发现哪个相似度阈值(例如 0.92、0.95)是准确性与成本节约之间的 “最佳平衡点”?在下方分享你的数值吧!👇