语义缓存:如何使用语义缓存优化 RAG 应用
Source: Dev.to
Disclaimer
此文本最初由生成式人工智能根据 Daniel Romero 频道的视频转录而创作(他是我们人工智能工程专业化的负责人)。如果您更喜欢观看视频,只需点击播放即可。
Source: …
介绍
在使用基于 RAG(检索增强生成)的应用时,一个挑战是处理重复提问的成本和延迟。每当用户提出问题时,整个流水线都需要重新执行,即使答案已经生成过。
在本文中,我们将探讨 语义缓存(Semantic Cache) 如何优雅且高效地解决这个问题。
什么是缓存?
缓存是一种高速存储,用于高效保存经常访问的数据。思路很简单:不必每次都重新计算或检索信息,而是把结果保存下来以供后续使用。
传统 RAG 与缓存的对比
在传统的 RAG 中,当用户提问时,系统会执行多个步骤:
- Embedding(对问题进行向量化)。
- 在 vector database(关键词、语义或混合)中搜索。
- 检索相关文档。
- 将上下文 + 提示词 + 问题发送给 LLM。
- 将答案返回给用户。
如果用户反复提出相同的问题,这整个过程会在每次请求时都重复执行,既耗时又花钱。
简单的键值缓存
我们可以把问题及其对应的答案存入一个简单的键值缓存:
- 键(Key):问题的原文。
- 值(Value):生成的答案。
示例:
- 问题:“巴西的首都是什么?”
- 答案:“巴西利亚。”
下次再问相同的问题时,直接从缓存中取回答案。
问题
即使是细微的表述差异也会产生不同的哈希值。
- “巴西的首都是什么?”
- “你能告诉我巴西的首都吗?”
虽然在语义上等价,键值缓存却无法识别。
语义缓存
为提升准确性,我们使用 语义缓存,它存储:
- 问题
- 答案
- 问题的 Embedding
当用户提出新问题时,我们在缓存中对 查询的 Embedding 与已存 Embedding 进行 语义搜索。如果相似度高于预设阈值,就返回对应的答案。
主要区别
| 特性 | 传统缓存(精确匹配) | 语义缓存 |
|---|---|---|
| 检索方式 | 完全匹配键 | 基于意义的检索(相似度) |
| 对变体的容忍度 | 不识别变体 | 能识别语义变体 |
| 示例 | “巴西的首都是什么?” → 对 “告诉我巴西的首都” 失效 | 两者均返回 “巴西利亚” |
为什么使用语义缓存?
- 降低成本:减少对 LLM API 的调用。
- 提升速度:对频繁查询实现即时响应。
- 保持一致性:对等价问题返回相同答案。
优化策略
- 临时补丁:识别高频问题并预先编写答案。
- 持久化:使用同一个 vector database(例如 Qdrant)同时存储文档和缓存。
操作流程
- 对问题进行 Embedding —— 无论是否使用缓存,都必须执行此步骤。
- 在语义缓存中搜索(比较 Embedding)。
- 若相似度超过阈值 → 返回缓存中的答案。
- 否则 → 继续完整的 RAG 流程。
- 存储:将新问题、对应答案以及 Embedding 保存到缓存,以便后续查询使用。
相似度度量
- 欧氏距离:数值越小,相似度越高(趋近于 0)。
- 余弦相似度:数值越大,相似度越高。
实际实现(简化示例)
def semantic_cache(query, cache_db, rag_pipeline, threshold=0.85):
# 1. Embedding da co
(代码保持不变)
nsulta
q_emb = embed(query)
# 2. 在缓存中进行语义搜索
similar, score = cache_db.search(q_emb, top_k=1)
if similar and score >= threshold:
return similar.answer # 缓存的答案
# 3. 传统 RAG 流程
docs = rag_pipeline.search(q_emb)
answer = rag_pipeline.generate(query, docs)
# 4. 保存到缓存
cache_db.upsert(query, answer, q_emb)
return answer
结论
Semantic Cache 提供了一种优雅的解决方案,能够降低成本、提升延迟并确保 RAG 系统的一致性。通过结合 embeddings 和语义搜索,我们可以在问题表述略有不同的情况下复用已生成的答案。这种方法在依赖频繁调用大型语言模型(LLM)的聊天机器人和问答(Q&A)应用中尤为有价值。
RAG 应用优化
强大的 RAG 应用优化工具 能够通过避免冗余处理,实现显著的时间和成本节约。关键在于理解语义等价的问题应返回相同的答案,即使它们以不同的方式表述。
Dev+ 高效生态系统
此内容是 Dev+ 高效 生态系统的一部分,由 Alberto、Maurício Aniche 和 Rafael Ponte 维护。该生态系统包括:
- Dev+ 高效之旅 – 旨在帮助您交付真正创造价值的软件,兼顾最高的质量和效率。
- 人工智能工程专精 – 与 Daniel Romero 合作,目标是实现卓越软件交付,将系统与大型语言模型(LLMs)集成。