LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略

news2024/11/18 18:30:10

LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略

目录

MemoRAG的简介

0、更新日志

1、特性

2、路线图

MemoRAG的安装和使用方法

1、安装

安装依赖项

T1、从源码安装

T2、通过pip安装

2、使用方法

MemoRAG的Lite模式

MemoRAG的基本使用

使用长LLM作为记忆模型

摘要任务

使用API作为生成器

支持的生成器API

记忆模型的使用

记忆增强检索的使用

基准评估

评估

数据集

3、MemoRAG演示

T1、脚本演示

T2、在Google Colab上免费试用MemoRAG

MemoRAG的案例应用


MemoRAG的简介

MemoRAG:通过记忆启发的知识发现迈向下一代RAG为RAG赋予基于记忆的数据接口,适用于各种用途的应用!

MemoRAG是一个建立在高效、超长记忆模型之上的创新RAG框架。与主要处理具有明确信息需求查询的标准RAG不同,MemoRAG利用其记忆模型来实现对整个数据库的全局理解。通过从记忆中回忆特定于查询的线索,MemoRAG增强了证据检索,从而生成更准确且上下文丰富的响应。

GitHub地址:GitHub - qhjqhj00/MemoRAG: Empowering RAG with a memory-based data interface for all-purpose applications!

0、更新日志

[21/09/24] MemoRAG引入了Lite模式,只需几行代码即可启用针对数百万个token的记忆增强型RAG处理。更多细节请参阅示例笔记本。
[13/09/24] MemoRAG增加了Meta-Llama-3.1-8B-Instruct和Llama3.1-8B-Chinese-Chat作为记忆模型,请参见示例。
[10/09/24] 我们发布了MemoRAG的技术报告。
[09/09/24] 您可以在Google Colab上免费试用MemoRAG。
[05/09/24] 可以在TommyChien/memorag-qwen2-7b-inst获取基于Qwen2的记忆模型
[03/09/24] 可以在TommyChien/memorag-mistral-7b-inst获取基于Mistral的记忆模型
[01/09/24] 项目启动!

1、特性

>> 全局记忆:单个上下文中处理多达一百万个token,提供对大量数据集的全面理解。
>> 优化&灵活:轻松适应新任务,仅需几个小时的额外训练即可达到优化性能。
>> 上下文线索:从全局记忆生成精确线索,将原始输入与答案联系起来,并解锁复杂数据中的隐藏见解。
>> 高效缓存:加快上下文预填充速度达30倍,支持缓存分块、索引和编码。
>> 上下文重用:一次编码长上下文并支持重复使用,在需要反复访问数据的任务中提高效率。

2、路线图

MemoRAG目前正处于积极开发阶段,资源和原型会持续发布在这个仓库中。
代码 / 模型 / 数据集发布
支持OpenAI/Azure模型
技术报告发布
支持中文
演示代码发布
记忆模型训练代码发布
轻量化优化
加速推理
集成任何检索方法
丰富记忆能力

注意:MemoRAG近期的目标是通过工程改进实现轻量化优化,并增强其记忆能力,使其能够适应更广泛的应用并支持更长的上下文(例如超过一百万个token)。

MemoRAG的安装和使用方法

1、安装

要使用Memorizer和MemoRAG,您需要安装Python以及所需的库。可以使用以下命令安装必要的依赖项:

安装依赖项

pip install torch==2.3.1
conda install -c pytorch -c nvidia faiss-gpu=1.8.0
T1、从源码安装

首先克隆此仓库

cd MemoRAG
pip install -e .

T2、通过pip安装

pip install memorag

对于快速开始,我们提供了一个笔记本,用于说明MemoRAG的所有功能。

2、使用方法

MemoRAG的Lite模式

我们介绍了MemoRAG的Lite模式,旨在为MemoRAG管道提供快捷友好的体验。只需几行代码,您就可以轻松尝试MemoRAG。虽然建议从拥有24GiB内存的GPU开始,但在大多数情况下,默认设置下16GiB GPU也能处理该管道。

from memorag import MemoRAGLite
pipe = MemoRAGLite()
context = open("examples/harry_potter.txt").read()
pipe.memorize(context, save_dir="harry_potter", print_stats=True)

query = "What's the book's main theme?"
print(pipe(query))

MemoRAG Lite易于使用,支持多达数百万token的英文或中文上下文。虽然它可能与其他语言一起工作,但性能可能会下降,因为默认提示是英文的。关于MemoRAG Lite的更多详情,请参阅示例笔记本。

MemoRAG的基本使用

MemoRAG易于使用,可以直接使用HuggingFace模型初始化。通过使用MemoRAG.memorize()方法,记忆模型会在较长的输入上下文中构建全局记忆。根据经验,使用默认参数设置时,TommyChien/memorag-qwen2-7b-inst可以处理高达400K token的上下文,而TommyChien/memorag-mistral-7b-inst可以管理高达128K token的上下文。通过增加beacon_ratio参数,可以扩展模型处理更长上下文的能力。例如,当beacon_ratio=16时,TommyChien/memorag-qwen2-7b-inst可以处理高达一百万个token。

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(context=context, query=query, task_type="memorag", max_new_tokens=256)
print(f"MemoRAG generated answer: \n{res}")

运行上述代码时,编码后的键值(KV)缓存、Faiss索引和分块段落将存储在指定的save_dir中。之后,如果再次使用相同的上下文,则可以从磁盘快速加载数据:

pipe.load("cache/harry_potter/", print_stats=True)

通常,加载缓存权重是非常高效的。例如,使用TommyChien/memorag-qwen2-7b-inst作为记忆模型时,编码、分块和索引200K-token上下文大约需要35秒,但从缓存文件加载只需要1.5秒。

使用长LLM作为记忆模型

最近的LLM由于它们不断扩大的上下文窗口,已经成为了有效的记忆模型。MemoRAG现在支持利用这些长上下文LLM作为记忆模型,并利用MInference优化上下文预填充。我们测试了Meta-Llama-3.1-8B-Instruct和Llama3.1-8B-Chinese-Chat作为记忆模型,两者都原生支持128K的上下文长度。我们目前正在探索其他合适的LLM并优化策略以进一步增强记忆机制和上下文长度。有关详细使用说明,请参阅提供的脚本和笔记本:

from memorag import MemoRAG
model = MemoRAG(
    mem_model_name_or_path="shenzhi-wang/Llama3.1-8B-Chinese-Chat",    # For Chinese
    # mem_model_name_or_path="meta-llama/Meta-Llama-3.1-8B-Instruct",  # For English
    ret_model_name_or_path="BAAI/bge-m3",
    # cache_dir="path_to_model_cache",  # to specify local model cache directory (optional)
    # access_token="hugging_face_access_token"  # to specify local model cache directory (optional)
    )

之后,您可以像往常一样使用MemoRAG的功能。

摘要任务

要执行摘要任务,请使用以下脚本:

res = pipe(context=context, task_type="summarize", max_new_tokens=512)
print(f"MemoRAG summary of the full book:\n {res}")

使用API作为生成器

如果您想使用API作为生成器,请参考下面的脚本:

from memorag import Agent, MemoRAG

# API configuration
api_dict = {
    "endpoint": "",
    "api_version": "2024-02-15-preview",
    "api_key": ""
}
model = "gpt-35-turbo-16k"
source = "azure"

# Initialize Agent with the API
agent = Agent(model, source, api_dict)
print(agent.generate("hi!"))  # Test the API

# Initialize MemoRAG pipeline with a customized generator model
pipe = MemoRAG(
    mem_model_name_or_path="TommyChien/memorag-qwen2-7b-inst",
    ret_model_name_or_path="BAAI/bge-m3",
    cache_dir="path_to_model_cache",  # Optional: specify local model cache directory
    customized_gen_model=agent,
)

# Load previously cached context
pipe.load("cache/harry_potter_qwen/", print_stats=True)

# Use the loaded context for question answering
query = "How are the mutual relationships between the main characters?"
context = open("harry_potter.txt").read()

res = pipe(context=context, query=query, task_type="memorag", max_new_tokens=256)
print(f"MemoRAG with GPT-3.5 generated answer: \n{res}")

支持的生成器API

内置的Agent对象支持来自openai和deepseek的模型。以下是初始化这些模型的配置:

# Using deepseek models
model = ""
source = "deepseek"
api_dict = {
    "base_url": "",
    "api_key": ""
}

# Using openai models
model = ""
source = "openai"
api_dict = {
    "api_key": ""
}

记忆模型的使用

记忆模型可以独立使用来存储、回忆和交互上下文。这里有一个例子:

from memorag import Agent, MemoRAG

# API configuration
api_dict = {
    "endpoint": "",
    "api_version": "2024-02-15-preview",
    "api_key": ""
}
model = "gpt-35-turbo-16k"
source = "azure"

# Initialize Agent with the API
agent = Agent(model, source, api_dict)
print(agent.generate("hi!"))  # Test the API

# Initialize MemoRAG pipeline with a customized generator model
pipe = MemoRAG(
    mem_model_name_or_path="TommyChien/memorag-qwen2-7b-inst",
    ret_model_name_or_path="BAAI/bge-m3",
    cache_dir="path_to_model_cache",  # Optional: specify local model cache directory
    customized_gen_model=agent,
)

# Load previously cached context
pipe.load("cache/harry_potter_qwen/", print_stats=True)

# Use the loaded context for question answering
query = "How are the mutual relationships between the main characters?"
context = open("harry_potter.txt").read()

res = pipe(context=context, query=query, task_type="memorag", max_new_tokens=256)
print(f"MemoRAG with GPT-3.5 generated answer: \n{res}")

记忆增强检索的使用

除了独立的记忆模型之外,MemoRAG还提供了记忆增强检索功能。这允许基于从记忆中回忆起的线索来改善证据检索。

from memorag import MemoRAG

# Initialize MemoRAG pipeline
pipe = MemoRAG(
    mem_model_name_or_path="TommyChien/memorag-qwen2-7b-inst",
    ret_model_name_or_path="BAAI/bge-m3",
    cache_dir="path_to_model_cache",  # Optional: specify local model cache directory
    access_token="hugging_face_access_token"  # Optional: Hugging Face access token
)

# Load and memorize the context
test_txt = open("harry_potter.txt").read()
pipe.memorize(test_txt, save_dir="cache/harry_potter/", print_stats=True)

# Define the query
query = "How are the mutual relationships between the main characters?"

# Recall clues from memory
clues = pipe.mem_model.recall(query).split("\n")
clues = [q for q in clues if len(q.split()) > 3]  # Filter out short or irrelevant clues
print("Clues generated from memory:\n", clues)

# Retrieve relevant passages based on the recalled clues
retrieved_passages = pipe._retrieve(clues)
print("\n======\n".join(retrieved_passages[:3]))

基准评估

以下是结合三种生成模型对记忆模型进行实验的结果。我们在三个基准上测试了MemoRAG。每个区块的最佳结果已加粗显示。

DatasetNarrativeQAQasperMultifieldQAMusique2WikiHotpotQAMultiNewsGovReportEn.sumEn.qaFinLegalMix
LongBenchInfBenchUltraDomain
Generator: Llama3-8B-Instruct-8K
Full21.343.446.623.538.247.124.623.613.16.734.233.242.7
BGE-M322.144.350.222.236.748.422.120.112.115.141.440.646.4
Stella-v512.335.244.422.133.341.922.120.711.714.841.933.744.9
RQ-RAG20.243.949.122.736.144.520.621.012.013.339.536.844.5
HyDE22.144.350.222.236.748.4---19.141.440.646.4
MemoRAG22.845.750.728.451.457.027.427.914.116.147.847.955.5
Generator: Phi-3-mini-128K
Full21.435.047.319.035.542.125.623.713.015.244.840.544.7
BGE-M320.333.044.321.135.442.117.719.89.616.341.741.243.7
Stella-v513.732.443.521.035.640.620.318.210.019.542.835.143.9
RQ-RAG19.634.146.521.936.141.720.118.610.416.141.840.943.2
HyDE18.736.047.520.536.842.7---19.643.141.644.2
MemoRAG27.543.952.233.954.154.832.926.315.722.951.551.055.6
Generator: Mistral-7B-Instruct-v0.2-32K
Full20.829.246.318.920.637.623.020.412.412.336.535.842.1
BGE-M317.329.546.318.520.336.224.326.113.512.240.542.041.1
Stella-v513.523.742.118.622.231.921.118.513.29.740.934.942.1
RQ-RAG17.129.247.019.121.537.022.118.613.112.744.344.643.4
HyDE17.429.546.318.520.136.2---12.242.835.143.9
MemoRAG23.131.250.026.930.342.927.131.617.915.448.051.253.6
MemoRAG-qwen222.232.749.631.433.744.427.031.516.817.648.752.348.6

评估

要评估MemoRAG,请使用以下脚本:

cd examples
bash longbench/eval.sh

我们将很快更新其他评估脚本。

数据集

UltraDomain基准: this repo.

其他评估数据: this repo.

3、MemoRAG演示

T1、脚本演示

我们将提供一个玩具演示来展示MemoRAG的功能,您可以使用以下脚本进行尝试:

streamlit run demo/demo.py

之后,您可以看到如下所示的演示

T2、在Google Colab上免费试用MemoRAG

您可以直接在Google Colab上免费试用MemoRAG。

地址:https://colab.research.google.com/drive/1fPMXKyi4AwWSBkC7Xr5vBdpPpx9gDeFX?usp=sharing

在此笔记本中,我们在由Google Colab提供的具有15GiB内存的单一T4 GPU上运行完整的MemoRAG管道(记忆模型+检索器+生成模型)。尽管资源有限,MemoRAG仍能处理示例书籍内容的大约一半(~68K token),并执行所有功能。

MemoRAG的案例应用

持续更新中……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可调节基准电压电路设计

1 简介 该电路组合使用了一个放大器,可使基准电压电路在输入电压负值至正的输入电压之间的范围内进行调节,且可增加增益以提高最大负基准电压电平。 2 设计目标 2.1 输入 2.2 输出 ​​​ 2.3 电源 3 电路设计 根据设计目标,最终设计的电…

综合实验1 利用OpenCV统计物体数量

一、实验简介 传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开并计数。本实验巩固对OpenCV的基础操作的使用,适当的增加OpenCV在图像处…

抽奖拼团卷轴模式系统开发小程序源代码解析

在当今的互联网商业环境中,抽奖、拼团与卷轴模式等创新玩法被广泛应用于小程序开发中,旨在通过多样化的互动方式吸引用户参与,提升用户粘性和平台活跃度。本文将围绕“抽奖拼团卷轴模式系统开发小程序源代码”这一主题,探讨其技术…

【HTTP协议详解-Fiddler抓包工具安装详解-HTTP报文格式-URL详解】

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 &#x1f52d…

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境,并且有一个可以控制的机器人接口。 一、手部姿态重定向介绍 …

18924 二叉树的宽度

### 思路 1. 使用广度优先搜索(BFS)遍历二叉树,记录每一层的节点数。 2. 使用队列来实现BFS,队列中存储节点和其对应的层数。 3. 在遍历过程中,更新每一层的节点数,并记录最大节点数。 ### 伪代码 1. 定义…

uni-app - - - - -vue3使用i18n配置国际化语言

uni-app - - - - -使用i18n配置国际化语言 1. 安装vue-i18n2. 配置文件2.1 创建如下文件2.2 文件配置2.3 main文件导入i18n 3. 页面内使用3.1 template内直接使用3.2 变量接收使用 1. 安装vue-i18n npm install vue-i18n --save2. 配置文件 2.1 创建如下文件 locales文件夹里…

__has_include 报错

作用: 在C或C的预处理阶段,__has_include 是一个编译器特定的宏,主要用于检查编译器是否能够包含指定的头文件。这个宏在Clang和GCC(从某个版本开始)等编译器中可用,但在所有编译器中可能并不都支持…

气膜乒乓球馆的前景展望—轻空间

乒乓球作为我国的国球,在全球范围内始终保持领先地位,不仅是国民心中的重要运动,也在国际舞台上占据了举足轻重的地位。气膜乒乓球馆作为一种创新的体育设施,通过结合先进的气膜技术与传统乒乓球运动,为爱好者提供了一…

Heart Animated 写实心脏模型素材带动画医学

心脏动画: 解剖细节逼真的心脏。 此资源包含高质量着色全色HD中的所有纹理,并使用HD中的凹凸贴图(NORMALMASP)。所有Prefab Ready均适用于游戏、应用程序和VR应用程序。预制件已准备好位置和旋转0,0,0。拖动到场景时。 还具有完整的心动周期。 Tris=约81 k。 顶点=约51 k …

关于如何使用终端查看类的布局教程

在继承章节我们使用了vs提供的终端查看类之间的继承模型,在后续多态的学习过程中,我们也将继续使用该方法去查看虚表等信息。 第一步:打开VS提供的终端窗口: 第二步:获取需要查看的类所在的源文件的地址: …

TypeScript 设计模式之【迭代器模式】

文章目录 迭代器模式:优雅遍历集合的智能书签迭代器模式的奥秘迭代器模式有什么利与弊?如何使用迭代器模式来优化你的数据遍历代码实现案例迭代器模式的主要优点迭代器模式的主要缺点迭代器模式的适用场景总结 迭代器模式:优雅遍历集合的智能书签 你是…

运维工具之adb命令安装和使用

一、adb命令简介 ADB(Android Debug Bridge)是 Android 开发者工具包中的一个命令行工具,主要用于在开发、调试和测试 Android 应用时与 Android 设备进行交互。通过 ADB 工具,开发者和用户可以从电脑对 Android 设备执行各种操作…

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【递归】5.leetcode 872 叶子相似的树

1 题目描述 题目链接:叶子相似的树 2 解答思路 递归分为三步,接下来就按照这三步来思考问题 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (关…

Swoole的多进程模块

Swoole是有自己的一个进程管理模块,用来替代PHP的pcntl扩展,需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大,另外创建的进程过多会导致进程切换开销大幅上升。 为什么不使用pcntl 1.pcntl没有提供进程间通信的功能…

AI智能眼镜_带摄像头的AI智能眼镜,AI大模型落地的载体

随着科技的迅猛发展,AI智能眼镜汇聚了众多硬件的优势,成为现代生活中不可或缺的一部分。这种创新设备不仅内嵌了耳机、摄像头以及WiFi和蓝牙模块等核心硬件,还具备了音频播放、图像拍摄和无线通信等多种功能,极大地提升了信息获取…

深度学习经典模型之BERT(上)

深度学习经典模型之BERT(下) BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 。由Google公司的…

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期:ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另:报错1-Error: Type mismatch between actual argument at (1) and a…