无需检索!CAG 通过键值缓存让 RAG 轻松上手
随着大模型技术的不断发展,尤其是大模型上下文窗口(context window)逐渐增大的趋势,许多研究者开始思考是否可以借此特点简化传统的 RAG(Retrieval-Augmented Generation)架构。在此背景下,2024年12月的研究论文提出了一个创新方案——CAG(Cache-Augmented Generation),这是一种通过预加载外部文档到大模型的上下文窗口来简化传统 RAG 流程的方法。本文将详细介绍 CAG 的特点、工作原理、实验结果、适用场景以及如何快速上手。
1. RAG 的天生不足之处
尽管RAG在理论上能够通过引入外部知识提高生成能力,但它在实际应用中面临的挑战不可忽视:
- 延迟高和复杂度大:RAG依赖于实时检索过程,需要在查询时进行向量搜索、排序、选择相关文档等复杂操作。这些操作不仅增加了计算负担,还导致了响应时间的延长,尤其是在面对大规模文档库时。
- 安全隐患:为了提升检索的准确性,RAG通常将外部文档转化为向量并存储在向量数据库中。然而,这种做法可能会导致敏感信息泄漏的风险,特别是在涉及个人隐私或商业机密的数据时。
- 依赖第三方向量存储:许多RAG实现依赖于商业化的向量数据库和嵌入生成服务,这些服务的使用可能导致商业偏见,并带来额外的成本和数据隐私问题。
鉴于这些问题,研究者们开始探索一种更加简化且高效的替代方案——CAG。
2. CAG 简介
CAG(Cache-Augmented Generation)是一种基于大模型上下文窗口扩展特性的RAG优化方案,通过预加载相关文档并生成键值缓存(KV Cache),消除了传统RAG中的实时检索环节。这一过程将外部知识直接集成到模型的工作内存中,从而减少了延迟,提高了系统的整体效率。
2.1 基本特点
CAG的核心思想在于预加载相关文档并将其转化为键值缓存(KV Cache),然后将缓存数据与用户查询一同传递给大模型。这样,在推理时,模型能够直接利用预先加载的知识进行生成,无需进行实时检索和向量搜索。
- 简化架构:CAG不需要构建复杂的向量空间或检索组件,从而大大简化了系统架构。
- 消除延迟:通过预先处理并缓存相关文档,CAG避免了检索过程的延迟,提升了响应速度。
- 增强安全性:敏感数据可以存储在安全的数据库中,而不是转化为向量,这减少了数据泄露的风险。
2.2 工作原理
CAG的工作原理可以分为三个阶段:
- 外部知识预加载:在这一阶段,相关领域的文档被预处理并格式化为适应大模型上下文窗口的形式。大模型将这些文档编码成键值对(KV Cache),并将其存储以供后续使用。该过程的计算成本只发生在文档处理时,之后的查询可以直接利用缓存。
- 推理:在推理阶段,预先计算的键值缓存与用户的查询一同加载到模型中,模型利用这些缓存的上下文生成响应。这一过程不再依赖实时检索,极大减少了延迟并降低了数据选择错误的风险。
- 缓存重置:为了保持系统性能,缓存可以在多个推理会话后高效重置。由于KV Cache是按追加方式增长的,重置操作只需截断新增的令牌,而无需重新加载整个缓存。
传统 RAG 和 CAG 工作流程的比较:上部说明了 RAG 管道,包括推理过程中的实时检索和参考文本输入,而下部描述了 CAG 方法,该方法预加载 KV 缓存,从而消除了推理时的检索步骤和参考文本输入。
2.3 优点
- 提升效率:通过预加载和缓存外部知识,CAG消除了实时检索过程,显著提高了计算效率。
- 增强安全性:敏感数据存储在安全数据库中,而非嵌入到向量空间,降低了数据泄露的风险。
- 简化架构:无需构建复杂的向量检索和存储组件,系统架构更加简洁。
- 减少延迟:通过避免实时操作,CAG减少了推理延迟,提高了响应速度。
3. 实验结果及适用场景
为了验证CAG的效果,研究者们对其进行了大量实验,比较了CAG与传统RAG(基于BM25的稀疏检索和OpenAI的密集检索)的性能。
3.1 实验结果
- 数据集:使用了SQuAD 1.0和HotPotQA数据集,这两个数据集包含了多种不同难度的问答任务。
- 评估指标:采用BERTScore作为评估指标,用于比较生成文本与真实答案的相似度。
- 实验结果:
性能优越:CAG在大多数测试中超越了传统的RAG方法,特别是在HotPotQA数据集上,CAG凭借全量上下文理解的优势,表现明显优于基于检索的RAG。
推理时间缩短:由于不再需要实时检索,CAG显著降低了推理时间,特别是在面对大规模文档时的响应速度明显提高。
BERTScore表现:CAG在大部分情况下的BERTScore优于传统RAG系统,证明了其在生成准确性上的优势。
CAG在大多数测试中超越了传统的RAG方法
3.2 适用场景
CAG尤其适用于知识库有限且文档量可控的任务。对于文档集较小、内容相对固定的应用场景,CAG能够显著提升性能,并简化系统架构。
- 约束性知识库:对于某些任务,知识库大小适中且固定,可以直接加载到大模型的上下文窗口中,这时CAG表现出色。
- 混合方法:对于需要全面知识和适应特定查询的任务,CAG还可以与检索机制结合使用,通过预加载基础上下文并结合选择性检索来应对特定问题。
4. 快速上手
想要快速体验CAG,可以按照以下步骤进行:
安装依赖
pip install -r ./requirements.txt
准备数据
# 下载所需的数据集
sh ./downloads.sh
配置环境
# 复制并配置环境文件
cp ./.env.template ./.env
运行实验
-
rag.py
:用于传统RAG实验。 -
kvcache.py
:用于CAG实验。
5. 结论及展望
CAG作为RAG的简化替代方案,特别适合在知识库有限且可控的场景下应用。通过预加载和缓存外部知识,CAG不仅消除了实时检索带来的延迟,还减少了系统复杂度,并提升了计算效率。在未来,随着大模型上下文窗口的不断扩展,CAG的优势将更加明显,尤其是在处理大规模知识库和长文本时。
随着技术的不断进步,CAG将成为大模型技术中的重要组成部分,提供更加高效、安全和简洁的解决方案。在不久的将来,我们可能会看到CAG与更多先进技术的结合,为实际应用带来更强大的智能服务。