
多模态检索增强生成 (MM-RAG) 扩展了传统 检索增强生成 (RAG) 系统从仅文本模态到其他模态的能力,例如图像、音频和视频。多模态方面指的是带有 多模态嵌入模型 的检索管道和带有多模态生成模型(例如视觉语言模型)的生成管道。
普通人一生大约会听到并学习大约 10 亿个单词。这可能是一个过高的估计,但它大致正确,因为 10 亿秒大约是 30 年,而且我们每秒不会听到超过几个词。考虑到睡眠、饮食和其他活动,进行一些粗略计算,我们可以得出上述数字。
然而,问题在于当前的大型语言模型 (LLM) 接受了数万亿个 token 的训练,比我们一生中见过的多得多。然而,它们仍然没有像我们一样生动地理解世界中存在的因果关系。由此,我们可以推断人类的学习方式与我们当前最先进的模型学习方式根本不同。人类具有通过整合多种感官输入来学习和构建世界模型的非凡能力。我们的感官结合协同工作,为我们提供关于我们周围环境的丰富而多样化的信息。通过结合和解释这些感官输入,我们可以形成对世界的连贯理解,做出预测,获取新知识,并有效地建立因果关系。人类不仅捕捉和使用信息的多种模态表示,而且在给定任务时,我们还可以将任何这些模态作为上下文来帮助我们指导我们的答案。
如果您想进一步探索这种思考方式以及在利用多模态数据时需要解决的潜在问题,请查看我之前的 关于多模态嵌入模型的博客。
在这篇文章中,我们将讨论
- 对比学习: 一种训练多模态嵌入模型以理解图像、音频、视频、文本等的方法
- 任意到任意搜索和检索: 使用多模态嵌入模型执行任意到任意搜索,并使用像 Weaviate(附带代码示例!)这样的 向量数据库 将这些多模态嵌入扩展到生产环境。
- 多模态检索增强生成 (MM-RAG): 通过图像和其他多模态信息的检索来增强大型多模态模型 (LMM) 的生成,用于视觉问答系统。
- RAG 代码演示
通过对比学习的联合嵌入空间
训练能够理解多模态数据(包括图像、音频、视频和文本)的模型的一种方法是首先训练能够单独理解这些模态的模型,然后使用称为对比训练的过程来统一它们的表示形式。
对比训练通过将来自不同模态的概念上不同的嵌入推开,或将相似的嵌入拉近,来统一模型的向量空间表示。下图演示了这一点
MetaAI 的 ImageBind 论文 将此过程应用于统一来自 6 个不同模态的向量空间,包括图像、文本、音频和视频。为了成功执行对比训练,他们使用了来自多个模态的带正标签数据集,并随机采样负标签点。
为了更好地直观地理解这个过程是如何工作的,想象一下您使用视觉模型将狮子的图像嵌入到向量空间中。这个对象的概念与狮子咆哮的音频相似,因此音频对象嵌入可以用作正样本,对比损失函数的作用是将这两个点在嵌入空间中拉近。另一方面,沙拉图像是一个负样本,因此需要将其推开。请查看修改后的上述视觉效果,以考虑跨模态对比训练
如果我们能够对足够大的带标签数据集持续执行此操作,那么我们就可以收紧嵌入空间中的数据对象表示,甚至统一不同模态的模型。ImageBind 的另一个好处是使用冻结的图像模型表示来通过跨模态对比损失训练绑定其他模态。这就是它被称为 ImageBind 的原因。从不同的起点开始的嵌入然后可以被拉向图像表示。因此,所有模态中的相似概念都可以统一,以便所有模态中的概念都将具有相似的向量——下图演示了这一点。要更深入地了解对比表示学习,我建议您阅读这篇 博客。
显示了一个统一的嵌入模型,它捕获了在对比训练步骤期间融合的含义。
任意到任意搜索
一旦我们有了统一的嵌入空间,我们就可以执行跨模态对象操作,例如跨模态搜索和检索。这意味着我们可以将模型理解的任何模态作为查询传入,并在多模态嵌入空间中执行 向量相似性搜索,从而获得在概念上相似的任何其他模态的对象。您还可以使用这个统一的嵌入空间来执行跨模态嵌入算术。例如,您可以回答像鸽子的图像和自行车发动机的音频一起看起来像什么样的问题。
来源
在 这个 Jupyter notebook 中,我们展示了如何使用 Weaviate 中的 multi2vec-bind 模块使用 ImageBind 模型将多媒体文件添加到向量数据库。然后我们可以对这些数据执行任意到任意搜索。
您还可以使用解释任意到任意搜索的这个图表来直观地了解以下代码如何利用先前生成的统一嵌入空间来执行搜索。
任意到任意搜索:显示模型理解和嵌入的任何模态都可以作为查询传入,并且可以返回在概念上相似的任何模态的对象。
步骤 1:创建一个多模态集合
首先,您需要创建一个可以容纳不同模态的数据的集合,例如音频、图像和视频。
client.collections.create(
name="Animals",
vectorizer_config=wvc.config.Configure.Vectorizer.multi2vec_bind(
audio_fields=["audio"],
image_fields=["image"],
video_fields=["video"],
)
)
步骤 2:插入图像和其他媒体
source = os.listdir("./source/image/")
items = list()
for name in source:
print(f"Adding {name}")
path = "./source/image/" + name
items.append({
"name": name,
"path": path,
"image": toBase64(path),
"mediaType": "image"
})
animals = client.collections.get("Animals")
animals.data.insert_many(items)
步骤 3:执行图像搜索
response = animals.query.near_image(
near_image=toBase64("./test/test-cat.jpg"),
return_properties=['name','path','mediaType'],
limit=3
)
有关更详细的分解,请参阅 完整的 notebook 和 支持存储库。
使用像 Weaviate 这样的向量数据库来存储和执行对象嵌入的快速实时检索,使我们能够扩展这些多模态模型的用法。这使我们能够为生产中的多模态搜索提供支持,并将我们讨论的跨模态操作集成到我们的应用程序中。
多模态检索增强生成 (MM-RAG)
RAG 允许我们将检索到的文档打包到提示中,以便语言模型可以在生成响应之前读取相关信息。这使我们能够扩展大型语言模型的知识,而无需每次更新信息时都必须训练或微调它们。
通过将模型的知识外部化,RAG 可以提供诸如
- 可扩展性:减少模型大小和训练成本,以及允许轻松扩展知识
- 准确性:将模型与事实相结合,减少幻觉
- 可控性:允许通过简单地在向量数据库中执行 CRUD 操作来更新或自定义知识
- 可解释性:检索到的文档作为模型预测的来源参考
然而,仅文本的 RAG 系统的局限在于它们仅利用检索到的文本资源。这是因为大多数 LLM 仅理解语言,因此检索到的任何信息都必须是文本格式……直到现在!
最近,出现了一批能够理解文本和图像的生成模型,包括闭源和开源模型。因此,我们现在可以支持多模态 RAG,我们可以从我们的向量数据库中检索图像,并将这些图像传递到大型多模态模型 (LMM) 中进行生成。这个简单的两步过程,如图下所示,是多模态 RAG 的主要思想。
展示了 MM-RAG 的两步过程,包括从多模态知识库中检索,然后通过基于检索到的上下文进行生成,使用大型多模态模型。
MM-RAG 由斯坦福大学的一个团队在今年年初提出。他们展示了一种多模态模型的流程,该流程可以检索并生成文本和图像。
他们还讨论了多模态 RAG 的优势
- 它在图像和字幕生成任务上显著优于基线多模态模型,例如 DALL-E 和 CM3。
- 它在实现更好性能的同时,需要的计算量要少得多(小于 DALLE 的 30%)
- MM-RAG 能够生成的模型也更能忠实于检索到的上下文。这意味着生成的图像质量更好,并且基于检索到的上下文图像。
- 多模态模型能够进行多模态上下文学习(例如,从演示中生成图像)。这意味着我们可以提供任何演示图像和文本,以便模型生成遵循这些上下文示例的视觉特征的图像。
MM-RAG 为我们提供了一种进一步控制这些新型多模态模型的强大生成能力,以在工业中产生更有用的结果。
在 Python 中实现多模态 RAG 示例
本节演示了如何使用多模态信息检索系统实现多模态 RAG 系统,方法是从多模态集合中检索,然后将 base64 编码的图像以及文本提示传递给 OpenAI 的 GPT4 视觉模型。然后,我们获取生成的描述并将其传递给 DALL-E-3,以从描述中重新创建图像。
您可以在 此 Jupyter notebook 中找到此示例的完整代码。
从多模态集合中检索对象
def retrieve_image(query):
response = animals.query.near_text(
query=query,
filters=wvc.query.Filter(path="mediaType").equal("image"),
return_properties=['name','path','mediaType','image'],
limit = 1,
)
result = response.objects[0].properties
print("Retrieved image object:",json.dumps(result, indent=2))
return result
response = retrieve_image("dog with a sign")
SOURCE_IMAGE = response['image']
检索到的图像

生成图像的文本描述
接下来,我们将使用 OpenAI 的 GPT4-V 视觉语言模型生成图像的文本描述。
import requests
def generate_description_from_image_gpt4(prompt, image64):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {openai.api_key}"
}
payload = {
"model": "gpt-4-vision-preview",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image64}" #base64 encoded image from Weaviate
}
}
]
}
],
"max_tokens": 300
}
response_oai = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
result = response_oai.json()['choices'][0]['message']['content']
print(f"Generated description: {result}")
return result
GENERATED_DESCRIPTION = generate_description_from_image_gpt4(
prompt="This is an image of my pet, please give me a cute and vivid description.",
image64=SOURCE_IMAGE
)
生成的描述: 这张可爱的图像捕捉了一只迷人的法国斗牛犬,乖巧地坐在充满活力的红色背景前。这只小狗的皮毛主要是白色的,耳朵和眼睛周围有独特的黑色斑块,赋予它一种自然的优雅感。它富有表现力的、间距较宽的眼睛闪烁着好奇和期待的混合光芒,而头部的轻微倾斜和那些像蝙蝠一样的耳朵,共同构成了一种惹人喜爱的专注感。
可爱感因脖子上挂着写有“FREE KISSES”(免费亲吻)字样和一颗小爱心符号的手写标语而增强,向所有靠近的人传递了一份甜蜜而异想天开的礼物。标语加上小狗天真无邪的目光,唤起了一种温暖和陪伴的感觉。这位小小的爱之大使骄傲地坐着,几乎就像理解了它给周围的人带来的快乐。凭借它紧凑的体型和充满爱意的举止,这只小狗看起来随时准备按需分配无限的爱和幼犬亲吻。
使用文本从 DALL-E-3(扩散模型)重建图像:
目前,GPT4-V 无法生成图像。因此,我们将使用 OpenAI 的 DALL-E-3 模型。
from openai import OpenAI
def generate_image_dalee3(prompt):
openai_client = OpenAI()
response_oai = openai_client.images.generate(
model="dall-e-3",
prompt=str(prompt),
size="1024x1024",
quality="standard",
n=1,
)
result = response_oai.data[0].url
print(f"Generated image url: {result}")
return result
image_url = generate_image_dalee3(GENERATED_DESCRIPTION)
生成的图像: 
多模态 RAG 的最新进展
使用多模态 延迟交互模型(例如 ColPali、ColQwen 或 ColQwen-Omni)的检索机制的最新进展,加速了多模态 RAG 系统的发展。在这些现代人工智能系统中,PDF 文档被视为包含文本、图像、表格、图表等内容的文档。
有关示例实现,请参阅 此 notebook,展示了使用 ColPali 在 PDF 文档上进行多模态 RAG
结论
在本博客中,我们介绍了如何将 RAG 的概念扩展到包括从多模态知识库中检索。我们还解释了多媒体如何嵌入到统一的向量空间中,以及如何利用向量数据库来支持任意到任意的搜索。希望本文对您有所帮助!我很乐意在 X 上与您联系,我的账号是 @zainhasan6!
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。
来源:
来源: