MemoRAG是一种面向下一代RAG的革新框架,其核心设计围绕"全局记忆系统"展开,旨在突破传统RAG在模糊查询和非结构化知识处理上的局限。以下从三个维度解析其技术方案:
一、双系统架构设计
- 记忆-生成协同机制
采用轻量级LLM(如Qwen2-7B/Mistral-7B)构建全局记忆系统,通过token压缩技术(最高16倍)处理百万级上下文。记忆模块生成"答案线索"后,触发检索系统定位原始知识片段,再由高性能LLM(如Llama3-8B)完成最终生成。 -
动态记忆编码
在Transformer架构中引入专用记忆投影矩阵(W^Q_m, W^K_m, W^V_m),通过滑动窗口机制逐步将原始token转化为记忆token。每处理l个原始token后追加k个记忆token(k≪l),形成层次化记忆表征。 -
记忆生命周期管理
采用KV缓存淘汰策略:短期记忆(原始token的KV缓存)在处理后被丢弃,长期记忆通过专用权重矩阵持续更新。记忆token的注意力交互采用混合注意力机制,同时关注当前窗口和累积记忆缓存。
二、记忆优化技术
-
两阶段训练策略
- 预训练阶段:使用RedPajama长文本学习记忆压缩模式
- 精调阶段:通过任务特定数据(17k SFT样本)优化线索生成质量
- 记忆引导检索
设计线索生成模板:def generate_clues(memory, query): # 记忆模块生成初始线索 draft = memory_model(query, memory) # 线索重构模块生成可检索项 clues = rerank(draft, retrieval_corpus) return clues
支持生成替代查询、关键实体、推理步骤等多种线索形式,适配不同任务需求。
三、多场景适配机制
-
模糊查询解析
通过记忆引导的查询重写技术,将"书中如何表现爱情主题"等抽象查询,分解为具体线索(如"莉莉的牺牲"、"韦斯莱家族"),实现精准知识定位。 -
分布式证据聚合
采用多跳检索策略:- 首轮检索:基于全局记忆生成证据锚点
- 迭代检索:通过证据间的共现关系扩展检索范围
- 证据融合:构建知识图谱实现跨片段推理
- 长文档摘要优化
创新性引入"关键点-证据"二级架构:记忆模块生成摘要框架 → 检索系统填充细节证据 → 生成模块融合框架与证据
相比传统RAG直接检索,准确率提升9.7%(GovReport数据集)。
系统实现亮点
- 支持128K-1M token上下文处理
- 兼容稀疏/稠密/重排序多种检索方式
- 可在T4(16GiB)至A100(80GiB)多级硬件部署
- 开源模型支持Mistral/Qwen等基座,提供LangChain集成接口
该框架在ULTRADOMAIN基准上相比传统RAG平均提升9.7%,在百万token级教科书理解等场景展现显著优势。其核心创新在于将记忆系统从被动存储升级为主动推理引擎,为复杂知识任务提供了新的范式。
代码细节
基本思路是这样的,他们首先预训练了一个LLM,用来做memory。
在使用的时候,首先把所有的上下文都丢给这个LLM,然后把对应LLM的激活值保存下来,这里是kv cache。
* huggingface的模型提供管理kv cache的接口
然后在召回的时候,输入query+prompt,需要rag的doc,以及上面的kv cache。这样在做doc相关的计算的时候,效率就会比较快。
然后用prompt生成用于召回的线索。
其实上面这个cache相关的,应该和prefix cache什么的没啥区别。所以主要就是finetune了个模型,来针对长文本生成query相关的线索。
后续再和生成的线索一起,去做问答即可
他这里貌似还有另一种方式,叫做beacon。搜了下好像和这篇paper有关:Long Context Compression with Activation Beacon
有关训练方式:
* 每一个chunk编码成若干个memory token
* 训练的目的是,用最近的chunk+之前的memory token,来预测下一个token
* 问答的时候,用这个memory token作为输入,来生成clue
是个比较新颖的思路,感觉模型增强上下文也是类似的手段:
* 这里相当于在低层总结了chunk的信息,然后给到高层
* 高层再去根据低层的总结,形成长记忆
文章评论