下一代RAG:MemoRAG
MemoRAG是一個建立在高效、超長記憶模型之上的創(chuàng)新 RAG(Retrieval-Augmented Generation)框架,由智源研究院(北京人工智能研究院)與中國人民大學高瓴人工智能學院聯(lián)合推出并開源。
MemoRAG:通過記憶啟發(fā)的知識發(fā)現(xiàn)邁向下一代RAG,為 RAG 提供基于內(nèi)存的數(shù)據(jù)接口,適用于多種用途的應用程序!
MemoRAG與主要處理具有明確信息需求查詢的標準 RAG 不同,MemoRAG利用其記憶模型實現(xiàn)對整個數(shù)據(jù)庫的全局理解。通過從記憶中回憶與查詢相關(guān)的線索,MemoRAG增強了證據(jù)檢索,從而產(chǎn)生更準確、更豐富的上下文響應。
在處理需要對整個數(shù)據(jù)庫進行高級理解的查詢時,標準RAG與MemoRAG之間的比較,以《哈利·波特》書籍作為數(shù)據(jù)庫。左側(cè)圖,由于輸入查詢的隱含性質(zhì),標準RAG難以準確定位所需的證據(jù),導致答案不夠準確。右側(cè)圖,MemoRAG構(gòu)建了覆蓋整個數(shù)據(jù)庫的全局記憶。當提出查詢時,MemoRAG 首先回憶相關(guān)線索,使有用的信息得以檢索,從而得到一個精確且全面的答案。
MemoRAG特點
- 全局記憶:在單個上下文中處理高達100萬個token,為龐大的數(shù)據(jù)集提供全面的了解。
- 可優(yōu)化與靈活:輕松適應新任務,僅需幾個小時的額外訓練即可實現(xiàn)優(yōu)化性能。
- 上下文線索:從全局記憶中生成精確線索,將原始輸入與答案連接起來,并從復雜數(shù)據(jù)中解鎖隱藏的洞察。
- 高效緩存:通過支持緩存分塊、索引和編碼,將上下文預填充速度提高多達30倍。
- 上下文重用:一次性編碼長上下文,并支持重復使用,提高需要重復數(shù)據(jù)訪問的任務的效率。
在三個基準上測試了MemoRAG,使用了三種不同的生成器(Llama3-8B-Instruct-8K、Phi-3-mini-128K、Mistral-7B-Instruct-v0.2-32K),得出以下結(jié)論:
主要實驗結(jié)果。每個版塊中最好的結(jié)果以粗體顯示。這些實驗中使用的記憶模型是基于 Mistral-7B-Instruct-v0.2-32K 訓練的,可在 HuggingFace 上獲取。
- MemoRAG 在所有數(shù)據(jù)集上的表現(xiàn)都超過了所有基線模型,展示了其強大的領(lǐng)域泛化能力。
- 直接將完整上下文輸入到大型語言模型(LLMs)通常比其他 RAG 方法(BGE-M3、Stella-v5 和 HyDE)表現(xiàn)更好。這一發(fā)現(xiàn)揭示了標準 RAG 系統(tǒng)在處理長上下文和高級問題方面的困難。
- 相比之下,MemoRAG 一貫超越了直接使用完整上下文的性能,展示了其有效彌合處理超長上下文和解決復雜任務之間差距的能力。
- MemoRAG 在三個領(lǐng)域內(nèi)數(shù)據(jù)集上展示了卓越的性能,這表明其潛力可以通過更多樣化的訓練數(shù)據(jù)進一步增強。
MemoRAG使用
可以直接用 HuggingFace 模型初始化。通過該MemoRAG.memorize()方法,記憶模型可以在較長的輸入上下文中構(gòu)建全局記憶。
- TommyChien/memorag-qwen2-7b-inst可以處理最多400K個token的上下文,
- TommyChien/memorag-mistral-7b-inst可以管理最多128K個token的上下文。
- 通過增加參數(shù)beacon_ratio,可以擴展模型處理更長上下文的能力。例如,TommyChien/memorag-qwen2-7b-inst可以處理最多一百萬個tokenbeacon_ratio=16。
from memorag import MemoRAG
# Initialize MemoRAG pipeline
pipe = MemoRAG(
mem_model_name_or_path="TommyChien/memorag-mistral-7b-inst",
ret_model_name_or_path="BAAI/bge-m3",
gen_model_name_or_path="mistralai/Mistral-7B-Instruct-v0.2", # Optional: if not specify, use memery model as the generator
cache_dir="path_to_model_cache", # Optional: specify local model cache directory
access_token="hugging_face_access_token", # Optional: Hugging Face access token
beacon_ratio=4
)
context = open("examples/harry_potter.txt").read()
query = "How many times is the Chamber of Secrets opened in the book?"
# Memorize the context and save to cache
pipe.memorize(context, save_dir="cache/harry_potter/", print_stats=True)
# Generate response using the memorized context
res = pipe(cnotallow=context, query=query, task_type="memorag", max_new_tokens=256)
print(f"MemoRAG generated answer: \n{res}")
運行上述代碼時,編碼后的鍵值 (KV) 緩存、Faiss 索引和分塊段落都存儲在指定的 中save_dir。之后,如果再次使用相同的上下文,則可以快速從磁盤加載數(shù)據(jù):
pipe.load("cache/harry_potter/", print_stats=True)
通常,加載緩存權(quán)重非常高效。例如,使用內(nèi)存模型對200K令牌上下文進行編碼、分塊和索引大約需要35秒,但從緩存文件加載時只需1.5秒。
摘要任務
要執(zhí)行摘要任務,請使用以下腳本:
res = pipe(cnotallow=context, task_type="summarize", max_new_tokens=512)
print(f"MemoRAG summary of the full book:\n {res}")
https://github.com/qhjqhj00/MemoRAG
https://arxiv.org/pdf/2409.05591
MemoRAG: Moving Towards Next-Gen RAG Via Memory-Inspired Knowledge Discovery
本文轉(zhuǎn)載自??PaperAgent??
