语义缓存:如何使用语义缓存优化 RAG 应用

发布: (2026年1月5日 GMT+8 18:00)
7 min read
原文: Dev.to

Source: Dev.to

Disclaimer
此文本最初由生成式人工智能根据 Daniel Romero 频道的视频转录而创作(他是我们人工智能工程专业化的负责人)。如果您更喜欢观看视频,只需点击播放即可。

Source:

介绍

在使用基于 RAG(检索增强生成)的应用时,一个挑战是处理重复提问的成本和延迟。每当用户提出问题时,整个流水线都需要重新执行,即使答案已经生成过。

在本文中,我们将探讨 语义缓存(Semantic Cache) 如何优雅且高效地解决这个问题。

什么是缓存?

缓存是一种高速存储,用于高效保存经常访问的数据。思路很简单:不必每次都重新计算或检索信息,而是把结果保存下来以供后续使用。

传统 RAG 与缓存的对比

在传统的 RAG 中,当用户提问时,系统会执行多个步骤:

  1. Embedding(对问题进行向量化)。
  2. vector database(关键词、语义或混合)中搜索。
  3. 检索相关文档。
  4. 将上下文 + 提示词 + 问题发送给 LLM。
  5. 将答案返回给用户。

如果用户反复提出相同的问题,这整个过程会在每次请求时都重复执行,既耗时又花钱。

简单的键值缓存

我们可以把问题及其对应的答案存入一个简单的键值缓存:

  • 键(Key):问题的原文。
  • 值(Value):生成的答案。

示例:

  • 问题:“巴西的首都是什么?”
  • 答案:“巴西利亚。”

下次再问相同的问题时,直接从缓存中取回答案。

问题

即使是细微的表述差异也会产生不同的哈希值。

  • “巴西的首都是什么?”
  • “你能告诉我巴西的首都吗?”

虽然在语义上等价,键值缓存却无法识别。

语义缓存

为提升准确性,我们使用 语义缓存,它存储:

  • 问题
  • 答案
  • 问题的 Embedding

当用户提出新问题时,我们在缓存中对 查询的 Embedding 与已存 Embedding 进行 语义搜索。如果相似度高于预设阈值,就返回对应的答案。

主要区别

特性传统缓存(精确匹配)语义缓存
检索方式完全匹配键基于意义的检索(相似度)
对变体的容忍度不识别变体能识别语义变体
示例“巴西的首都是什么?” → 对 “告诉我巴西的首都” 失效两者均返回 “巴西利亚”

为什么使用语义缓存?

  • 降低成本:减少对 LLM API 的调用。
  • 提升速度:对频繁查询实现即时响应。
  • 保持一致性:对等价问题返回相同答案。

优化策略

  • 临时补丁:识别高频问题并预先编写答案。
  • 持久化:使用同一个 vector database(例如 Qdrant)同时存储文档和缓存。

操作流程

  1. 对问题进行 Embedding —— 无论是否使用缓存,都必须执行此步骤。
  2. 在语义缓存中搜索(比较 Embedding)。
    • 若相似度超过阈值 → 返回缓存中的答案。
    • 否则 → 继续完整的 RAG 流程。
  3. 存储:将新问题、对应答案以及 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+ 高效 生态系统的一部分,由 AlbertoMaurício AnicheRafael Ponte 维护。该生态系统包括:

  1. Dev+ 高效之旅 – 旨在帮助您交付真正创造价值的软件,兼顾最高的质量和效率。
  2. 人工智能工程专精 – 与 Daniel Romero 合作,目标是实现卓越软件交付,将系统与大型语言模型(LLMs)集成。

了解更多

🔗 了解更多关于人工智能工程专业化

Back to Blog

相关文章

阅读更多 »

RGB LED 支线任务 💡

markdown !Jennifer Davishttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex:我为何构建

介绍 大家好。今天我想分享一下我是谁、我在构建什么以及为什么。 早期职业生涯与倦怠 我在 17 年前开始我的 developer 生涯……