多模态RAG:通用框架方案调研汇总

阅读原文
多模态检索增强生成是一种新兴的设计范式,允许AI模型与文本、图像、视频等存储进行交互。在介绍多模态 RAG 之前,我们先简单了解一下传统的检索增强生成 (RAG)。

标准 RAG

RAG 的理念是找到与用户查询相关的核心信息,然后将该信息注入Prompt中并将其传递给大语言模型(LLM)从而生成回答。

RAG 系统的检索通常是通过Embedding来实现的。为了对某些内容进行Emebdding,通常使用复杂的 AI 模型将信息转换为纯数字的向量。

检索过程基于一组候选文档和用户query,通过计算它们的向量相似度来完成,与用户query距离最小的文档则被视是为最相关的。 一旦 RAG 系统检索到足够的相关信息,就会使用用户query和相关文档来构建增强的Prompt,然后将其传递给LLM进行生成。

"Answer the customers prompt based on the following context:
==== context: {document title} ====
{the most relevant document content retrievaled by RAG}

...

prompt: {prompt}"

这种通用系统通常假设整个知识库由文本组成,但许多知识来源不止文本,可能还有音频、视频、图像等,这就是多模态 RAG(Multimodal RAG) 的作用所在。

在讨论多模态 RAG 之前,让我们先简单探讨一下多模态的概念。

多模态

在数据科学中,“模态”本质上是一种数据类型。文本、图像、音频、视频、表格,这些都可以被视为不同的“模态”。这些能够理解多种类型数据的模型通常被称为“多模态模型”。

多模态模型的理念通常围绕“联合Embedding”这一理念展开。联合Embedding是一种建模策略,它迫使模型同时学习不同类型的数据。该领域的一篇里程碑式论文是 CLIP,它创建了一个能够执行与图像和文本相关的任务的强大的多模态模型。自 CLIP 以来,已经出现了各种建模策略,以某种方式对齐图像和文本。

多模态RAG

多模态 RAG 的理念是允许 RAG 系统以某种方式将多种模态的信息注入多模态模型。因此,多模态 RAG 系统不仅可以根据用户问题检索文本片段,还可以检索图像、视频和其他不同模态的数据。

### 关于多模态RAG开源框架 #### Haystack Haystack是一个全面而成熟的框架,支持多种数据类型的处理,包括文本、表格以及多媒体文件。对于希望构建复杂应用的开发者来说,这是一个理想的选择[^1]。 ```python from haystack.nodes import BM25Retriever, EmbeddingRetriever from haystack.document_stores import InMemoryDocumentStore document_store = InMemoryDocumentStore() retriever_text = BM25Retriever(document_store=document_store) retriever_image = EmbeddingRetriever(document_store=document_store, embedding_model="sentence-transformers/clip-ViT-B-32") ``` #### FlashRAG 作为一款新兴的专业框架,FlashRAG专注于高效能的数据检索与生成能力,在处理大规模数据集方面表现出色。该工具特别适合那些追求速度和效率的应用场景。 #### 使用LLMM构建自定义系统 除了上述提到的成熟框架外,还可以基于开源大型语言多模态模型(LLMM),通过集成ChromeDB和HuggingFace来创建定制化的多模态RAG系统。这种方法提供了极大的灵活性,使开发人员可以根据具体需求调整系统的各个组件[^3]。 ```bash pip install chromadb transformers torch ``` ```python import torch from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") def encode_images(image_paths): images = [Image.open(path).convert('RGB') for path in image_paths] inputs = processor(images=images, return_tensors='pt') outputs = model.get_image_features(**inputs) return outputs / outputs.norm(p=2, dim=-1) encoded_images = encode_images(["path/to/image1.jpg", "path/to/image2.png"]) print(encoded_images.shape) # 输出形状为(batch_size, hidden_dim) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值