多模态RAG全攻略:从零构建跨模态检索增强系统,小白必学大模型技术!

发布时间:2026/8/27 16:37:31
多模态RAG全攻略:从零构建跨模态检索增强系统,小白必学大模型技术! 前言多模态检索增强生成_Multimodal Retrieval Augmented Generation简称RAG_是一种新兴的设计范式允许AI模型与文本、图像、视频等多种信息存储接口进行交互。在探讨这个主题时我们首先会介绍什么是检索增强生成_RAG_多模态的概念以及如何将两者结合以构建现代多模态RAG系统。在理解了多模态RAG的基本概念后我们将使用Google Gemini和一种类似CLIP的编码模型来构建一个多模态RAG系统。检索增强生成简介在介绍多模态RAG之前我们先简单了解一下传统的检索增强生成(RAG)。基本上RAG的概念是找到与用户查询相关的信息然后将这些信息注入到提示中并传递给语言模型。RAG系统的基本原理是根据用户的查询检索相关信息然后将这些信息与用户的查询结合_称为增强_后传递给语言模型。RAG系统的检索通常是通过“嵌入”实现的。基本上为了嵌入某些内容我们使用高级AI模型将信息转换为代表该信息的向量。嵌入的概念图AI模型会提取一些文本序列并创建一个代表该文本序列的向量。这个过程是通过一组参考文档以及用户的查询来完成的。可以计算这些向量之间的距离文档与用户查询之间距离最小的被认为是最相关的。检索的概念图。这里事件列表被认为是最相关的因为它与用户查询的距离最小。一旦RAG系统检索到足够相关的信息用户的查询和相关文档将用于构建一个增强提示然后将其传递给语言模型进行生成。Answer the customers prompt based on the folowing context:context:{document title}{document content}...prompt:{prompt}这种通用系统通常预设整个知识库由可以传递给语言模型的文本组成但许多知识来源不仅仅是文本。可能还有音频、视频、图像等。这就是多模态RAG的作用。在讨论多模态RAG之前让我们简要探讨一下多模态的概念。多模态在数据科学中“模态”本质上是数据的一种类型。文本、图像、音频、视频、表格等都可以被视为不同的“模态”。长期以来这些不同类型的数据被视为彼此分离数据科学家需要为文本、视频等分别创建模型。近年来这种概念逐渐消失能够理解和处理多种模态的模型变得更加高效且易于访问。这些能够理解多种数据类型的模型通常被称为“多模态模型”。多模态模型的概念通常围绕“联合嵌入”展开。基本上联合嵌入是一种建模策略迫使模型同时学习不同类型的数据。这个领域的标志性论文之一是CLIP它创建了一个能够处理图像和文本任务的强大模型。CLIP风格的模型使用复杂的训练过程使多个模型组件协同工作以理解图像和文本。自CLIP以来各种建模策略已被创建以某种方式对齐图像和文本。我介绍了这个领域的各种模型但这些只是冰山一角。到处都有可以处理多种类型的数据新模型问世。多模态和RAG的演变引发了AI的新趋势在多模态中进行RAG。多模态RAG多模态RAG的概念是允许RAG系统以某种方式将多种形式的信息注入多模态模型中。因此多模态 RAG 系统不仅可以根据用户提示检索文本片段还可以检索文本、图像、视频和其他不同模态的数据。多模态RAG的核心概念。它与普通RAG类似但现在可以检索来自多种模态的信息并传递给语言模型。目前有三种流行的方法可以实现多模态RAG。方法一共享向量空间多模态RAG的一种方法是使用能够处理多种模态的嵌入_类似于前面讨论的CLIP_。基本上你可以通过一组设计为相互协作的编码器传递数据然后在所有模态中检索与用户查询最相似的数据。使用多模态嵌入系统的多模态RAG例如Google Vertex提供的编码器。这些编码器旨在协同工作将来自不同模态的数据放置在同一个嵌入中。以更好地了解其实际应用。方法二单一基础模态多模态RAG的另一种方法是将所有数据模态转换为单一模态通常是文本。使用基础模态的多模态RAG。所有模态在传递到单个编码器之前都会转换为单个模态。我在一家公司工作该公司在一个更大的产品中采用了这种策略_我们称之为“多模态转换”_。虽然这种策略在理论上存在信息在转换过程中丢失的风险但实际上我们发现对于许多应用来说这种方法以相对较小的复杂性实现了非常高质量的结果。方法三独立检索第三种方法是使用一组旨在处理不同模态的模型。在这种情况下你会在不同的模型上多次进行检索然后结合它们的结果。使用独立检索的多模态RAG。有多种方法可以将独立检索结果合并为一个用于增强和生成的检索结果。最简单的方法是将它们全部合并并传递给多模态模型。更常见的是使用一个“重新排序”模型或系统设计用于根据与查询的相关性组织数据。我计划在未来的文章中介绍重新排序。如果你希望能够构建和优化多种模型以适应不同的模态或者你只是使用现有建模解决方案中不可用的模态那么这将很有用。在Google Vertex中实现多模态RAG现在我们已经对多模态 RAG 有了大致的了解让我们用一个简单的例子来实验一下。我们将对三部分信息进行检索我用不佳的发音说“我最喜欢的竖琴家是Turlough O’Carolan”的音频文件包含Lorenz Attractor图片的图像维基百科文章《西线无战事》的摘录使用这些数据我们将构建一个简单的RAG系统来回答问题“谁是我最喜欢的竖琴家”完整代码可在此找到https://github.com/DanielWarfield1/MLWritingAndResearch/blob/main/MultimodalRAG.ipynb。设置首先让我们进行一些准备工作。我们将使用pydub来处理音频!pip install pydub然后我们可以配置API密钥以使用Google Gemini。importosimportgoogle.generativeaiasgenaifromgoogle.colabimportuserdata os.environ[GOOGLE_API_KEY]userdata.get(GeminiAPIKey)genai.configure(api_keyos.environ[GOOGLE_API_KEY])下载数据我把所有文件都放在我的 GitHub repo 中所以我们可以直接从那里下载。首先我们可以从数据集中下载图像并将其保存到文件系统以备后用。importrequestsfromPILimportImagefromIPython.displayimportdisplayimportos# Loading imageurlhttps://github.com/DanielWarfield1/MLWritingAndResearch/blob/main/Assets/Multimodal/MMRAG/Lorenz_Ro28-200px.png?rawtrueresponserequests.get(url,streamTrue)imageImage.open(response.raw).convert(RGB)# Save the image locally as JPGsave_pathimage.jpgimage.save(save_path,JPEG)display(image)然后我们可以下载音频文件frompydubimportAudioSegmentimportnumpyasnpimportioimportmatplotlib.pyplotaspltimportwaveimportrequests# Downloading audio fileurlhttps://github.com/DanielWarfield1/MLWritingAndResearch/blob/main/Assets/Multimodal/MMRAG/audio.mp3?rawtrueresponserequests.get(url)audio_dataio.BytesIO(response.content)# Converting to wav and loadingaudio_segmentAudioSegment.from_file(audio_data,formatmp3)# Downsampling to 16000 Hz#(this is necessary because a future model requires it to be at 16000Hz)sampling_rate16000audio_segmentaudio_segment.set_frame_rate(sampling_rate)# Exporting the downsampled audio to a wav file in memorywav_dataio.BytesIO()audio_segment.export(wav_data,formatwav)wav_data.seek(0)# Back to beginning of IO for readingwav_filewave.open(wav_data,rb)# converting the audio data to a numpy arrayframeswav_file.readframes(-1)audio_waveformnp.frombuffer(frames,dtypenp.int16).astype(np.float32)# Rendering audio waveformplt.plot(audio_waveform)plt.title(Audio Waveform)plt.xlabel(Sample Index)plt.ylabel(Amplitude)plt.show()最后是我们的维基百科文本摘录importrequests# URL of the text fileurlhttps://github.com/DanielWarfield1/MLWritingAndResearch/blob/main/Assets/Multimodal/MMRAG/Wiki.txt?rawtrueresponserequests.get(url)text_dataresponse.text# truncating length for compatability with an encoder that accepts a small context# a different encoder could be used which allows for larger context lengthstext_datatext_data[:300]print(text_data)现在我们有了一个音频文件_其中包含我说出我最喜欢的竖琴家是谁_以及一个图像和文本文件。将音频转换为文本可以找到支持音频、图像和文本的编码器但它们比仅支持图像和文本的编码器要复杂一些。我计划写一篇关于Google Vertex的综合文章测试这些不太常见的数据科学应用/模态的极限。为了简化我们的操作现在我们将使用语音转文本模型将音频转为文本。importtorchfromtransformersimportSpeech2TextProcessor,Speech2TextForConditionalGeneration#the model that generates text based on speech audiomodelSpeech2TextForConditionalGeneration.from_pretrained(facebook/s2t-medium-librispeech-asr)#a processor that gets everything set upprocessorSpeech2TextProcessor.from_pretrained(facebook/s2t-medium-librispeech-asr)#passing through modelinputsprocessor(audio_waveform,sampling_ratesampling_rate,return_tensorspt)generated_idsmodel.generate(inputs[input_features],attention_maskinputs[attention_mask])#turning model output into textaudio_transcriptionprocessor.batch_decode(generated_ids,skip_special_tokensTrue)[0]audio_transcription如你所见语音转文本的翻译效果并不理想。Turlough O’Carolan 是17世纪的凯尔特竖琴家我根本不知道怎么发音。我尝试了几次因此转录结果非常荒谬。嵌入现在我们已经将音频转换为文本表示可以使用CLIP风格模型对图像和文本进行编码。如果你不熟悉CLIP风格模型它们是一种理解如何表示图像和文本使得相似的事物具有相似向量的模型。我有一篇关于这个主题的文章CLIP直观且详尽地解释https://towardsdatascience.com/clip-intuitively-and-exhaustively-explained-1d02c07dbf40我们可以使用其中一种来编码我们的图像和文本。首先让我们定义我们的查询querywho is my favorite harpist?然后让我们用 huggingface 的CLIP风格模型嵌入所有内容。fromtransformersimportCLIPProcessor,CLIPModel# Load the model and processormodelCLIPModel.from_pretrained(openai/clip-vit-base-patch32)processorCLIPProcessor.from_pretrained(openai/clip-vit-base-patch32)# Encode the imageinputsprocessor(imagesimage,return_tensorspt)image_embeddingsmodel.get_image_features(**inputs)# Encode the textinputsprocessor(text[query,audio_transcription,text_data],return_tensorspt,paddingTrue)text_embeddingsmodel.get_text_features(**inputs)接下来我们可以解包这些结果获取文本、图像、音频和查询的编码并计算数据与查询之间的差异。在这种情况下我们将使用余弦相似度它本质上是两个向量之间角度的度量。对于余弦相似度如果两个向量指向相同的方向它们的余弦相似度就很高。importtorchfromtorch.nn.functionalimportcosine_similarity# unpacking individual embeddingsimage_embeddingimage_embeddings[0]query_embeddingtext_embeddings[0]audio_embeddingtext_embeddings[1]text_embeddingtext_embeddings[2]# Calculate cosine similaritycos_sim_query_imagecosine_similarity(query_embedding.unsqueeze(0),image_embedding.unsqueeze(0)).item()cos_sim_query_audiocosine_similarity(query_embedding.unsqueeze(0),audio_embedding.unsqueeze(0)).item()cos_sim_query_textcosine_similarity(query_embedding.unsqueeze(0),text_embedding.unsqueeze(0)).item()# Print the resultsprint(fCosine Similarity between query and image embedding: {cos_sim_query_image:.4f})print(fCosine Similarity between query and audio embedding: {cos_sim_query_audio:.4f})print(fCosine Similarity between query and text embedding: {cos_sim_query_text:.4f})在这里我们可以看到从音频转录得到的嵌入被认为是最相关的。RAG检索增强生成现在我们有了每个数据的嵌入我们可以进行“检索增强生成”。检索找到与查询最相关的内容。增强将这些内容与查询一起放入语言模型的提示中。生成将其传递给语言模型生成答案。在这个简化的示例中我们可以使用一些if语句来实现这一点# putting all the similarities in a listsimilarities[cos_sim_query_image,cos_sim_query_audio,cos_sim_query_text]resultNoneifmax(similarities)cos_sim_query_image:#image most similar, augmenting with imagemodelgenai.GenerativeModel(gemini-1.5-pro)resultmodel.generate_content([query,Image.open(image.jpeg)])elifmax(similarities)cos_sim_query_audio:#audio most similar, augmenting with audio. Here Im using the transcript#rather than the audio itselfmodelgenai.GenerativeModel(gemini-1.5-pro)resultmodel.generate_content([query,audio transcript (may have inaccuracies): audio_transcription])elifmax(similarities)cos_sim_query_text:#text most similar, augmenting with textmodelgenai.GenerativeModel(gemini-1.5-pro)resultmodel.generate_content([query,text_data])print(result.text)Gemini确实得为你爆料一下。结论虽然在这个快速变化的领域很难说任何事情但似乎多模态RAG可能是即将到来的人工智能产品化浪潮中的一项关键技能。我认为可以公平地说RAG作为一个整体无论是多模式还是其他方式都将随着技术的需求将技术水平推向新的高度并且新的构建范式会变得更加容易接近。在目前的多模态RAG中我们触及了所有的重点我们简要探讨了RAG和多模态。我们探讨了三种多模态RAG的方法共享向量空间、单一基础模态和独立检索。然后我们使用基础模态和共享向量空间方法的组合自己实现了一个简单的多模态RAG示例。最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】