DLAI-多模态-RAG-笔记-全-
DLAI 多模态 RAG 笔记(全)
001:课程概述 🎬

在本课程中,我们将学习如何构建一个能够与视频内容进行对话的问答系统。我们将探索多模态人工智能技术,特别是如何将视频中的视觉和文本信息结合起来,创建一个强大的检索增强生成(RAG)系统。
课程简介
欢迎来到由英特尔合作创建的《多模态RAG聊天系统与视频》课程。

在本课程中,你将学习如何为一组视频构建一个问答系统。你将探索多模态编码转换器模型,这些模型将视觉和文本数据合并到一个统一的语义空间中。你还将学习如何创建一个能够与视频集合进行交互的系统。
课程内容与流程
首先,你将从BridgeTower模型开始,该模型嵌入了文本和图像。你会生成嵌入并将它们存储在向量数据库中。
接下来,你将开发一个RAG管道,以从这个数据库中提取相关的多模态内容,并将其作为输入上下文传递给下游的大规模视觉语言模型,为用户生成响应。
到课程结束时,你将构建一个交互式AI系统,允许你与视频语料库进行对话。
讲师介绍

我很高兴为本课程授课的是Vasudev Lau,他是英特尔实验室多模态认知AI团队的首席AI研究科学家。Vasudev和他的团队进行大量关于多模态基础模型的研究,特别是模型规模扩大如何使视觉和文本表示相互对齐的研究。为了进一步支持研究和开发者社区,他们经常开源他们的工作,并在主要AI会议上展示详细的技术论文。


你将学习的关键技能
谢谢,Andrew。在本课程中,你将学习多模态嵌入模型,如BridgeTower模型,以及如何为图像和字幕对创建联合嵌入。这些嵌入能够在一个共同的多模态语义空间中表示视觉和语言模态。
你将学习如何处理多模态应用中的视频数据,包括使用Whisper模型进行转录,以及使用大规模视觉语言模型生成字幕,并学习如何开发能够处理复杂查询(涉及文本和图像)的强大检索系统。
利用工具如向量存储和LangChain进行数据检索和相似性搜索。你还将学习如何使用大规模视觉语言模型执行任务,例如图像字幕生成、基于视觉和文本线索回答问题,以及保持对话流程。
技术栈与合作伙伴
本课程使用的API基于PredictionGuard的多模态模型,PredictionGuard是一家在英特尔云上托管模型的初创公司。你将学习如何实现一个完整的多模态检索增强生成(RAG)系统。该系统接受复杂的用户查询,检索相关的视频片段,并提供基于特定视频帧的全面响应。
Vasudev将指导你了解这些概念、工具和方法,包括BridgeTower模型、Whisper模型、向量存储、LangChain工作流和PredictionGuard API。
多模态AI的重要性

多模态AI这个主题让我感到非常兴奋,出于实际原因。世界上大部分数据以视频和其他多模态文档形式存在,如你将在本课程中观看的视频,或我每天审阅的幻灯片和论文。拥有能够利用所有这些模态数据的AI助手是非常有用的。这一能力对于客户支持、教育和娱乐等应用至关重要,在这些领域,多模态交互增强了用户体验。
本课程使用的模型是开源的,可以很容易地与其他开源或专有模型进行替换。
致谢
许多人为创建本课程做出了贡献。我想感谢来自英特尔的Diep Le、Gustavo Lujan和Ryan Metz。来自PredictionGuard的Daniel Weitknecht、Jacob Manstorfer和Florian Paton,以及来自DeepLearning.ai的Diala Ezzedine。

课程实践
在第一节课中,您将与多模态RAG系统进行互动,通过一个交互式的Gradio应用与视频聊天。

总结
本节课中,我们一起学习了《多模态RAG:与视频对话》课程的总体概述。我们了解了课程的目标是构建一个能与视频对话的AI系统,认识了讲师Vasudev Lau,并预览了将要学习的关键技术,包括多模态嵌入模型、视频处理、RAG管道构建以及相关的开源工具和API。在接下来的课程中,我们将动手实践这些概念。
002:课程概述与交互演示 🎬
在本节课中,我们将学习多模态检索增强生成(RAG)系统的基本概念,并通过一个交互式演示,直观地体验如何与视频内容进行对话。我们将初步了解系统的各个组成部分,为后续课程中学习如何构建它们打下基础。
人类通过所有感官来理解世界。例如,对于“苹果”这个概念,我们理解咬苹果的声音、它的味道、颜色、质感,以及它能被做成苹果派的事实。无论是视频、图像中表达的“狗”,还是用任何一种人类语言提到的“狗”这个词,其核心概念都是相通的。真正的认知AI系统也需要能够通过所有模态(如图像、文本、声音)来连接和理解这些概念。
系统演示与目标 🎯

假设我们有一段视频,例如宇航员从任务中返回的记录。一个多模态AI系统应该能够综合利用视频中的多种信息来回答问题:
- 视频中的书面文本(如字幕、屏幕文字)。
- 视频中的纯视觉信息(如人物、物体、场景)。
- 视频中所讨论的音频信息(如对话、旁白)。
- 进行多轮对话的能力,允许我们就视频内容提出后续问题。

接下来,让我们通过一个Gradio应用程序来具体看看这个系统是如何工作的。
交互演示详解 💻

以下是应用程序界面的一个示例。我们可以输入用户查询,例如“宇航员的名字是什么?”。

系统首先会检索一个与问题最相关的视频片段。例如,它可能找到宇航员自我介绍或名牌出现的片段。

“我们在国际空间站上的这次任务,我很自豪能够参与其中的大部分科学工作。”

然后,大型视觉语言模型会分析这个片段,并生成一个自然语言的回答:“其中一名宇航员的名字是罗伯特·本肯。”
我们可以接着提出后续问题,例如“宇航员的太空行走”。系统会再次检索相关片段。
“再进行一次太空行走,现在有机会再进行四次,真是令人激动。”
模型会提供该场景的详细描述。如果我们进一步追问“宇航员说了什么?”,模型会从视频的转录文本中提取信息,并组织成流畅的回答。
系统架构总览 🏗️

这就是我们将要构建的多模态RAG系统的架构。在本课程中,我们将逐步研究其每个核心组件:
- 多模态嵌入模型:学习如何将图像和文本映射到同一个语义空间。核心公式可表示为:
embedding = model(image, text),使得不同模态的信息可以相互比较。 - 视频数据预处理:学习如何将自己的视频数据(帧、音频、字幕)处理成嵌入模型可以使用的格式。
- 向量数据库存储与检索:学习如何将处理后的多模态数据存入向量数据库,并实现高效的相似性检索。核心操作是:
results = vector_db.search(query_embedding)。 - 大型视觉语言模型:学习能够同时理解图像和文本的LVLM,它负责生成最终的回答。
- 系统集成:学习如何使用LangChain等工具,将以上所有组件组合成一个完整的、可交互的多模态RAG流水线。
动手实验 🧪
现在,让我们进入第一课的实践部分。我们将启动一个预构建的Gradio应用程序。
首先,我们导入必要的库并启动应用。
from utils.gradio_utils import demo
demo.launch()
应用程序界面启动后,你可以尝试输入不同的查询。
例如,输入“宇航员的名字是什么?”。系统会检索相关片段,模型会生成答案。你可以点击“清除历史”按钮开始新一轮对话,再尝试查询“关于宇航员太空行走”。观察系统如何检索不同的片段并生成回答。
你还可以进行多轮对话,例如接着问“宇航员说了什么?”,体验系统如何利用上下文历史记录来给出连贯的回答。
代码探索与预习 🔍

这个演示应用的代码定义在 gradio_utils.py 文件中。我强烈建议你现在简要浏览一下这个文件,你会看到其中涉及了几个关键部分:
- 使用 Bridge Tower 模型生成视频数据的嵌入向量。
- 初始化了一个向量存储用于检索。
- 调用大型视觉语言模型来生成回答。
- 使用 LangChain 框架将以上组件串联成流水线。
在接下来的课程中,我们将深入讲解每一个组件。当你完成所有课程后再回看这个文件,你会更清楚地理解这些模块是如何协同工作,最终构建出一个能与视频对话的交互式应用的。

本节课总结:我们一起初步了解了多模态RAG系统的强大能力,它能够结合视频的视觉、文本和语音信息来回答我们的问题。通过交互演示,我们直观地体验了系统检索相关视频片段并生成自然语言回答的过程。最后,我们概览了构建此类系统所需的五大核心组件,为后续的深入学习做好了准备。
003:多模态嵌入

在本节课中,我们将学习如何将图像和文本数据(即多模态数据)嵌入到一个共同的多模态语义空间中。我们将使用BridgeTower模型来处理图像-文本对,生成512维的向量表示,并探索如何测量不同嵌入之间的相似性。最后,我们将使用UMAP技术将这些高维向量投影到二维平面进行可视化,以便更直观地理解数据的分布。
🏗️ BridgeTower模型架构
上一节我们介绍了多模态嵌入的概念,本节中我们来看看实现这一目标的核心模型——BridgeTower。
BridgeTower模型由英特尔实验室与微软研究院合作开发,其架构设计灵感来源于一座桥梁。模型包含两个主要部分:
- 文本塔:一个文本转换器,用于处理文本标记。
- 视觉塔:一个视觉转换器,用于处理图像补丁。
为了融合这两种模态的信息,模型引入了交叉注意力块。这些块连接了文本和视觉转换器的隐藏表示,将文本和图像的信息结合起来,最终在模型输出端为我们提供跨模态的联合嵌入。

在我们的多模态RAG系统中,BridgeTower模型将负责将视频片段及其相关的文本描述嵌入到同一个语义空间中。
💻 实践:创建与探索多模态嵌入
现在,让我们进入实践环节,看看如何使用BridgeTower模型从图像-文本对数据中创建多模态嵌入。

准备示例数据

首先,我们从一个包含三个图像-文本对的小例子开始。以下是数据定义的示例:


examples = [
{
“image_url”: “https://example.com/motorcycle1.jpg”,
“caption”: “A red motorcycle on the street.”,
“path”: “./data/motorcycle1.jpg”
},
{
“image_url”: “https://example.com/motorcycle2.jpg”,
“caption”: “A black motorcycle parked.”,
“path”: “./data/motorcycle2.jpg”
},
{
“image_url”: “https://example.com/cat1.jpg”,
“caption”: “A cute cat sleeping.”,
“path”: “./data/cat1.jpg”
}
]

字典的三个字段分别指向图像的URL、与图像关联的文本(字幕),以及图像的本地下载路径。我们将遍历这些数据,下载图像和文本。
下载完成后,我们可以看到:
- 第一张图片是关于摩托车的。
- 第二张图片也是关于摩托车的。
- 第三张图片是关于猫的。
生成多模态嵌入

接下来,我们希望通过BridgeTower模型处理这些图像-文本对,将它们转换为多模态嵌入向量。我们将通过一个API(例如PredictionGuard,运行在英特尔AI加速器上)来调用模型。
核心函数 btEmbeddingsFromPredictionGuard 会处理这个调用。具体步骤如下:
- 遍历每张图片,将其编码为base64格式。
- 将base64图像和对应的文本字幕一起提供给BridgeTower模型。
- 模型会返回一个512维的向量,代表该图像-文本对在多模态语义空间中的位置。
我们将所有生成的嵌入收集到一个列表中。每个嵌入都是一个512维的向量。

测量嵌入间的相似性
生成了嵌入之后,我们如何衡量它们之间的相似性或距离呢?以下是两种常用的方法:
1. 余弦相似度
这是一种非常流行的方法,它测量的是两个向量在方向上的相似程度,而忽略其大小(模长)。余弦相似度的值在-1到1之间,值越接近1,表示两个向量的方向越一致,即越相似。
计算公式如下:
余弦相似度 = (A·B) / (||A|| * ||B||)
其中 A·B 是向量A和B的点积,||A|| 和 ||B|| 分别是向量A和B的模长(L2范数)。

2. 欧氏距离
欧氏距离测量的是两个向量在空间中的直线距离。距离越小,表示两个向量越接近。
计算公式如下:
欧氏距离 = sqrt( Σ (Ai - Bi)² )

在我们的例子中,计算结果显示:
- 两个摩托车示例之间的余弦相似度很高(例如0.85),欧氏距离很小。
- 摩托车示例与猫示例之间的余弦相似度较低(例如0.15),欧氏距离较大。
这符合我们的预期,因为前两者语义相近(都是摩托车),而后者语义不同(猫)。余弦相似度因其计算高效且常被用作训练损失函数,在此类任务中尤为常用。

可视化高维嵌入
当处理大量图像-文本对时,可视化多模态嵌入的分布非常有帮助。由于我们无法直接观察512维的空间,我们需要先进行降维。

我们将使用UMAP技术,将这些512维的向量投影到二维空间,以便进行可视化。这种分析有助于我们理解数据的整体结构,并可能发现潜在的规律。
以下是操作步骤:
- 准备更大数据集:我们准备一个包含50个“猫”图像-文本对和50个“汽车”图像-文本对的数据集。
- 生成嵌入:使用BridgeTower模型为所有100个样本计算512维嵌入。
- 应用UMAP降维:调用UMAP算法,将所有512维向量转换为二维的(X, Y)坐标。
- 绘制散点图:在二维平面上,用不同颜色(如蓝色代表猫,橙色代表汽车)绘制这些点。


可视化结果会清晰显示,属于“猫”的嵌入点(蓝色)在二维空间中聚集在一起,属于“汽车”的嵌入点(橙色)也聚集在另一区域,并且两个聚类彼此分离。这直观地证明了BridgeTower模型成功地将语义相近的样本映射到了嵌入空间中相近的位置。

📝 总结
在本节课中,我们一起学习了多模态嵌入的核心知识。我们首先了解了如何准备图像-文本配对数据,并使用BridgeTower模型计算它们的多模态嵌入。接着,我们探索了如何使用余弦相似度和欧氏距离来量化不同嵌入之间的相似性。最后,我们掌握了通过UMAP进行降维并在二维空间中可视化这些高维嵌入的方法,从而更直观地理解数据的聚类与分布情况。

现在,你可以尝试使用自己的图片和描述文字进行实验,观察模型如何将不同的视觉-语言概念映射到共享的语义空间中。
004:视频预处理教程 🎬
在本节课中,我们将学习如何将视频预处理成适合输入到多模态RAG(检索增强生成)管道的形式。我们将了解三种主要情况:当视频自带转录文件时如何处理;当没有转录文件时,如何使用Whisper模型生成转录;以及当视频没有明确语言信息时,如何使用大型视觉语言模型为视频帧生成字幕。通过本教程,您将掌握将视频转化为“视频帧-关联文本”配对数据的关键步骤。
系统概览与预处理模块

上一节我们介绍了多模态RAG系统的整体架构,本节中我们来看看其中的预处理模块。


预处理模块负责将原始视频转化为结构化的数据。我们将主要处理以下三种情况:
- 视频自带转录文件:转录文件通常为Web VTT格式,包含与时间戳关联的文本。
- 视频无转录文件:使用OpenAI的Whisper模型自动生成音频转录。
- 视频无明确语言信息:使用大型视觉语言模型(LVLM)为视频帧生成描述性字幕。
接下来,我们将进入代码实践部分。
准备工作:导入库与获取视频
我们首先导入必要的Python库,并从YouTube下载一个示例视频及其自带的转录文件(VTT格式)。
# 示例:导入必要库
import cv2
import whisper
# ... 其他库
您也可以使用自己选择的视频进行练习。下载完成后,我们获得一个MP4视频文件和一个VTT格式的转录文件。
情况一:处理自带转录文件的视频
当视频已有Web VTT格式的转录文件时,我们的目标是将每个文本片段与视频中的一个中心帧关联起来。
以下是处理流程的核心步骤:
- 解析时间戳:使用辅助函数将VTT文件中的字符串时间(如
00:00:01.000)转换为毫秒数值。def string_to_time(time_str): # 将“时:分:秒.毫秒”字符串转换为毫秒数 # ... 实现代码 - 提取中心帧:遍历每个转录文本片段,计算其时间区间的中点(毫秒),并使用OpenCV(cv2)在该时刻提取视频帧。
- 调整帧尺寸:使用辅助函数保持纵横比调整帧大小,以适配后续的BridgeTower等多模态模型。
def keep_aspect_ratio_resize(image, target_size): # 保持原图宽高比进行缩放 # ... 实现代码 - 保存元数据:将提取的帧保存为图像文件,并创建一个元数据字典(或文件),记录
帧文件路径、关联文本、片段ID和中心点时间戳。
调用处理函数后,视频就被转化为了一个结构化的数据集,供下游应用使用。
情况二:使用Whisper模型生成转录
当视频没有现成的转录文件时,我们需要为其生成一个。这里我们使用OpenAI的Whisper模型。
处理步骤如下:
- 提取音频:使用MoviePy等库从视频文件中提取音频,并保存为MP3格式,因为Whisper模型以音频为输入。
- 加载模型:加载Whisper模型(例如
base或small版本),并设置语言(如英语)。model = whisper.load_model("small") result = model.transcribe("video_audio.mp3", language="en") - 格式转换:将Whisper的输出结果,通过辅助函数转换为标准的Web VTT格式文件。
现在,我们就得到了一个与情况一相同的VTT转录文件,可以继续使用情况一的方法进行处理。
情况三:使用LVLM为视频帧生成字幕
对于没有明确语言信息(如纯音乐视频、无声视频)的视频,我们需要为视觉内容本身生成描述。我们将使用大型视觉语言模型(如LLaVA)。
我们将在第五课深入学习LLaVA。本节课,我们通过Prediction Guard提供的API来使用它。
以下是操作步骤:
- 定义提示词:构建一个请求模型生成图像描述的提示。
prompt = “Please generate a concise caption for this image.” - 采样视频帧:以固定的帧间隔(如每秒1帧)读取视频,对采样到的帧进行Base64编码。
- 调用模型生成字幕:将编码后的图像和提示词发送给LLaVA模型,获取生成的文本描述。
caption = query_llava_model(base64_image, prompt) - 保存元数据:与之前类似,保存帧图像和其对应的生成字幕到元数据中。
这种方法不仅适用于无声视频,也可以为已有转录的视频生成更丰富、更侧重视觉细节的字幕,从而增强视频的语言信息。

图:LLaVA模型为视频帧生成的字幕示例——“图片显示一个小男孩在操场上行走”。

课程总结

本节课中,我们一起学习了多模态RAG系统中视频预处理的三种核心方法:
- 对于有转录文件的视频,我们解析VTT文件,提取时间戳对应的中心帧,建立“帧-文本”关联。
- 对于无转录文件的视频,我们使用Whisper模型自动生成音频转录,再按方法一处理。
- 对于无明确语言信息的视频,我们使用大型视觉语言模型(如LLaVA) 为采样帧生成描述性字幕。
通过以上步骤,我们将各种类型的视频数据转化为了结构化的“视觉-文本”配对数据。在下一节课中,我们将利用本节课生成的数据,学习如何计算多模态嵌入,为最终的检索与问答做准备。
005:从向量存储进行多模态检索 🧠


在本课中,我们将学习如何创建能够处理文本和图像复杂查询的强大检索系统。课程结束时,你将能够将数据导入LanceDB向量存储,执行相似性搜索,并展示结合不同模态信息(如视频帧及其相关字幕)的检索结果。
概述
上一节我们介绍了多模态RAG系统的整体架构。本节中,我们将具体学习如何填充向量存储,并从中进行多模态检索。


向量存储是为存储和检索高维向量而优化的数据库。正如之前所见,我们可以将视觉和语言数据表示为共用的多模态语义向量空间中的嵌入。向量存储的作用,就是将这些嵌入转变为可用的搜索引擎。
多模态检索流程


构建好多模态向量存储后,下一步就是进行多模态检索。此任务的流程如下:
- 输入一个查询。
- 计算该查询的嵌入向量。
- 在查询嵌入与向量存储中所有嵌入之间执行相似性搜索。
通过这种方式,我们能够检索到最符合查询要求的视频帧及其相关字幕等元数据。接下来,让我们通过第4课的实践来具体操作。
实验:填充与检索向量存储 🧪


欢迎来到第4课的实验环节。在本实验中,我们将练习将视频语料库导入LanceDB向量存储,并使用LangChain执行多模态检索。
实验准备
在上一课中,我们已经完成了视频下载、帧提取、转录获取和字幕生成。本实验将在此基础上进行。
以下是实验的主要步骤:
- 导入必要的库。
- 连接并初始化向量存储。
- 加载并增强视频元数据。
- 使用多模态嵌入填充向量存储。
- 执行多模态语义搜索。
首先,让我们导入处理多模态数据所需的库。由于涉及多模态数据,我们扩展了几个LangChain类,它们位于我们导入的multimodal-lancedb库和BridgeTower嵌入库中。
# 示例代码:导入库
import lancedb
from langchain.vectorstores import LanceDB
from multimodal.embeddings import BridgeTowerEmbeddings
连接向量存储
现在,我们将通过声明数据库路径和表名来建立与LanceDB向量存储的连接,并完成初始化。
# 示例代码:连接并初始化向量存储
uri = “./data/lancedb”
table_name = “video_frames”
db = lancedb.connect(uri)
table = db.create_table(table_name, mode=“overwrite”)
加载与增强数据
接下来,我们加载之前构建的视频元数据文件,并将所有转录文本和视频帧图像分别收集到列表中。
需要注意的一点是,某些视频片段的转录可能是碎片化的,导致单个视频帧的文本上下文不足。为了缓解这个问题,我们可以通过合并每个帧相邻n个帧的转录文本来增强其上下文。这会导致相邻帧的转录有部分重叠,但整体上能显著增加每个帧可用的文本信息量。
在本实验中,我们将n设置为7来实现这种增强。让我们通过一个例子来观察增强前后的对比。
增强前的转录示例可能非常简短,例如“太空行走”或“现在有机会完成了”,这不足以提供充分的上下文。增强后,简短的转录被相邻帧的转录内容所丰富,从而为理解该视频帧提供了足够的背景信息。
# 示例代码:增强转录上下文
def enhance_transcript(transcripts, frame_index, n=7):
start = max(0, frame_index - n)
end = min(len(transcripts), frame_index + n + 1)
enhanced_text = “ “.join(transcripts[start:end])
return enhanced_text
填充向量存储
现在,我们将视频数据导入LanceDB向量存储。我们初始化BridgeTower嵌入模型,并将其作为嵌入函数传递给向量存储。我们需要同时传入文本数据(收集的视频转录)和图像数据(收集的视频帧)。
# 示例代码:初始化嵌入模型并填充向量存储
embeddings = BridgeTowerEmbeddings()
vectorstore = LanceDB.from_texts_and_images(
texts=enhanced_transcripts_list,
images=video_frames_list,
embedding=embeddings,
connection=table
)
至此,向量存储已构建完成。我们可以将其内容以Pandas DataFrame的形式查看,会发现它包含了所有的转录文本,并且每一行都关联了一个从视频中提取的帧图像。
执行检索
现在,我们为向量存储添加一个检索器。我们定义该检索器使用BridgeTower模型,并设置k值为1,这意味着检索器将返回向量存储中与查询最匹配的一个条目。
# 示例代码:定义检索器
retriever = vectorstore.as_retriever(search_kwargs={“k”: 1})
现在,我们可以对向量存储运行查询了。例如,对于查询“幼儿和成人”,我们调用检索器并获得结果。我们可以展示检索到的图像和文本,系统检索到了一个准确描述包含幼儿和成人场景的视频帧及其关联文本。
# 示例代码:执行查询
query = “幼儿和成人”
results = retriever.get_relevant_documents(query)
# 显示结果中的图像和文本
接下来,让我们尝试相同的查询,但将k值设为3,以获取前三个最匹配的结果。我们可以看到,第一个结果与之前完全相同,第二个结果可能只包含一个幼儿,第三个结果可能包含两个幼儿。第一个结果得分最高是合理的,因为它完全匹配了查询描述。
我们再运行几个查询示例:
- 查询:“宇航员太空行走,身后是地球的壮丽景色”。系统检索到了展示地球景色和宇航员太空行走的合适视频帧及其转录。
- 查询:“一群宇航员”。系统检索到了显示一群宇航员的视频帧及其相关转录片段。


现在,你可以尝试输入自己的查询进行实验。你也可以遵循相同流程,将自己的视频数据嵌入到这个向量存储中。
总结
本节课中,我们一起学习了多模态检索的核心流程。我们从连接和初始化LanceDB向量存储开始,接着加载并增强了视频的文本上下文,然后使用BridgeTower多模态嵌入模型将文本和图像数据共同填充到向量存储中。最后,我们实践了如何通过自然语言查询,从这个多模态向量存储中执行语义搜索,成功检索出相关的视频帧和字幕。这构成了多模态RAG系统中“检索”环节的关键步骤。
006:大规模视觉语言模型 (LVLMs) 🖼️🤖
在本节课中,我们将学习如何利用大规模视觉语言模型的能力来处理复杂的多模态任务,例如为图像生成描述、基于视觉内容回答问题以及从图像中推理信息。我们将通过调用 Prediction Guard 的 API 来实践这些功能。

概述
上一节我们介绍了多模态RAG系统的整体架构。本节中,我们将重点学习如何实现其中的LVLM推理模块。LVLM代表大规模视觉语言模型,它能够同时理解图像和文本信息,并生成文本输出。
LLM 与 LVLM 的比较
首先,我们来比较一下LLM和LVLM的核心区别。

-
LLM:专注于自然语言处理与生成。
- 输入:仅文本。
- 输出:文本。
- 公式:
Output_Text = LLM(Input_Text)
-
LVLM:结合了视觉与文本信息,连接了计算机视觉和语言理解。
- 输入:图像 + 文本。
- 输出:文本。
- 公式:
Output_Text = LVLM(Input_Image, Input_Text)
这些模型在图像描述生成、视觉问答等任务上表现出色。

LAVA 模型简介
在本实验中,我们将使用一个名为 LAVA 的开源LVLM。LAVA代表大规模语言与视觉助手。
LAVA模型的核心架构如下:
- 图像通过一个视觉编码器(如CLIP的视觉转换器)进行处理。
- 编码后的视觉特征通过一个投影矩阵,被映射到与语言模型相同的语义空间。
- 这些视觉特征与文本指令(或查询)一起,输入到一个强大的语言模型(通常是LLaMA系列)中,最终生成文本响应。
LAVA模型的一个优点是,可以通过少量训练轻松更换其骨干语言模型,灵活性很高。

实验准备
现在,让我们进入第5课的实践环节。在之前的课程中,我们学习了像BridgeTower这样的多模态嵌入模型。本实验中,我们将使用LAVA模型家族。
我们将通过Prediction Guard提供的API来调用LAVA 1.5模型,该模型运行在英特尔开发者云的AI加速器上。

以下是导入所需库的代码:
# 导入必要的库
import requests
import base64
from PIL import Image
import json
数据准备
我们将使用第2课中从视频提取的帧和转录文本,并引入一些额外的图像数据。
例如,我们读取之前保存的转录文本和视频中心帧。同时,我们也加载了一些新的数据,这些数据包含图像的URL及其描述。
# 加载第3课提取的转录和帧
# 加载新的图像URL和描述数据
# (此处为示例,具体代码取决于数据存储格式)
应用场景一:图像描述生成

第一个应用是让模型为图像生成描述性文字。
我们首先将图像编码为Base64格式,然后构建一个对话对象,用于存储模型返回的字幕。
以下是核心步骤的代码示例:

def encode_image_to_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
image_base64 = encode_image_to_base64("path_to_your_image.jpg")
prompt = "请描述这张图片。"
# 构建包含图像和提示的请求数据
# 调用Prediction Guard API

让我们看一个例子。模型为一张包含人物的视频帧生成了准确的描述:“图片中有五名男子...”,并提取了许多其他细节。
应用场景二:基于视觉线索的问答
接下来,我们尝试基于图像内容进行问答。
我们向模型展示一张图片,并提出一个具体问题,例如:“接下来可能会发生什么?”
模型不仅准确描述了图像内容(“男子正在沙滩上用滑板做倒立”),还进行了合理的推理(“他可能会失去平衡,从滑板上摔下来”)。这表明LAVA模型能够从视觉内容中进行逻辑推理。

应用场景三:理解图像中的文本
LVLM还能识别和理解图像中的文字信息。
例如,我们向模型展示一个带有文字的宇航员视频帧,并提问:“这位宇航员的名字是什么?”

模型成功检测并读取了帧中的文本“Robert Behnken”,并在回答中正确指出了宇航员的名字。
应用场景四:结合图像与关联文本进行问答
我们还可以结合与图像相关的文本来提问。
我们构建一个提示,其中包含相关的文本记录(例如视频转录),然后提出一个问题,如:“宇航员对他们的工作有什么感受?”

模型能够综合文本记录中的信息,给出回答:“宇航员对他们在国际空间站的工作感到自豪。” 这展示了模型整合多模态信息的能力。
扩展对话:多轮交互
最后,我们来看如何与LAVA模型进行多轮对话。关键在于维护对话历史。
以下是一个示例,我们对模型的上一个回答提出一个跟进问题:
# 假设 `conversation_history` 是一个列表,存储了之前的对话轮次
conversation_history = [
{"role": "user", "content": "宇航员对他们的工作有什么感受?"},
{"role": "assistant", "content": "他们对工作感到自豪。"}
]
follow_up_question = "宇航员从哪里返回?"
# 将跟进问题加入历史,或构建新的包含历史的提示
# 再次调用API

在这个例子中,模型成功回答了“宇航员是从国际空间站返回的”。通过维护对话历史,我们可以实现连贯的多轮对话。
总结
本节课中,我们一起学习了大规模视觉语言模型的核心概念与应用。我们了解到LVLM能够同时处理图像和文本输入,并生成文本输出。通过LAVA模型,我们实践了图像描述生成、视觉问答、文本识别以及结合多模态信息的推理。最后,我们还探索了如何通过维护对话历史来实现与模型的多轮交互。

现在,你可以尝试使用自己的图像和文本提示,来探索这个托管的LVLM模型的更多可能性。
007:构建完整的多模态RAG系统 🚀

在本节课中,我们将学习如何将之前课程中介绍的各个模块组合起来,构建一个完整的、能够与视频对话的多模态检索增强生成系统。我们将使用 LangChain 来创建自定义的处理链,实现从用户查询到最终图文响应的完整流程。
概述:传统RAG vs. 多模态RAG
上一节我们介绍了多模态RAG的各个组件,本节中我们来看看如何将它们整合成一个完整的系统。首先,让我们对比一下传统RAG和多模态RAG。
在传统的RAG系统中,流程结合了检索和仅文本的大型语言模型的生成能力。它检索相关的上下文,但内容仅为文本,并在生成响应之前将其合并到提示中。其核心流程可以概括为:
传统RAG流程 = 文本检索 + 文本LLM生成
在我们的多模态RAG流程中,我们将传统的RAG管道扩展到处理包括文本和图像的多种模态。因此,在这个流程中,我们不仅处理文本查询和上下文,还能处理并生成与图像相关的信息。
下图展示了多模态RAG系统的整体架构,它包含两个主要流程:

- 数据索引过程:这是我们获取企业或私有数据,进行预处理,并通过嵌入模型将其存储到向量数据库的过程。
- 推理流程:当应用部署后,用户查询会通过嵌入模型处理,然后在向量数据库中进行相似性搜索,检索出的最匹配条目会与初始查询一起传递给大型视觉语言模型以生成最终响应。

注意,系统中的企业数据、嵌入模型和向量数据库都可以是私有的,这增强了系统的安全性和定制化能力。
使用 LangChain 构建处理链 🔗
在本课的实践中,我们将使用 LangChain 创建自定义的处理链。考虑以下场景:我们需要将用户查询传递给检索模块,同时还需要将检索结果与原始查询一起传递给提示处理模块,最后将处理后的提示传递给LVLM推理模块。

在代码中,我们可以创建一个包含多个步骤的链来实现这一逻辑。例如:
# 伪代码示例:定义处理链的步骤
chain = (
Step1: 检索模块
| Step2: 将检索结果与原始查询结合,传递给提示处理模块
| Step3: LVLM推理模块
)
通过这种方式,我们可以清晰地定义数据在各个模块间的流动。
实验:实现多模态RAG系统 💻
现在,我们进入本课的实践部分,开始在代码中实现多模态RAG系统。

环境准备与模块初始化


首先,我们需要导入必要的库并初始化之前构建好的核心模块。
以下是需要导入的关键组件和初始化步骤:
- 导入 LangChain 的相关组件。
- 初始化在第三课和第四课中构建的多模态向量存储。
- 初始化 Bridge-Tower 嵌入模型。
- 初始化与向量存储关联的检索器模块。
为了测试检索器是否正常工作,我们可以用一个查询进行测试:
query = "宇航员对他们的工作有何感受?"
retrieved_results = retriever.invoke(query)
检查检索到的元数据,包括视频帧、字幕等信息,确保检索模块功能正常。

手动测试各模块

在将所有模块连接起来之前,我们先手动测试LVLM推理模块。

以下是手动测试的步骤:
- 初始化 Lava 推理模块。
- 将检索到的视频字幕与原始用户查询结合起来,构建增强的查询。
- 创建一个包含增强查询和检索到的图像帧路径的字典。
- 将这个字典输入给LVLM推理模块,并观察其文本输出。

通过这个步骤,我们可以验证检索模块和LVLM模块各自都能独立工作,并且手动组合的流程能产生正确的响应(例如,回答“宇航员对他们的工作感到自豪”)。

定义提示处理模块

接下来,我们需要定义一个提示处理模块,用于自动化地组合用户查询和检索结果。

提示处理函数的核心任务如下:
- 输入:原始用户查询和检索结果。
- 处理:将原始查询与检索到的视频字幕结合,构建一个结构化的提示。
- 输出:一个包含增强后提示和对应视频帧路径的字典。

我们将这个函数包装成 LangChain 可调用的模块,以便集成到处理链中。
构建多模态RAG处理链
现在,我们将所有模块连接起来,创建最终的多模态RAG处理链。

链的构建步骤如下:
- 第一步:使用检索模块处理用户查询。我们使用
RunnableParallel确保原始查询也能传递到后续步骤。 - 第二步:将第一步的输出(包含检索结果和用户查询的字典)传递给提示处理模块。
- 第三步:将提示处理模块的输出传递给LVLM推理模块,生成最终答案。

定义好链之后,我们可以用查询“宇航员对他们的工作有何感受?”来调用它,应该能得到与手动测试一致的文本响应。

增强输出:返回检索到的图像
在一个完善的多模态RAG系统中,我们不仅希望得到文本答案,还希望展示模型做出判断所依据的视频帧。
为了在输出中包含检索到的帧,我们需要修改处理链:
- 在链中,我们需要通过
RunnableParallel等方式,将检索模块得到的帧路径信息绕过LVLM模块,直接传递到最终的输出中。


修改后,当我们再次运行查询时,链的输出将同时包含LVLM生成的文本答案和用于生成该答案的相关视频帧路径,从而使用户能够理解模型的推理依据。
尝试更多查询

我们可以尝试更多样的查询来测试系统的能力。
以下是几个测试用例及其预期关注点:
- 查询1:“其中一位宇航员的名字是什么?” – 测试系统从视频字幕中提取特定信息的能力。
- 查询2:“关于宇航员的太空行走。” – 测试系统对视觉场景和文本内容的综合理解。
- 查询3:“描述一幅宇航员太空行走的图像,背景是从太空看到的令人惊叹的地球景象。” – 测试系统处理复杂、多条件查询的能力,并观察当前模型的局限性。

通过这些测试,我们会发现系统对查询的表述方式比较敏感,这是当前多模态模型仍在不断改进的方向。

总结与展望 🎯
本节课中我们一起学习了如何构建一个完整的多模态RAG系统。我们回顾了从数据预处理、向量数据库填充到大型视觉语言模型使用的整个流程,并最终使用 LangChain 将这些组件串联成一个可以处理用户查询、检索相关视频片段、并生成图文并茂响应的自动化管道。
关键点总结:
- 多模态RAG扩展了传统RAG,能处理文本和图像。
- 使用 LangChain 可以灵活定义模块间的数据流,构建自定义处理链。
- 系统的输出可以同时包含文本答案和作为依据的检索帧,使结果更可解释。
- 当前系统对查询表述敏感,其性能随着多模态模型的发展而不断提升。
现在,你已经掌握了构建多模态RAG应用的核心技能。鼓励你使用自己的视频数据,创建个性化的视频对话应用,进一步探索这一领域的可能性。
008:总结 🎬
在本节课中,我们将一起回顾整个课程的核心内容,总结我们所学到的关于多模态检索增强生成的关键知识,并了解如何利用相关资源继续你的探索之旅。
课程回顾
上一节我们探讨了具体的模型实现与硬件平台。本节中,我们来看看整个课程的要点总结。
在本课程中,我们探索了多模态机器学习领域,特别是视觉数据与文本数据之间的复杂交互。我们成功利用了高级工具和框架,构建了能够进行上下文理解并给出细致响应的智能系统。
关键工具与平台
以下是课程中使用的核心模型与运行平台:
- 核心模型:我们主要使用了 Bridgetower模型 和 Lava模型。
- 运行平台:这些模型运行在 Intel Gaudi AI 加速器 上。
后续资源与行动建议
为了帮助你继续深入学习和实践,以下是一些可用的资源:
- 开发平台:你可以访问 Intel Tiber 开发者云(网址:
cloud.intel.com),使用如 Intel Gaudi 3 AI 加速器 等最新硬件来构建你的下一个项目。 - 模型详情:你可以在 Hugging Face 上查看 Bridgetower 模型的具体实现细节。
- 训练方案:你同样可以在相关平台上找到我们团队发布的 Lava 模型的训练方案。
结语
本节课中,我们一起学习了多模态RAG系统的基本构建流程,从理解视觉与文本的交互,到使用特定模型和硬件平台实现智能对话功能。随着你继续前进,请带着在此获得的信心与创造力,准备好去创新并塑造人工智能的未来。


浙公网安备 33010602011771号