在边缘设备上部署大语言模型(LLM)和检索增强生成(RAG)系统,长期以来一直是个令人头疼的挑战——内存容量有限、算力资源紧张。传统RAG方案要求将整个嵌入向量数据库完整加载到内存中,这在边缘环境下几乎无法实现,极易引发内存抖动,导致系统性能急剧下降。最近读到一篇非常有启发性的研究:EdgeRAG,它提出了一套专为边缘设备设计的高效RAG方法,核心理念是“不存储所有向量,只在需要时才生成并缓存真正有用的嵌入”。实验结果表明,该方法能显著降低检索延迟,甚至能够支持远超物理内存容量的数据集,同时不牺牲检索与生成的质量。
论文链接:https://arxiv.org/pdf/2412.21023

简介
随着大语言模型和RAG技术的持续火热,将这类系统部署到资源有限的边缘设备中,已成为一项巨大的挑战——内存与计算能力是两大硬伤。传统RAG系统需要把整个嵌入向量数据库全量加载到内存中,这在边缘设备上几乎不可行,内存抖动和性能下降几乎不可避免。
那么,如何解决这一痛点?EdgeRAG提供了一种内存友好的解决方案:通过选择性存储,避免保存所有向量,仅保留在检索过程中真正会被用到的嵌入向量。与此同时,它配合自适应缓存策略,减少冗余计算,优化检索延迟。实验数据显示,EdgeRAG在保持检索和生成质量的前提下,大幅降低了检索延迟,并且支持的数据集规模可以超出内存容量——这一点对边缘场景而言至关重要。
方法
EdgeRAG的索引设计采用了一种高效的二级索引体系,兼顾了内存使用效率与在线计算能力。它基于传统的二级倒排文件(IVF)索引(见下图)。第一层始终驻留在内存中,主要存储聚类质心以及指向第二层索引的引用;第二层则包含文本块的引用和嵌入生成的延迟信息。
与传统方法不同,EdgeRAG并未存储所有文本块的嵌入,而是通过修剪嵌入、在检索过程中动态生成嵌入,仅存储计算成本较高的集群索引,从而优化性能、降低延迟。为了进一步提升效率,它还采用了选择性缓存策略:对于检索过程中生成的嵌入,优先缓存那些计算成本高的部分,利用缓存命中显著提升性能;而对于生成成本低、不会影响服务水平目标(SLOs)的嵌入,则选择不缓存,把空间留给更“昂贵”的嵌入。
下面梳理EdgeRAG的完整流程,包括索引构建、检索、插入和删除。
索引构建(EdgeRAG Indexing)
EdgeRAG基于传统IVF索引,但进行了多处优化。上图展示了索引构建的过程,具体步骤如下:
- 文本分块:将语料库切分成小块,便于管理和处理。
- 生成嵌入:为每个数据块生成嵌入向量,后续的聚类和检索都依赖这些向量。
- 聚类嵌入:对生成的嵌入向量进行聚类,降低索引复杂度、加快查询速度。
- 存储质心:将聚类得到的质心嵌入存入第一层索引,同时记录对第二层索引的引用。
- 分配嵌入到集群:每个数据块的嵌入归属到对应集群,并存储数据块的引用。
- 计算生成成本:评估每个数据块所需的嵌入生成成本,判断是否超出预设的服务等级目标(SLO)。
- 优化存储:
- 高成本嵌入:若生成成本超过SLO,则直接存储这些嵌入,避免未来重复计算。
- 低成本嵌入:若生成成本低于SLO,则丢弃这些嵌入,以节省存储空间。
检索过程(EdgeRAG Retrieval)
EdgeRAG在检索时结合了高效的嵌入加载与智能缓存策略。过程如下:
- 查询最相似的质心:根据查询嵌入,找到最匹配的集群质心。
- 检查预存嵌入:查看该集群是否已预先计算好嵌入。
- 若存在,直接加载。
- 若不存在,则进入下一步。
- 查找嵌入缓存:检查缓存中是否已存储相关嵌入。
- 缓存命中:直接从缓存加载,跳过生成步骤。
- 缓存未命中:进入下一步。
- 重新生成嵌入:若缓存未命中且无预存嵌入,则动态生成嵌入向量,并将其存入缓存以方便后续查询复用。
- 加载嵌入并检索数据块:加载嵌入后,找到最匹配的嵌入,进而检索对应的文本数据块。
插入和删除
插入
- 将新数据块的嵌入向量添加到最相似的簇中。
- 若添加后该簇的嵌入生成延迟超过SLO,则重新生成并存储该簇中所有数据块的嵌入向量。
删除
- 从所属的簇中移除待删除数据块的嵌入向量,并更新簇索引。
- 若移除后该簇的嵌入生成延迟低于SLO,则可删除该簇中所有数据块的嵌入向量,释放空间。
总结
EdgeRAG这项研究提出了一套新颖的RAG系统,核心目标在于解决边缘平台的内存限制问题。它通过修剪不必要的二级嵌入,在执行过程中有选择地存储或重新生成嵌入,并借助缓存机制最大限度减少冗余计算,从而优化了两级IVF索引。这样一来,即使数据集超出可用内存,RAG应用也能高效运行,为边缘计算场景下的RAG落地提供了切实可行的路径。
