RAG全攻略:從零構(gòu)建跨模態(tài)檢索增強系統(tǒng),小白必學(xué)大模型技術(shù)!)
前言多模態(tài)檢索增強生成_Multimodal Retrieval Augmented Generation簡稱RAG_是一種新興的設(shè)計范式允許AI模型與文本、圖像、視頻等多種信息存儲接口進行交互。在探討這個主題時我們首先會介紹什么是檢索增強生成_RAG_多模態(tài)的概念以及如何將兩者結(jié)合以構(gòu)建現(xiàn)代多模態(tài)RAG系統(tǒng)。在理解了多模態(tài)RAG的基本概念后我們將使用Google Gemini和一種類似CLIP的編碼模型來構(gòu)建一個多模態(tài)RAG系統(tǒng)。檢索增強生成簡介在介紹多模態(tài)RAG之前我們先簡單了解一下傳統(tǒng)的檢索增強生成(RAG)。基本上RAG的概念是找到與用戶查詢相關(guān)的信息然后將這些信息注入到提示中并傳遞給語言模型。RAG系統(tǒng)的基本原理是根據(jù)用戶的查詢檢索相關(guān)信息然后將這些信息與用戶的查詢結(jié)合_稱為增強_后傳遞給語言模型。RAG系統(tǒng)的檢索通常是通過“嵌入”實現(xiàn)的。基本上為了嵌入某些內(nèi)容我們使用高級AI模型將信息轉(zhuǎn)換為代表該信息的向量。嵌入的概念圖AI模型會提取一些文本序列并創(chuàng)建一個代表該文本序列的向量。這個過程是通過一組參考文檔以及用戶的查詢來完成的。可以計算這些向量之間的距離文檔與用戶查詢之間距離最小的被認(rèn)為是最相關(guān)的。檢索的概念圖。這里事件列表被認(rèn)為是最相關(guān)的因為它與用戶查詢的距離最小。一旦RAG系統(tǒng)檢索到足夠相關(guān)的信息用戶的查詢和相關(guān)文檔將用于構(gòu)建一個增強提示然后將其傳遞給語言模型進行生成。Answer the customers prompt based on the folowing context:context:{document title}{document content}...prompt:{prompt}這種通用系統(tǒng)通常預(yù)設(shè)整個知識庫由可以傳遞給語言模型的文本組成但許多知識來源不僅僅是文本。可能還有音頻、視頻、圖像等。這就是多模態(tài)RAG的作用。在討論多模態(tài)RAG之前讓我們簡要探討一下多模態(tài)的概念。多模態(tài)在數(shù)據(jù)科學(xué)中“模態(tài)”本質(zhì)上是數(shù)據(jù)的一種類型。文本、圖像、音頻、視頻、表格等都可以被視為不同的“模態(tài)”。長期以來這些不同類型的數(shù)據(jù)被視為彼此分離數(shù)據(jù)科學(xué)家需要為文本、視頻等分別創(chuàng)建模型。近年來這種概念逐漸消失能夠理解和處理多種模態(tài)的模型變得更加高效且易于訪問。這些能夠理解多種數(shù)據(jù)類型的模型通常被稱為“多模態(tài)模型”。多模態(tài)模型的概念通常圍繞“聯(lián)合嵌入”展開。基本上聯(lián)合嵌入是一種建模策略迫使模型同時學(xué)習(xí)不同類型的數(shù)據(jù)。這個領(lǐng)域的標(biāo)志性論文之一是CLIP它創(chuàng)建了一個能夠處理圖像和文本任務(wù)的強大模型。CLIP風(fēng)格的模型使用復(fù)雜的訓(xùn)練過程使多個模型組件協(xié)同工作以理解圖像和文本。自CLIP以來各種建模策略已被創(chuàng)建以某種方式對齊圖像和文本。我介紹了這個領(lǐng)域的各種模型但這些只是冰山一角。到處都有可以處理多種類型的數(shù)據(jù)新模型問世。多模態(tài)和RAG的演變引發(fā)了AI的新趨勢在多模態(tài)中進行RAG。多模態(tài)RAG多模態(tài)RAG的概念是允許RAG系統(tǒng)以某種方式將多種形式的信息注入多模態(tài)模型中。因此多模態(tài) RAG 系統(tǒng)不僅可以根據(jù)用戶提示檢索文本片段還可以檢索文本、圖像、視頻和其他不同模態(tài)的數(shù)據(jù)。多模態(tài)RAG的核心概念。它與普通RAG類似但現(xiàn)在可以檢索來自多種模態(tài)的信息并傳遞給語言模型。目前有三種流行的方法可以實現(xiàn)多模態(tài)RAG。方法一共享向量空間多模態(tài)RAG的一種方法是使用能夠處理多種模態(tài)的嵌入_類似于前面討論的CLIP_。基本上你可以通過一組設(shè)計為相互協(xié)作的編碼器傳遞數(shù)據(jù)然后在所有模態(tài)中檢索與用戶查詢最相似的數(shù)據(jù)。使用多模態(tài)嵌入系統(tǒng)的多模態(tài)RAG例如Google Vertex提供的編碼器。這些編碼器旨在協(xié)同工作將來自不同模態(tài)的數(shù)據(jù)放置在同一個嵌入中。以更好地了解其實際應(yīng)用。方法二單一基礎(chǔ)模態(tài)多模態(tài)RAG的另一種方法是將所有數(shù)據(jù)模態(tài)轉(zhuǎn)換為單一模態(tài)通常是文本。使用基礎(chǔ)模態(tài)的多模態(tài)RAG。所有模態(tài)在傳遞到單個編碼器之前都會轉(zhuǎn)換為單個模態(tài)。我在一家公司工作該公司在一個更大的產(chǎn)品中采用了這種策略_我們稱之為“多模態(tài)轉(zhuǎn)換”_。雖然這種策略在理論上存在信息在轉(zhuǎn)換過程中丟失的風(fēng)險但實際上我們發(fā)現(xiàn)對于許多應(yīng)用來說這種方法以相對較小的復(fù)雜性實現(xiàn)了非常高質(zhì)量的結(jié)果。方法三獨立檢索第三種方法是使用一組旨在處理不同模態(tài)的模型。在這種情況下你會在不同的模型上多次進行檢索然后結(jié)合它們的結(jié)果。使用獨立檢索的多模態(tài)RAG。有多種方法可以將獨立檢索結(jié)果合并為一個用于增強和生成的檢索結(jié)果。最簡單的方法是將它們?nèi)亢喜⒉鬟f給多模態(tài)模型。更常見的是使用一個“重新排序”模型或系統(tǒng)設(shè)計用于根據(jù)與查詢的相關(guān)性組織數(shù)據(jù)。我計劃在未來的文章中介紹重新排序。如果你希望能夠構(gòu)建和優(yōu)化多種模型以適應(yīng)不同的模態(tài)或者你只是使用現(xiàn)有建模解決方案中不可用的模態(tài)那么這將很有用。在Google Vertex中實現(xiàn)多模態(tài)RAG現(xiàn)在我們已經(jīng)對多模態(tài) RAG 有了大致的了解讓我們用一個簡單的例子來實驗一下。我們將對三部分信息進行檢索我用不佳的發(fā)音說“我最喜歡的豎琴家是Turlough O’Carolan”的音頻文件包含Lorenz Attractor圖片的圖像維基百科文章《西線無戰(zhàn)事》的摘錄使用這些數(shù)據(jù)我們將構(gòu)建一個簡單的RAG系統(tǒng)來回答問題“誰是我最喜歡的豎琴家”完整代碼可在此找到https://github.com/DanielWarfield1/MLWritingAndResearch/blob/main/MultimodalRAG.ipynb。設(shè)置首先讓我們進行一些準(zhǔn)備工作。我們將使用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])下載數(shù)據(jù)我把所有文件都放在我的 GitHub repo 中所以我們可以直接從那里下載。首先我們可以從數(shù)據(jù)集中下載圖像并將其保存到文件系統(tǒng)以備后用。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)現(xiàn)在我們有了一個音頻文件_其中包含我說出我最喜歡的豎琴家是誰_以及一個圖像和文本文件。將音頻轉(zhuǎn)換為文本可以找到支持音頻、圖像和文本的編碼器但它們比僅支持圖像和文本的編碼器要復(fù)雜一些。我計劃寫一篇關(guān)于Google Vertex的綜合文章測試這些不太常見的數(shù)據(jù)科學(xué)應(yīng)用/模態(tài)的極限。為了簡化我們的操作現(xiàn)在我們將使用語音轉(zhuǎn)文本模型將音頻轉(zhuǎn)為文本。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如你所見語音轉(zhuǎn)文本的翻譯效果并不理想。Turlough O’Carolan 是17世紀(jì)的凱爾特豎琴家我根本不知道怎么發(fā)音。我嘗試了幾次因此轉(zhuǎn)錄結(jié)果非常荒謬。嵌入現(xiàn)在我們已經(jīng)將音頻轉(zhuǎn)換為文本表示可以使用CLIP風(fēng)格模型對圖像和文本進行編碼。如果你不熟悉CLIP風(fēng)格模型它們是一種理解如何表示圖像和文本使得相似的事物具有相似向量的模型。我有一篇關(guān)于這個主題的文章CLIP直觀且詳盡地解釋https://towardsdatascience.com/clip-intuitively-and-exhaustively-explained-1d02c07dbf40我們可以使用其中一種來編碼我們的圖像和文本。首先讓我們定義我們的查詢querywho is my favorite harpist?然后讓我們用 huggingface 的CLIP風(fēng)格模型嵌入所有內(nèi)容。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)接下來我們可以解包這些結(jié)果獲取文本、圖像、音頻和查詢的編碼并計算數(shù)據(jù)與查詢之間的差異。在這種情況下我們將使用余弦相似度它本質(zhì)上是兩個向量之間角度的度量。對于余弦相似度如果兩個向量指向相同的方向它們的余弦相似度就很高。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})在這里我們可以看到從音頻轉(zhuǎn)錄得到的嵌入被認(rèn)為是最相關(guān)的。RAG檢索增強生成現(xiàn)在我們有了每個數(shù)據(jù)的嵌入我們可以進行“檢索增強生成”。檢索找到與查詢最相關(guān)的內(nèi)容。增強將這些內(nèi)容與查詢一起放入語言模型的提示中。生成將其傳遞給語言模型生成答案。在這個簡化的示例中我們可以使用一些if語句來實現(xiàn)這一點# 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確實得為你爆料一下。結(jié)論雖然在這個快速變化的領(lǐng)域很難說任何事情但似乎多模態(tài)RAG可能是即將到來的人工智能產(chǎn)品化浪潮中的一項關(guān)鍵技能。我認(rèn)為可以公平地說RAG作為一個整體無論是多模式還是其他方式都將隨著技術(shù)的需求將技術(shù)水平推向新的高度并且新的構(gòu)建范式會變得更加容易接近。在目前的多模態(tài)RAG中我們觸及了所有的重點我們簡要探討了RAG和多模態(tài)。我們探討了三種多模態(tài)RAG的方法共享向量空間、單一基礎(chǔ)模態(tài)和獨立檢索。然后我們使用基礎(chǔ)模態(tài)和共享向量空間方法的組合自己實現(xiàn)了一個簡單的多模態(tài)RAG示例。最后為什么要學(xué)AI大模型當(dāng)下??智能市場迎來了爆發(fā)期并逐漸進?以??通?智能AGI為主導(dǎo)的新時代。企業(yè)紛紛官宣“ AI ”戰(zhàn)略為新興技術(shù)?才創(chuàng)造豐富的就業(yè)機會?才缺?將達 400 萬DeepSeek問世以來生成式AI和大模型技術(shù)爆發(fā)式增長讓很多崗位重新成了炙手可熱的新星崗位薪資遠超很多后端崗位在程序員中穩(wěn)居前列。與此同時AI與各行各業(yè)深度融合飛速發(fā)展成為炙手可熱的新風(fēng)口企業(yè)非常需要了解AI、懂AI、會用AI的員工紛紛開出高薪招聘AI大模型相關(guān)崗位。最近很多程序員朋友都已經(jīng)學(xué)習(xí)或者準(zhǔn)備學(xué)習(xí) AI 大模型后臺也經(jīng)常會有小伙伴咨詢學(xué)習(xí)路線和學(xué)習(xí)資料我特別拜托北京清華大學(xué)學(xué)士和美國加州理工學(xué)院博士學(xué)位的魯為民老師給大家這里給大家準(zhǔn)備了一份涵蓋了AI大模型入門學(xué)習(xí)思維導(dǎo)圖、精品AI大模型學(xué)習(xí)書籍手冊、視頻教程、實戰(zhàn)學(xué)習(xí)等錄播視頻全系列的學(xué)習(xí)資料這些學(xué)習(xí)資料不僅深入淺出而且非常實用讓大家系統(tǒng)而高效地掌握AI大模型的各個知識點。這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費領(lǐng)取【保證100%免費】AI大模型系統(tǒng)學(xué)習(xí)路線在面對AI大模型開發(fā)領(lǐng)域的復(fù)雜與深入精準(zhǔn)學(xué)習(xí)顯得尤為重要。一份系統(tǒng)的技術(shù)路線圖不僅能夠幫助開發(fā)者清晰地了解從入門到精通所需掌握的知識點還能提供一條高效、有序的學(xué)習(xí)路徑。但知道是一回事做又是另一回事初學(xué)者最常遇到的問題主要是理論知識缺乏、資源和工具的限制、模型理解和調(diào)試的復(fù)雜性在這基礎(chǔ)上找到高質(zhì)量的學(xué)習(xí)資源不浪費時間、不走彎路又是重中之重。AI大模型入門到實戰(zhàn)的視頻教程項目包看視頻學(xué)習(xí)是一種高效、直觀、靈活且富有吸引力的學(xué)習(xí)方式可以更直觀地展示過程能有效提升學(xué)習(xí)興趣和理解力是現(xiàn)在獲取知識的重要途徑光學(xué)理論是沒用的要學(xué)會跟著一起敲要動手實操才能將自己的所學(xué)運用到實際當(dāng)中去這時候可以搞點實戰(zhàn)案例來學(xué)習(xí)。海量AI大模型必讀的經(jīng)典書籍PDF閱讀AI大模型經(jīng)典書籍可以幫助讀者提高技術(shù)水平開拓視野掌握核心技術(shù)提高解決問題的能力同時也可以借鑒他人的經(jīng)驗。對于想要深入學(xué)習(xí)AI大模型開發(fā)的讀者來說閱讀經(jīng)典書籍是非常有必要的。600AI大模型報告實時更新這套包含640份報告的合集涵蓋了AI大模型的理論研究、技術(shù)實現(xiàn)、行業(yè)應(yīng)用等多個方面。無論您是科研人員、工程師還是對AI大模型感興趣的愛好者這套報告合集都將為您提供寶貴的信息和啟示。AI大模型面試真題答案解析我們學(xué)習(xí)AI大模型必然是想找到高薪的工作下面這些面試題都是總結(jié)當(dāng)前最新、最熱、最高頻的面試題并且每道題都有詳細的答案面試前刷完這套面試題資料小小offer不在話下這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費領(lǐng)取【保證100%免費】