多模態(tài)LLM+RAG:突破生成瓶頸的下一代AI架構(gòu)革命? 原創(chuàng)
通過整合文本、圖像、音頻等數(shù)據(jù),多模態(tài)大型語言模型(MLLM)開始突破傳統(tǒng)RAG的文本局限,賦予AI感知能力。其核心架構(gòu)采用CLIP、Whisper等編碼器實現(xiàn)跨模態(tài)語義統(tǒng)一,通過投影層對齊多模態(tài)信息。不過,多模態(tài)大型語言模型的評估需要綜合檢索質(zhì)量、生成忠實度及跨模態(tài)一致性等一系列指標實現(xiàn)。
簡介
基于我以前關(guān)于LLM、檢索增強生成(RAG)和高級RAG技術(shù)的文章中的基礎概念,本文將著手探討下一個領(lǐng)域——多模態(tài)LLM。
我們將首先揭開多模態(tài)LLM核心原理的神秘面紗,探索該領(lǐng)域的突出模型,然后深入研究多模態(tài)LLM RAG和關(guān)鍵評估指標的強大組合。
誠然,傳統(tǒng)的LLM RAG具有一定的開創(chuàng)性,但也面臨著根本的限制,因為它幾乎完全以文本為中心。
- 擁有RAG的大型語言模型可以閱讀任何文本,但缺乏對物理世界的感知。他們無法直接解讀圖像、音頻或視頻。?
- 許多現(xiàn)實世界的問題和查詢都涉及隱式的視覺或聽覺信息。如果用戶在提供一張出問題的機器的圖片的同時詢問“這里出了什么問題?”,純文本的RAG只能處理文字,而無法處理視覺信息。?
- 文本之外還存在大量有價值的信息(例如,醫(yī)學掃描數(shù)據(jù)、工程圖、監(jiān)控錄像、動物聲音)。純文本的RAG無法直接訪問、理解或檢索這些豐富的非文本數(shù)據(jù)源。?
- 要將非文本數(shù)據(jù)與純文本RAG結(jié)合使用,你必須先將其轉(zhuǎn)換為文本(例如,描述圖像、轉(zhuǎn)錄音頻)。這個過程通常會丟失原始模態(tài)中固有的關(guān)鍵細微差別和細節(jié)。?
多模態(tài)大型語言模型通過賦予人工智能“感官”解決了這些問題。
- 它們集成了專門的編碼器(用于圖像、音頻、視頻等),將非文本數(shù)據(jù)轉(zhuǎn)換為LLM可以理解和處理的數(shù)字表示(嵌入)。?
- 然后,融合層將這些多模態(tài)嵌入與文本嵌入對齊并組合,從而創(chuàng)建對整個上下文的統(tǒng)一理解。?
什么是多模態(tài)大型語言模型?
多模態(tài)大型語言模型(MLLM)是一種先進的AI模型,能夠處理和生成跨多種數(shù)據(jù)模態(tài)的信息。與主要處理文本的傳統(tǒng)LLM不同,MLLM可以理解和推理各種類型的數(shù)據(jù),例如:
- 文字:書面語言。?
- 圖像:視覺數(shù)據(jù)。?
- 音頻:聲音和語音。?
- 視頻:圖像和音頻序列。?
- 以及可能的其他模式,如傳感器數(shù)據(jù)、熱圖像等。?
與單模態(tài)LLM的關(guān)鍵區(qū)別在于,它能夠跨不同形式的輸入進行聯(lián)合理解和推理,有時還能生成多模態(tài)輸出。
例如,MLLM可以將圖像和文本問題作為輸入,并給出關(guān)于圖像的文本答案。一些高級MLLM甚至可以從文本生成圖像,或提供視頻的文本描述。
使用多模態(tài)大型語言模型(LLM),用戶的效率將顯著提高,因為他們可以自然地進行交流,就像與擁有多種感官的人類專家交流一樣。不同信息類型之間的障礙被消除了。
例如,昨天發(fā)生了這樣的事:我孩子的自行車鏈條老是掉,而我又不是自行車修理工。
場景1:使用傳統(tǒng)的純文本大型語言模型(LLM)
你的提問:“我家孩子的自行車鏈條老是掉。我該怎么修?”
LLM的回答:針對各種可能導致鏈條脫落的原因(例如,變速器調(diào)整、鏈輪彎曲、鏈條磨損)提供通用的文字說明。它可能會問一些澄清性的問題,例如“這是單速自行車還是變速自行車?鏈條松了嗎?”,這些問題你可能很難用文字準確回答。
你費力地將自己看到的內(nèi)容轉(zhuǎn)化為大型語言模型(LLM)能夠理解的語言,而大型語言模型卻無法理解你看到的內(nèi)容。你可能會遵循錯誤的指示,或者陷入困境。
場景2:使用多模態(tài)大型語言模型(MLLM)
你的提問:(拍了一張自行車后撥鏈器和鏈條的照片,并標出了鏈條脫落的地方)“我孩子的自行車鏈條總是掉。通常是在他們換擋的時候。”
多模態(tài)大型語言模型的回答:
圖像理解:處理圖像,將自行車識別為齒輪自行車,注意變速器的類型(例如Shimano Tourney),并目視檢查鏈條張力和對準情況。
文本理解:處理你的文本查詢,理解“鏈條不斷脫落”和“當它們換檔時”。
融合與推理:結(jié)合視覺和文本信息來了解具體問題:換檔問題可能與變速器調(diào)整或電纜張力有關(guān)。
回復:“根據(jù)你孩子自行車的圖片,它配備了Shimano Tourney后撥,并且在變速過程中鏈條脫落,最常見的原因是后撥調(diào)節(jié)不當。你可能需要調(diào)整H(高)和L(低)限位螺釘,并可能需要調(diào)整線管張力調(diào)節(jié)器。”
找到變速器背面標有“H”和“L”的兩個小螺絲。
對于從外面掉下來的鏈條(最大的齒輪),你可能需要稍微松開“H”螺絲。
對于朝輻條(最小齒輪)脫落的鏈條,你可能需要稍微松開“L”形螺絲。
還要使用線管調(diào)節(jié)器檢查線管與變速器連接處的張力。如果你需要更多直觀的指導,我還可以為你提供一個簡短的視頻來演示這項具體的調(diào)整。
你可以自然地進行交流(展示和講述)。MLLM課程能夠立即理解具體組件類型,并根據(jù)你的具體情況提供精準、可操作的步驟,甚至預測后續(xù)需求(視頻)。這遠勝于通用的指導。
多模態(tài)大型語言模型(MLLM)的基礎模型
基礎模型是大規(guī)模通用神經(jīng)網(wǎng)絡,基于海量多樣化數(shù)據(jù)集進行訓練,旨在為各種下游應用奠定基礎。在機器學習學習模型(MLLM)的背景下,這些模型專門用于處理和生成跨多種數(shù)據(jù)模態(tài)(例如文本、圖像、音頻,有時還有視頻)的內(nèi)容,從而實現(xiàn)更自然、更多樣化的AI交互。
以下給出的是有關(guān)幾個非常知名的多模態(tài)大型語言模型模型的簡要總結(jié):
來源:代表性MLLM的時間表
- OpenAI(例如GPT-4o、GPT-4V):實時、語音原生、閃電般快速;擅長對話和交互式應用;被廣泛認為是多模態(tài)任務中最快、最先進的。
a.GPT-4o(“omni”):OpenAI的最新旗艦產(chǎn)品,專為跨文本、音頻和視覺的原生多模態(tài)設計,具有令人印象深刻的實時性能。它可以無縫地理解和生成文本、圖像和音頻。
b.GPT-4V(視覺):GPT-4o視覺功能的前身,允許GPT-4解釋和推理作為輸入的圖像。
- Google DeepMind(例如Gemini):專為多模態(tài)設計。Gemini Pro擁有龐大的上下文窗口和強大的跨模態(tài)推理能力。支持視頻和音頻的“長上下文理解”。
a.Gemini:Google功能最強大、原生的多模態(tài)模型,全新設計,可理解并操作文本、代碼、音頻、圖片和視頻。它提供多種尺寸(Ultra、Pro、Nano)。
- Meta(例如Llama家族-Llama 3、Llama 2):多語言、開源,針對多種語言任務和推理進行了優(yōu)化;非常適合定制和研究。
a.Llama 3.2的多模態(tài)模型(11B和90B)可以處理文本和圖像。這些模型可以執(zhí)行圖像字幕、視覺推理以及回答有關(guān)圖像的問題等任務。它還包含適用于邊緣設備的輕量級純文本模型。
b.Llama 3-V是一個獨立的開源多模態(tài)模型,其性能可與更大的模型相媲美。
- 阿里云(例如Qwen系列):阿里巴巴推出的一系列強大的開源和專有模型。低延遲、高性能,在代碼生成和實時任務方面表現(xiàn)出色;開源靈活性。
a.Qwen-VL:基礎視覺語言模型。
b.Qwen-VL-Chat:針對對話功能進行微調(diào)的版本,使其更適合交互式多模態(tài)應用程序。
- xAI(Grok):與X(Twitter)集成,實時信息處理,獨特的“思考”和“深度搜索”模式;擅長掌握最新的世界知識。
a.Grok-1.5V是我們的第一代多模態(tài)模型。除了強大的文本處理能力外,Grok現(xiàn)在還可以處理各種視覺信息,包括文檔、圖表、截圖和照片。
- Deepseek(例如Deepseek-V2、Deepseek-Coder):開源,擅長推理和長篇內(nèi)容,效率高,性價比高;在基準測試和RAG任務中表現(xiàn)強勁。?
- Deepseek-VLM將強大的視覺編碼器與大型語言模型主干相結(jié)合。
多模態(tài)大型語言模型(MLLM)架構(gòu)基礎
??資料來源??:多模態(tài)大型語言模型?
你可以將多模態(tài)大型語言模型想象為針對每種來源數(shù)據(jù)配備專門的“翻譯器”,所有信息都輸入到中央“大腦”(大型語言模型的核心架構(gòu))。
- 當你向它展示圖像時,視覺編碼器(如視覺轉(zhuǎn)換器)會將像素“翻譯”成LLM可以理解的語言——豐富的數(shù)字表示(嵌入)。?
- 當你播放音頻時,音頻編碼器(如Wav2Vec 2.0或Whisper)會將聲波“轉(zhuǎn)換”為數(shù)字表示或直接文本。?
- 所有這些翻譯后的“感官輸入”隨后被整合到一個融合層(Fusion Layer)中并進行對齊(例如,使用交叉注意力機制,就像C-Former所實現(xiàn)的那樣)。這一層幫助大型語言模型(LLM)理解不同信息之間的相互關(guān)聯(lián)(例如,“這只狗叫的聲音與這張狗的圖像相關(guān)”)。?
- 最后,LLM強大的生成核心處理這種統(tǒng)一的多模態(tài)理解,使其能夠根據(jù)組合輸入生成文本、圖像甚至新的音頻。?
典型的多模態(tài)大型語言模型(MLLM)架構(gòu)可以抽象為以下關(guān)鍵組件:
- 模態(tài)編碼器:這些是專門的神經(jīng)網(wǎng)絡,負責處理來自不同模態(tài)(例如圖像、音頻、視頻)的原始數(shù)據(jù),并將其轉(zhuǎn)換為嵌入。其目標是提取與每種模態(tài)內(nèi)容相關(guān)的特征。例如:
a.視覺編碼器:對于圖像輸入,通常使用CLIP的Vision、Transformer、ViT或OpenCLIP等模型。這些模型經(jīng)過預訓練,可以將視覺特征與文本描述進行匹配。它們以圖像作為輸入,并輸出一個表示圖像內(nèi)容的固定大小的向量嵌入。
b.音頻編碼器:對于音頻輸入,可以使用HuBERT或Whisper等模型。這些模型處理原始音頻波形并提取與聲音相關(guān)的特征,包括語音內(nèi)容、說話人身份和聲學特性。
c.視頻編碼器:視頻編碼器通常涉及視覺處理和時間處理的組合。模型可能使用3D、CNN或跨視頻幀加入注意力機制,以捕捉空間和時間信息。例如,視頻視覺轉(zhuǎn)換器的擴展。
- 預訓練大型語言模型LLM:這是大型語言模型MLLM的核心,它是一個基于Transformer的強大語言模型,已在海量文本數(shù)據(jù)上進行預訓練。它在理解和生成自然語言、推理和語境學習方面擁有強大的能力。例如:
a.Llama 3、GPT-3/4、Mistral、Gemini或Claude 3等模型作為LLM的主干,這些模型在預訓練階段學習了復雜的語言模式和世界知識。通過將來自模態(tài)編碼器的表征輸入到這個預訓練的LLM中,可以整合多模態(tài)特征。
- 模態(tài)接口(連接器):這是一個關(guān)鍵組件,它連接了模態(tài)編碼器(模態(tài)特定)的表征與預訓練的LLM所需的輸入格式(通常是token嵌入)。該接口將不同的模態(tài)對齊為一個LLM能夠理解和推理的共享表征。例如:
a.投影層:一個簡單而有效的接口可以是一個或多個線性層(多層感知器:MLP),它們將視覺、音頻或視頻編碼器的輸出嵌入投影到與LLM的詞嵌入相同的維度空間中。例如,LLaVA使用線性投影將視覺特征映射到LLM的嵌入空間。
b.Q-Former(查詢轉(zhuǎn)換器):與BLIP-2中的用法類似,它包含一組可學習的查詢標記,這些標記通過交叉注意力機制與視覺特征進行交互。Q-Former的輸出是一個固定長度的嵌入序列,可以輸入到LLM中。
- 生成器:一些MLLM被設計用于生成文本以外的模態(tài)輸出(例如,從文本生成圖像)。在這種情況下,一個可選的模態(tài)特定生成器會附加到LLM主干上。?
例如:
- 圖像生成器:像穩(wěn)定擴散(Stable Diffusion)或DALL-E的解碼器部分這樣的模型可以用作圖像生成器。LLM的輸出(以潛在向量或圖像標記的形式)可以輸入到該生成器中生成圖像。?
- 音頻生成器:類似地,可以使用VALL-E或其他文本轉(zhuǎn)語音模型等模型基于LLM的文本生成來生成音頻輸出。?
三種類型的連接器
模態(tài)接口(或稱“連接器”)在不同模態(tài)信息與大型語言模型(LLM)的整合過程中起著至關(guān)重要的作用。一般來說,連接器主要有三種類型:
基于投影的連接器(詞元級融合)
這些連接器使用相對簡單的變換,通常是線性層(多層感知器:MLP),將來自非文本模態(tài)(例如圖像嵌入)的特征嵌入投影到與LLM的文本詞元相同的嵌入空間中。然后,投影的特征被視為偽詞元,并與實際的文本詞元連接起來,再輸入到LLM中。這實現(xiàn)了詞元級的融合,因為LLM的Transformer層像處理常規(guī)詞元嵌入一樣處理這些投影的特征。
- 模態(tài)編碼器產(chǎn)生特征向量。?
- 該向量通過一個或多個投影層(MLP)。?
- 投影的輸出被視為一系列“視覺標記”(或“音頻標記”等)。?
- 這些偽標記與嵌入的文本標記連接在一起。?
- 標記的組合序列被輸入到LLM中。?
舉例:
LLaVA利用一到兩個線性層來投射來自預訓練視覺編碼器(CLIP的ViT)的視覺特征,使其維度與Vicuna或Llama LLM的詞向量對齊。然后,這些投射的視覺特征會被添加到文本輸入的前面。
基于查詢的連接器(標記級融合)
這些連接器使用一組可學習的查詢向量(通常稱為Q-Former),與非文本模態(tài)編碼器使用交叉注意機制提取的特征進行交互。查詢向量“查詢”視覺、音頻或視頻特征以提取相關(guān)信息。此交互的輸出是一個固定長度的嵌入向量序列,然后將其視為偽標記,并與文本標記一起輸入到LLM中。這也是一種標記級融合的形式,因為LLM將這些生成的嵌入向量作為其輸入序列的一部分進行處理。
- 模態(tài)編碼器產(chǎn)生一組特征向量。?
- 初始化一小組可學習的查詢向量。?
- 這些查詢向量使用交叉注意層來關(guān)注模態(tài)特征。?
- 交叉注意層的輸出(更新的查詢向量)表示非文本模態(tài)的壓縮和信息表示。?
- 這些查詢輸出向量被視為“模態(tài)標記”序列。?
- 這些偽標記與嵌入的文本標記連接并輸入到LLM中。?
舉例:
BLIP-2使用Q-Former,它將凍結(jié)圖像編碼器的輸出和一組可學習的查詢嵌入作為輸入。通過多個Transformer模塊(這些模塊對查詢具有自注意力機制,并在查詢和圖像特征之間具有交叉注意力機制),Q-Former提取出圖像的固定長度表示。然后,這些嵌入被輸入到凍結(jié)的LLM中。
基于融合的連接器(特征級融合)
與前兩種將非文本模態(tài)特征轉(zhuǎn)換為標記以便與文本順序處理的類型不同,基于融合的連接器能夠在LLM自身層內(nèi)實現(xiàn)更深層次的特征交互和融合。這通常是通過在LLM的Transformer架構(gòu)中插入新層或修改現(xiàn)有的注意力機制來實現(xiàn)的,以允許文本特征與其他模態(tài)特征之間的直接交互。
- 模態(tài)編碼器產(chǎn)生特征向量。?
- 文本輸入通過LLM的初始層進行處理以獲得文本特征嵌入。?
- LLM的Transformer模塊中引入了專門的融合層(例如交叉注意力層或改進的自注意力層)。這些層允許文本特征在不同的處理階段關(guān)注非文本模態(tài)特征(反之亦然)。?
- 然后,融合的特征由LLM的后續(xù)層進行處理,以進行推理和生成。
視覺轉(zhuǎn)換器
視覺轉(zhuǎn)換器(ViT)是一種神經(jīng)網(wǎng)絡架構(gòu),它將Transformer模型的自注意力機制直接應用于圖像。與使用卷積層處理圖像局部區(qū)域的傳統(tǒng)卷積神經(jīng)網(wǎng)絡(CNN)不同,ViT將圖像視為一系列圖像塊。
??資料來源??:用于圖像分類的視覺轉(zhuǎn)換器?
以下是其工作原理的詳細說明:
- 輸入圖像被分成固定大小、不重疊的方形塊網(wǎng)格。?
- 每個二維圖像塊被展平為一維向量。然后,這些展平的塊通過線性變換投影到低維空間,從而創(chuàng)建塊嵌入。此步驟類似于在自然語言處理(NLP)中將單詞轉(zhuǎn)換為標記嵌入。?
- 為了保留因展平圖像塊并將其視為序列而丟失的空間信息,我們在圖像塊嵌入中添加了可學習的位置嵌入。這些編碼為模型提供了圖像中每個圖像塊的原始位置信息。?
- 現(xiàn)在,包含位置信息的塊嵌入序列將通過標準Transformer編碼器進行傳輸。?
該編碼器由多層結(jié)構(gòu)組成,每層包含多頭自注意力(MSA)和前饋網(wǎng)絡(FFN)。MSA機制允許模型關(guān)注不同的塊,并捕捉它們在整個圖像中的關(guān)系。FFN則進一步處理這些已關(guān)注的特征。
對于圖像分類等任務,通常會在序列前面添加一個特殊的可學習分類標記。然后,Transformer編碼器與該標記對應的輸出會被輸入到分類頭(通常是一個簡單的多層感知器(MLP)中,以預測輸出。對于物體檢測或分割等其他任務,則使用不同的分類頭來處理編碼器的輸出。
例如:假設你想對一張貓的圖像進行分類。ViT會將圖像分成多個塊(例如,16x16像素)。每個塊會被展平并嵌入。位置信息會被添加到這些嵌入中。嵌入的塊序列隨后會經(jīng)過Transformer編碼器,其中自注意力機制會讓模型學習貓的不同部位(例如,耳朵、胡須、尾巴)彼此之間以及與整體圖像之間的關(guān)系。最后,分類頭會使用學習到的表征來確定圖像中包含一只貓。
ViT可應用于各種計算機視覺任務,包括:
- 圖像分類:將圖像分類為預定義的類別(例如,狗、貓、汽車)。?
- 物體檢測:識別和定位圖像中的多個物體。?
- 圖像分割:根據(jù)圖像所代表的對象或區(qū)域?qū)D像劃分為多個片段。?
- 動作識別:識別視頻中的人類動作。?
- 圖像字幕:為圖像生成文本描述。?視覺轉(zhuǎn)換器與卷積神經(jīng)網(wǎng)絡之間的根本區(qū)別在于它們捕獲空間信息和依賴關(guān)系的方法:?
- 使用在圖像上滑動的卷積濾波器來捕捉局部特征。它們通過逐步將局部特征組合成更深層中更復雜的特征,構(gòu)建出層次化的表征。CNN對局部性和平移等變性具有歸納性偏好。?
- ViT(視覺轉(zhuǎn)換器):將圖像視為一系列圖像塊,并使用自注意力機制捕捉任意一對圖像塊之間的全局依賴關(guān)系,無論它們之間的距離如何。這類模型的歸納偏差較弱,更依賴于大型數(shù)據(jù)集來學習空間層次和關(guān)系。?視覺轉(zhuǎn)換器與多模態(tài)基礎LLM的集成具有以下幾個關(guān)鍵優(yōu)勢:?
- Transformer提供了一個通用的架構(gòu)主干,可以處理順序數(shù)據(jù),無論是文本標記還是圖像塊嵌入。?
- ViTs中的自注意力機制使模型能夠捕捉圖像中的長距離依賴關(guān)系和全局上下文。這對于多模態(tài)任務至關(guān)重要,因為理解整體場景和對象之間的關(guān)系對于生成相關(guān)文本或回答問題至關(guān)重要。?
- 與自然語言處理(NLP)類似,視覺訓練(ViT)也受益于海量圖像數(shù)據(jù)集的預訓練。學習到的視覺表征可以遷移并微調(diào),用于各種下游多模態(tài)任務,從而提升性能并減少對特定任務訓練數(shù)據(jù)的需求。?
- Transformer以其隨著數(shù)據(jù)和模型大小增加而具有的可擴展性而聞名,這對于構(gòu)建能夠處理現(xiàn)實世界多模態(tài)數(shù)據(jù)復雜性的大型基礎多模態(tài)模型至關(guān)重要。?
- 通過將圖像和文本嵌入到公共表示空間(通常由Transformer架構(gòu)實現(xiàn)),多模態(tài)模型可以更有效地學習視覺和文本信息之間的關(guān)系和對齊方式,從而實現(xiàn)圖像字幕等任務,?
- 視覺問答和文本到圖像生成。?
編碼器
對于多模態(tài)大型語言模型(LLM),使用不同的專用編碼器來處理各種數(shù)據(jù)類型(模態(tài)),例如圖像、音頻、視頻和代碼。
接下來將給出每種模態(tài)的常用模型和技術(shù)的詳細介紹。
對比語言-圖像預訓練(CLIP)
CLIP是由OpenAI開發(fā)的多模態(tài)模型,它通過將視覺概念與自然語言聯(lián)系起來進行學習。
與傳統(tǒng)的圖像分類模型(這些模型訓練用于預測一組固定的標簽)不同,CLIP學習的是圖像和文本共享的嵌入空間。這使得它能夠理解視覺內(nèi)容和文本描述之間的語義關(guān)系。
來源:OpenAI??博客??CLIP?
讓我們探索一下CLIP的工作原理:
- 雙編碼器架構(gòu):CLIP采用兩個獨立的編碼器網(wǎng)絡。
a.圖像編碼器:該網(wǎng)絡將圖像作為輸入,并將其轉(zhuǎn)換為表示其視覺特征的高維向量。CLIP嘗試使用ResNet和VisionT ransformer(ViT)架構(gòu)作為圖像編碼器。
b.文本編碼器:該網(wǎng)絡以文本描述(標題或標簽)作為輸入,并將其編碼為表示其語義的高維向量。CLIP中的文本編碼器是一個Transformer模型,類似于GPT等語言模型中使用的模型。
- 共享嵌入空間:CLIP的核心思想是將圖像和文本嵌入投影到同一個多維向量空間中。這個共享空間允許模型直接比較圖像的表示及其對應的文本。?
- 對比學習:CLIP使用對比學習目標,在從互聯(lián)網(wǎng)收集的4億對(圖像、文本)海量數(shù)據(jù)集上進行訓練。訓練流程如下:
a.正樣本對:對于批次中的每幅圖像,至少有一個正確的文本描述與其關(guān)聯(lián)。該模型旨在最大化圖像嵌入與其正確文本描述嵌入之間的余弦相似度。
b.負樣本對:對于每幅圖像,批次中的所有其他文本描述均被視為不正確。該模型旨在最小化圖像嵌入與這些不正確文本描述的嵌入之間的余弦相似度。
同樣,這個過程也從文本編碼器的角度應用。模型嘗試將每個文本描述與其對應的圖像進行匹配,并將其與批次中的其他圖像區(qū)分開來。
- 零樣本遷移:基于海量多樣化數(shù)據(jù)集的對比學習方法,使CLIP能夠?qū)W習到對視覺概念及其與語言關(guān)系的豐富理解,從而實現(xiàn)卓越的零樣本遷移能力。?
- 圖像分類:要對具有預定義類別的新數(shù)據(jù)集執(zhí)行零樣本圖像分類,你可以為每個類別創(chuàng)建文本提示(例如,“貓的照片”、“狗的照片”)。然后,對輸入圖像和所有文本提示進行編碼。CLIP會將圖像的類別預測為嵌入與圖像嵌入具有最高余弦相似度的文本提示。此操作無需對新數(shù)據(jù)集進行任何微調(diào)即可完成。?
本質(zhì)上,CLIP通過理解哪些描述可能屬于哪些圖像來學習關(guān)聯(lián)圖像和文本。這是通過在共享嵌入空間中拉近匹配的(圖像,文本)對的嵌入,并拉遠不匹配對的嵌入來實現(xiàn)的。
Flamingo
Flamingo由DeepMind開發(fā),是一款基礎的機器學習模型(MLLM),因其在廣泛的視覺和語言任務中實現(xiàn)的少樣本學習(少樣本學習)能力而備受關(guān)注。與需要針對每個特定任務進行大量微調(diào)的模型不同,F(xiàn)lamingo旨在通過利用上下文學習來快速適應新任務,類似于GPT-3等大型語言模型。
讓我們來探索Flamingo MLLM的關(guān)鍵方面及其工作原理:
- 視覺編碼器:Flamingo使用預訓練的視覺編碼器,通常是一個使用類似CLIP的對比文本圖像方法訓練的模型(盡管他們在早期工作中使用了NFNet模型)。?視覺編碼器的作用是從輸入圖像或視頻幀中提取豐富的語義和空間特征。它獲取原始視覺數(shù)據(jù)并輸出一組特征圖。?
- 感知器重采樣器:視覺編碼器的輸出可以具有可變數(shù)量的特征向量,具體取決于輸入分辨率和架構(gòu)。然而,語言模型通常傾向于固定大小的輸入。?感知器重采樣器充當橋梁。它從視覺編碼器中獲取可變數(shù)量的視覺特征,并使用一組可學習的查詢向量和交叉注意力機制來輸出固定數(shù)量的視覺標記。這降低了維度,并為語言模型提供了一致的輸入大小。?
對于視頻,感知器重采樣器處理來自多個幀的特征,可能結(jié)合時間信息。? - 語言模型:Flamingo采用功能強大、經(jīng)過預訓練且已凍結(jié)的LLM作為其骨干模型。其初期工作使用了DeepMind開發(fā)的Chinchilla系列LLM。?這款已凍結(jié)的LLM提供了強大的生成語言能力,并能夠利用其在文本預訓練過程中學到的大量知識。?
- 門控交叉注意力密集層(GATE DXATTN-DENSE Layers):將視覺標記與凍結(jié)的LLM連接起來的關(guān)鍵創(chuàng)新是引入了新穎的GATED XATTN-DENSE層。這些層交錯(插入)在預訓練LLM的各層之間。?
- 交叉注意力機制:這些層允許語言嵌入關(guān)注感知器重采樣器生成的視覺標記。這使得LLM能夠在預測下一個文本標記時融入視覺信息。?
- 門控機制:“門控”方面涉及一個可學習的門,它控制視覺信息對語言處理的影響程度。這有助于模型選擇性地整合視覺線索。?
- 交錯:通過在整個LLM中插入這些交叉注意層,視覺信息可以影響多個階段的語言生成。?
??來源??:Flamingo?
處理流程:
- 輸入:Flamingo接收一系列與圖像或視頻交織在一起的文本標記。文本中可能會添加特殊標簽,以指示存在視覺輸入。?
- 視覺編碼:圖像/視頻由凍結(jié)視覺編碼器處理以提取特征圖。?
- 感知器重采樣:感知器重采樣器將可變的視覺特征轉(zhuǎn)換為固定數(shù)量的視覺標記。?
- 語言編碼:使用凍結(jié)的LLM的嵌入層嵌入文本標記。?
- 交錯處理:文本嵌入和視覺標記的序列被輸入到修改后的LLM中。在每個GATEDXATTN-DENSE層:
a.語言嵌入關(guān)注視覺標記。
b.所關(guān)注的視覺信息用于影響LLM的下一個標記預測。
- 文本生成:該模型根據(jù)文本和視覺環(huán)境自回歸生成文本。?
大型語言和視覺助手(LLaVA)
LLaVA(大型語言和視覺助手)是一款端到端訓練的大型語言學習器(MLLM),它將預訓練的視覺編碼器與LLM相結(jié)合,以實現(xiàn)通用的視覺和語言理解,以及強大的聊天功能。它的架構(gòu)相對簡單,但功能強大且數(shù)據(jù)效率極高。
讓我們探討一下LLaVA MLLM的關(guān)鍵方面:
- 視覺編碼器:LLaVA采用預訓練的CLIP(對比語言-圖像預訓練)視覺編碼器,通常是ViT-L/14模型。?CLIP視覺編碼器負責處理輸入圖像并提取高級視覺特征,這些特征已通過CLIP訓練與文本概念對齊。它輸出圖像的固定大小矢量表示。?
- 投影矩陣(模態(tài)連接器):LLaVA連接視覺和語言的架構(gòu)核心是一個簡單、可訓練的投影矩陣(一個全連接層或一個小型多層感知器-MLP)。?該投影矩陣從CLIP編碼器獲取視覺特征向量,并將其映射到預訓練LLM的嵌入空間中。目標是將視覺特征轉(zhuǎn)換為語言模型能夠理解并與文本輸入集成的格式。?
- 大型語言模型(LLM)主干:LLaVA使用預先訓練的大型語言模型作為其文本處理和生成引擎。LLaVA的原始工作主要使用了Vicuna,這是一個基于LLaMA進行微調(diào)的開源聊天機器人。?
LLM處理嵌入的文本指令和投射的視覺特征,以生成與文本和圖像相關(guān)的文本響應。
??資料來源??:LLaVa?
處理流程:
- 輸入:LLaVA接收由圖像和文本指令或問題組成的多模態(tài)輸入。?
- 視覺編碼:輸入圖像經(jīng)過預先訓練的CLIP視覺編碼器處理,提取視覺特征向量。?
- 投影:將視覺特征向量傳入可訓練的投影矩陣,使其維度和語義空間與LLM的詞向量對齊。這些投影后的視覺特征被LLM有效地處理為“視覺標記”。?
- 語言編碼:使用LLM的嵌入層對文本指令進行標記和嵌入。?
- LLM的多模態(tài)輸入:嵌入的文本標記和投影的視覺特征被連接(或以其他方式組合)并輸入到LLM中。?
- 文本生成:LLM處理此組合輸入并根據(jù)視覺和文本上下文自回歸地生成回答問題或遵循指令的文本響應。?
訓練過程:
LLaVA的訓練主要包括兩個階段:
- 特征對齊預訓練:在此初始階段,預訓練的CLIP視覺編碼器和LLM的權(quán)重被凍結(jié)。?僅訓練投影矩陣。該模型在圖像-文本對數(shù)據(jù)集(通常是CC3M的子集)上進行訓練,以將視覺特征與語言嵌入對齊。目標是根據(jù)投影的視覺特征預測與圖像相關(guān)的文本。?
- 視覺指令調(diào)優(yōu):在第二階段,也是至關(guān)重要的階段,整個模型(包括投影矩陣,通常還有LLM)在大規(guī)模視覺指令調(diào)優(yōu)數(shù)據(jù)集上進行微調(diào)。?
該數(shù)據(jù)集通常使用GPT-4生成,包含與圖像配對的指令以及相應的響應。這些指令涵蓋了廣泛的任務,包括:
- 對話:關(guān)于圖像的自然對話。?
- 詳細描述:生成視覺內(nèi)容的全面描述。?
- 復雜推理:回答需要理解關(guān)系并根據(jù)圖像進行推理的問題。?
在此階段,模型學習遵循涉及理解和推理視覺信息的指令。
C-Former
C-Former是一種專用的模型架構(gòu),用于多模態(tài)大型語言模型(MLLM),用于處理和編碼音頻數(shù)據(jù),從而實現(xiàn)與文本和圖像等其他模態(tài)的集成。其設計利用基于Transformer的技術(shù),專門用于捕捉音頻信號的獨特屬性,從而促進與語言模型的有效融合,以用于轉(zhuǎn)錄、音頻理解或多模態(tài)推理等下游任務。
讓我們來探索一下C-Former的工作原理:
C-Former通常采用基于Transformer的架構(gòu),利用自注意力機制捕捉音頻序列內(nèi)以及跨不同模態(tài)的長程依賴關(guān)系的能力。以下是其關(guān)鍵方面和處理流程的細分:
音頻特征提取
- 原始音頻信號首先由專用音頻編碼器(例如,VGGish、Wav2Vec 2.0、Whisper的音頻編碼器)處理。?
- 該編碼器提取一系列低維、語義更豐富的音頻特征。這些特征可以是幀級嵌入,用于表示短時間窗口內(nèi)的聲學特性。?
音頻特征嵌入
- 音頻特征序列會經(jīng)過一個嵌入層。這會將每個音頻特征向量投影到與LLM嵌入空間兼容的高維嵌入空間中。?
- 位置嵌入通常被添加到音頻特征嵌入中,以對音頻幀的時間順序進行編碼,類似于它們在Transformers中用于文本的方式。?
跨模態(tài)注意力(關(guān)鍵組成部分)
- 這就是C-Former真正閃耀的地方。它利用交叉注意力機制,實現(xiàn)音頻嵌入與其他模態(tài)(例如視覺特征、文本標記)嵌入之間的交互。?
- Query、Key、Value:在典型的交叉注意力層中:?A.查詢可能來自LLM的文本或視覺嵌入。?
B.鍵和值來自音頻嵌入(或反之亦然,取決于具體的架構(gòu))。? - 注意力權(quán)重:注意力機制根據(jù)查詢和鍵之間的相似度計算權(quán)重。這些權(quán)重決定了每個音頻特征對其他模態(tài)表征的影響程度(反之亦然)。?
- 語境化的音頻表征:通過交叉注意力機制,音頻嵌入能夠被其他模態(tài)的信息進行語境化。例如,如果文本中提到“狗叫”,那么在處理文本時,與狗叫聲對應的音頻嵌入可能會獲得更高的注意力權(quán)重。同樣,文本表征也可能通過關(guān)注相關(guān)的音頻線索而得到豐富。?
融合與整合
- 交叉注意力層的輸出(語境化的音頻表征)隨后會與其他模態(tài)的嵌入進行融合。這種融合可以通過連接、元素級運算(加法、乘法)或進一步的Transformer層來實現(xiàn)。?
- 目標是創(chuàng)建一個統(tǒng)一的多模態(tài)表示,然后LLM可以將其用于多模態(tài)理解、生成和推理等下游任務。?
音頻中的交互(自注意力機制)
- C-Former通常還包含自注意力層,這些自注意力層在交叉注意力之前或同時作用于音頻嵌入。這使得模型能夠捕捉音頻流本身的時間依賴關(guān)系和關(guān)系,而不受其他模態(tài)的影響。?
舉例
假設向MLLM展示一張狗叫的圖像,并聽到狗叫聲。用戶問:“圖像中的動物在做什么?”
- 音頻處理:吠叫聲經(jīng)過音頻編碼器,產(chǎn)生一系列音頻特征。C-Former嵌入這些特征,并運用自注意力機制來理解吠叫聲的時間結(jié)構(gòu)。?
- 視覺處理:狗的圖像經(jīng)過視覺編碼器,產(chǎn)生視覺特征。?
- 跨模態(tài)注意力(C-Former):?A.視覺特征(作為查詢)關(guān)注音頻嵌入(作為鍵和值)。這有助于模型理解聲音可能與視覺內(nèi)容相關(guān)。?
B.同時(或在不同的層中),問題的文本標記(“這是什么動物……”)會同時關(guān)注視覺和音頻嵌入,從而使模型能夠?qū)栴}置于多模態(tài)輸入中。當模型關(guān)注動作時,與吠叫聲對應的音頻嵌入可能會獲得高度關(guān)注。? - 融合:將情境化的音頻和視覺表示與問題的文本嵌入融合。?
- LLM推理:LLM處理這種統(tǒng)一的多模態(tài)表征,并對場景進行推理。它理解圖像中包含一只動物(狗),音頻表示的是吠叫的動作。?
- 答案生成:LLM生成答案:“圖像中的狗正在吠叫。”?
Wav2Vec 2.0
Wav2Vec 2.0是一個自監(jiān)督模型,旨在從原始音頻波形中學習強大的語音表示。它對語音識別尤其有效,但也可以用作多模態(tài)大型語言模型(LLM)中的音頻編碼器,以提供與文本或其他模態(tài)集成的豐富音頻嵌入。
??來源??:Wav2Vec 2.0?
讓我們探索一下Wav2Vec 2.0的工作原理:
原始音頻輸入
- 該模型通常以16 kHz采樣的原始音頻波形作為輸入,而無需傅里葉變換或手工制作的特征等傳統(tǒng)預處理。?
特征編碼器(卷積神經(jīng)網(wǎng)絡)
- 原始波形通過7層1D卷積神經(jīng)網(wǎng)絡(CNN)。?
- 該CNN以每個向量約20毫秒的幀速率提取潛在語音特征,將原始音頻簡化為一系列低維潛在表示Z=(z0,z1,…,zT) Z=(z0,z1,…,zT)。?
- CNN每層有512個通道,感受野約為25毫秒的音頻,可捕捉局部聲學模式。?
量化模塊(預訓練期間)
- 潛在特征被離散化為一組有限的量化語音單元。?
- 這種量化作為模型在自監(jiān)督對比學習期間預測的目標,幫助模型學習沒有標簽的有意義的語音表示。?
上下文網(wǎng)絡(Transformer編碼器)
- 潛在特征ZZ被輸入到Transformer編碼器(基礎模型為12層,大型模型為24層)。?Transformer生成語境化表示C=(c0,c1,…,cT) C =( c0, c1,…, cT ),捕捉超越局部聲學特征的長距離依賴關(guān)系和語音上下文。?
- 特征投影層調(diào)整CNN輸出維度(512)以匹配Transformer輸入維度(768或1024)。?
自監(jiān)督預訓練
- 該模型通過掩蓋部分潛在音頻特征并學習使用對比損失來預測這些掩蓋部分的正確量化表示來進行訓練。?
- 對比學習迫使模型區(qū)分真正的量化特征和干擾因素,從而提高表示質(zhì)量。?
下游任務的微調(diào)
- 經(jīng)過預訓練后,該模型會根據(jù)標記數(shù)據(jù)(例如,轉(zhuǎn)錄)進行微調(diào),以完成自動語音識別(ASR)等任務。?
- Transformer的輸出CC經(jīng)過線性投影來預測音素、單詞或其他目標。
處理流程:
- 音頻輸入:以16kHz采樣的原始波形。?
- 特征提取:CNN特征編碼器將波形轉(zhuǎn)換為潛在特征ZZ。?
- 上下文編碼:Transformer編碼器產(chǎn)生上下文化的嵌入CC。?
- 投影:上下文嵌入被投影到與LLM兼容的共享嵌入空間中。?
- 多模態(tài)融合:音頻嵌入與其他模態(tài)(例如文本嵌入)連接或集成。?
- LLM處理:多模態(tài)輸入由LLM的轉(zhuǎn)換層處理,以執(zhí)行語音到文本、音頻字幕或多模態(tài)理解等任務。?
- 輸出生成:LLM生成最終輸出,例如轉(zhuǎn)錄、答案或描述。?
舉例:
輸入:包含口語的原始WAV音頻文件。
步驟1:加載音頻波形并將其重新采樣為16kHz。
第2步:波形通過Wav2Vec2.0CNN編碼器以獲取潛在特征。
步驟3:將潛在特征輸入到Transformer中以獲得上下文嵌入。
步驟4:嵌入被投影并與任何文本或其他模態(tài)輸入一起輸入到多模態(tài)LLM中。
步驟5:LLM處理組合輸入并生成轉(zhuǎn)錄文本輸出,例如“你好,今天我能為你做些什么?”。
為多模態(tài)大型語言模型(LLM)提供音頻的Whisper
Whisper是由OpenAI開發(fā)的開源語音轉(zhuǎn)文本(STT)模型。與主要專注于學習通用音頻表示的Wav2Vec2.0不同,Whisper專門針對語音轉(zhuǎn)錄和翻譯進行了訓練。這使得它成為一個強大的工具,可以直接將音頻轉(zhuǎn)換為文本,多模態(tài)LLM可以輕松理解并處理其他模態(tài)的音頻。
Whisper的主要特點:
- 多語言和多任務:Whisper在海量多語言語音和配對文本數(shù)據(jù)集上進行訓練,使其能夠轉(zhuǎn)錄多種語言的音頻并將語音從一種語言翻譯成另一種語言。?
- 對噪音和口音的魯棒性:大量且多樣化的訓練數(shù)據(jù)使得Whisper對各種口音、背景噪音和不同的音頻質(zhì)量具有相對的魯棒性。?
- 直接文本輸出:Whisper的主要輸出是文本,這與LLM的基于文本的處理自然一致。?
??來源??:Whisper?
讓我們來探索一下Whisper的工作原理:
Whisper采用基于Transformer的編解碼器架構(gòu)。其處理流程細分如下:
音頻輸入
原始音頻波形被輸入到Whisper模型。
音頻編碼器(Transformer)
音頻首先被處理成一系列對數(shù)梅爾頻譜圖特征。這是音頻頻率內(nèi)容隨時間變化的標準表示。
這些聲譜圖特征隨后被輸入到Transformer編碼器中。該編碼器利用自注意力機制,學習音頻隨時間推移的語境化表征。它能夠捕捉語音中的長程依賴關(guān)系和聲學模式。
解碼器(Transformer)
- Transformer解碼器將編碼的音頻表示作為輸入并生成相應的文本。?
- 在解碼過程中,該模型根據(jù)編碼的音頻和先前生成的標記,自回歸地預測文本序列中的下一個標記。?
- 解碼器經(jīng)過訓練,可以執(zhí)行轉(zhuǎn)錄(預測與音頻相同語言的文本)和翻譯(預測不同目標語言的文本)。具體任務通常在解碼過程開始時用特殊標記指示。?
處理流程:
- 原始音頻輸入:與多模態(tài)輸入相關(guān)的音頻被輸入到Whisper模型中。?
- Whisper處理:Whisper的編碼器將音頻處理成聲譜圖特征,然后再轉(zhuǎn)換成編碼表示。解碼器隨后生成相應的文本轉(zhuǎn)錄(或翻譯,如果指定)。?
- 文本嵌入:Whisper輸出的轉(zhuǎn)錄文本隨后會經(jīng)過多模態(tài)LLM的文本嵌入層。這會將音頻的文本表示轉(zhuǎn)換為LLM語義空間中的向量嵌入。?
- 跨模態(tài)融合:然后,使用交叉注意力等機制將音頻的文本嵌入與其他模態(tài)(例如視覺特征和其他可能的文本輸入)的嵌入融合。這使得LLM能夠?qū)⒄Z音內(nèi)容與視覺信息以及其他相關(guān)文本關(guān)聯(lián)起來。?
- 統(tǒng)一的多模態(tài)表示:融合過程創(chuàng)建一個統(tǒng)一的表示,整合來自所有處理模態(tài)的信息,包括音頻的文本表示。?
- LLM處理:LLM處理這種統(tǒng)一的表示來執(zhí)行諸如理解視頻內(nèi)容(音頻和視覺效果)、用口頭描述回答有關(guān)場景的問題或生成包含視覺和聽覺元素的描述等任務。?
舉例:
假設一個MLLM用戶看到一段視頻,視頻中一個人說“貓在墊子上”,同時還提供了他說話的音頻。用戶問:“這個人說的墊子上是什么?”
- 音頻處理:說話人的音頻被輸入到Whisper。Whisper將音頻轉(zhuǎn)錄成文本:“貓在墊子上。”?
- 視覺處理:視頻幀由視覺編碼器處理,提取貓和墊子的特征(如果存在)。?
- 文本嵌入:轉(zhuǎn)錄的文本“貓在墊子上”通過MLLM的文本嵌入層嵌入到矢量表示中。?
- 跨模態(tài)融合:音頻的文本嵌入與貓和墊子的視覺特征以及問題的文本嵌入(“這個人說了什么在墊子上?”)融合。注意力機制學習將口語與視覺對象關(guān)聯(lián)起來。?
- LLM推理:LLM處理統(tǒng)一的表示并理解口語和視覺元素之間的關(guān)系。?
- 答案生成:LLM生成答案:“這個人說貓在墊子上。”?
多模態(tài)LLM RAG
多模態(tài)LLM RAG是一種先進的方法,它擴展了傳統(tǒng)的RAG框架,使LLM能夠利用文本以外的多種數(shù)據(jù)模態(tài)來理解、檢索和生成信息。這包括圖像、音頻、視頻以及潛在的結(jié)構(gòu)化數(shù)據(jù)等數(shù)據(jù)類型。
??來源??:多模態(tài)檢索增強生成(RAG)流程?
多模態(tài)LLM RAG所需的組件:
- 多模態(tài)數(shù)據(jù)源:知識庫需要存儲和索引各種格式的數(shù)據(jù)(文本文檔、圖像、音頻文件、視頻剪輯等)。?
- 多模態(tài)數(shù)據(jù)加載器和預處理器:這些組件負責提取和準備用于索引的多模態(tài)數(shù)據(jù)。這可能涉及:
a.從文檔中提取文本(包括使用OCR提取圖像中的文本)。
b.從圖像和視頻中提取關(guān)鍵幀或特征。
c.從音頻中提取文字記錄或特征。
- 多模態(tài)嵌入模型:為了跨不同模態(tài)進行有效檢索,查詢和知識庫中的數(shù)據(jù)需要在共享的嵌入空間中表示。這可以通過以下方式實現(xiàn):
a.聯(lián)合嵌入模型(例如,CLIP、ImageBind):這些模型可以將文本和圖像(有時還有其他模態(tài))嵌入到一個公共向量空間中,在這個空間中,語義相似的項目彼此靠近,而不管它們的原始模態(tài)如何。
b.具有對齊的獨立編碼器:使用特定于模態(tài)的編碼器(例如,文本編碼器和圖像編碼器),然后學習映射或投影以對齊它們的嵌入。
c.文本描述:為非文本數(shù)據(jù)(例如圖像字幕)生成文本描述,然后使用標準文本嵌入進行檢索。
- 多模態(tài)向量數(shù)據(jù)庫:向量數(shù)據(jù)庫用于存儲和高效搜索多模態(tài)數(shù)據(jù)的向量。它應該支持索引和查詢不同模態(tài)的向量,最好在同一空間內(nèi)進行統(tǒng)一檢索。
- 檢索機制:該組件接收用戶查詢(也可以是多模態(tài)的,例如文本和圖像),并根據(jù)嵌入空間的相似性,從多模態(tài)向量數(shù)據(jù)庫中檢索最相關(guān)的信息。檢索策略可能涉及:
a.統(tǒng)一的多模態(tài)檢索:如果所有模態(tài)都嵌入在同一空間中,則單個向量搜索可以檢索所有類型的相關(guān)內(nèi)容。
b.單獨檢索和融合:獨立檢索每種模態(tài)的相關(guān)內(nèi)容,然后融合結(jié)果。 - 多模態(tài)大型語言模型(MLLM):生成過程的核心是一個能夠處理來自多種模態(tài)信息的MLLM。該模型將用戶查詢和檢索到的多模態(tài)上下文作為輸入,并生成連貫且相關(guān)的響應,該響應也可以采用多種模態(tài)(例如文本,有時也包含圖像)。MLLM的示例包括GPT-4o、Gemini、LLaVA等。?
- 多模態(tài)提示設計:在多模態(tài)RAG設置中,為MLLM設計有效的提示至關(guān)重要。提示需要清晰地指導模型如何使用檢索到的多模態(tài)上下文來回答用戶的查詢。?
- 多模態(tài)RAG的評估指標:評估多模態(tài)RAG系統(tǒng)的性能需要合適的指標,這些指標能夠評估檢索到的上下文以及跨不同模態(tài)生成的響應的相關(guān)性和準確性。這些指標仍然是一個活躍的研究領(lǐng)域,但可以包括適用于多模態(tài)輸出的傳統(tǒng)RAG指標(例如相關(guān)性、忠實度和答案質(zhì)量)的擴展。?
讓我們逐步探索多模態(tài)RAG系統(tǒng)每個部分的流程。
步驟1:文檔加載
這里的目標是從復雜的文檔中獲取所有原始內(nèi)容(文本、圖像路徑、音頻路徑、表格數(shù)據(jù))。
對于混合格式的文檔(包含文本、圖像、表格、嵌入音頻/視頻的PDF),你通常需要自定義解析方法,或利用專門的庫。
庫:
- PyMuPDF(Fitz)用于PDF(提取文本、圖像和檢測表格)。?
- python-docx用于Word文檔。?
- openpyxl用于Excel。?
- BeautifulSoup用于HTML。?
- 如果嵌入或引用音頻/視頻路徑,則提取它們的自定義邏輯。
import fitz # PyMuPDF
import re
import os
import camelot
from PIL import Image
def extract_pdf_multimodal_content(pdf_path, output_dir="extracted_content"):
doc = fitz.open(pdf_path)
all_content = []
os.makedirs(output_dir, exist_ok=True)
for page_num in range(doc.page_count):
page = doc[page_num]
page_text = page.get_text()
# 1. 提取文本
all_content.append({"type": "text", "content": page_text, "page": page_num + 1})
# 2. 提取圖像
images = page.get_images(full=True)
for img_index, img_info in enumerate(images):
xref = img_info[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"]
image_filename = os.path.join(output_dir, f"page{page_num+1}_img{img_index}.{image_ext}")
with open(image_filename, "wb") as img_file:
img_file.write(image_bytes)
all_content.append({"type": "image", "path": image_filename, "page": page_num + 1})
# 3. 提取表格
tables = camelot.read_pdf(pdf_path, pages=str(page_num + 1))
for table in tables:
all_content.append({"type": "table", "content": table.df.to_csv(), "page": page_num + 1})
# 4. 提取音頻片段
# 這取決于PDF中音頻剪輯的引用方式。
audio_links = re.findall(r'https?://\S+\.(mp3|wav|ogg|flac)', page_text)
for link in audio_links:
all_content.append({"type": "audio_link", "url": link, "page": page_num + 1})
doc.close()
return all_content
document_content = extract_pdf_multimodal_content("your_multimodal_document.pdf")
print(f"Extracted {len(document_content)} multimodal chunks.")
print(document_content[:5])
步驟2:多模態(tài)分塊和預處理
這一點至關(guān)重要。你需要將提取的內(nèi)容分解成適合嵌入和檢索的有意義的單元。“有意義”取決于你的具體的使用場景。
- 將每個不同的內(nèi)容(一個段落、一張圖片、一個音頻剪輯的轉(zhuǎn)錄)保存為一個原子塊。?
- 至關(guān)重要的是,為每個塊附加豐富的元數(shù)據(jù):原始頁碼、與其他模態(tài)的接近度、原始文件名、類型(文本、圖像、音頻、表格)。?
- 使用基于LLM的分塊來確保文本塊代表完整的語義思想,而不是任意的標記計數(shù)。?
- 對于表格,將其轉(zhuǎn)換為LLM可以理解的描述性文本格式(例如,CSV、Markdown或自然語言摘要)。?
- 對于音頻片段,可以使用STT模型(例如Whisper)將其轉(zhuǎn)錄為文本。轉(zhuǎn)錄后的文本將被嵌入到搜索中。你還可以存儲原始音頻路徑以供播放。
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_google_genai import ChatGoogleGenerativeAI
from pydub import AudioSegment
from pydub.playback import play # 用于本地音頻測試
import io
import base64
import whisper
import google.generativeai as genai
from google.cloud import speech_v1p1beta1 as speech # 用于GCP Speech-to-Text
# 配置 Gemini 進行文本摘要(針對表格)
genai.configure(api_key="YOUR_GEMINI_API_KEY") #確保你的API密鑰已設置
llm_for_summarization = ChatGoogleGenerativeAI(model="gemini-pro")
# 配置 GCP 語音轉(zhuǎn)文本客戶端
# 你需要進行GCP認證(例如,GOOGLE_APPLICATION_CREDENTIALS)
speech_client = speech.SpeechClient()
def process_multimodal_chunks(raw_content_list):
processed_chunks = []
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_functinotallow=len,
add_start_index=True,
)
for item in raw_content_list:
if item["type"] == "text":
# 文本語義分塊
chunks = text_splitter.create_documents([item["content"]])
for i, chunk in enumerate(chunks):
processed_chunks.append({
"type": "text",
"content": chunk.page_content,
"metadata": {
"page": item["page"],
"original_source": "document_text",
"chunk_index": i
}
})
elif item["type"] == "image":
# 對于圖像,我們直接傳遞圖像路徑或 base64 表示
processed_chunks.append({
"type": "image",
"path": item["path"],
"content_description": f"Image from page {item['page']}: {item['path']}", # 占位符描述
"metadata": {
"page": item["page"],
"original_source": "document_image",
}
})
elif item["type"] == "table":
# 將表格轉(zhuǎn)換為文本。
table_text = f"Table from page {item['page']}:\n{item['content']}"
table_summary = llm_for_summarization.invoke(f"Summarize this table content:\n{item['content']}")
processed_chunks.append({"type": "table_text", "content": table_summary, ...})
processed_chunks.append({
"type": "table_text",
"content": table_text,
"metadata": {
"page": item["page"],
"original_source": "document_table",
}
})
elif item["type"] == "audio_link":
#使用 Google Cloud Speech-to-Text(推薦用于生產(chǎn)環(huán)境)
audio_file_path = download_audio_from_url(item["url"])
with io.open(audio_file_path, "rb") as audio_file:
content = audio_file.read()
audio = speech.RecognitionAudio(cnotallow=content)
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
language_code="en-US",
)
response = speech_client.recognize(cnotallow=config, audio=audio)
transcribed_text = " ".join([result.alternatives[0].transcript for result in response.results])
transcribed_text = f"Transcription of audio clip from {item['url']}: [Actual transcription content would go here]"
model = whisper.load_model("base")
result = model.transcribe(audio_file_path)
transcribed_text = result["text"]
processed_chunks.append({
"type": "audio_text",
"content": transcribed_text,
"audio_url": item["url"],
"metadata": {
"page": item["page"],
"original_source": "document_audio",
}
})
return processed_chunks
processed_multimodal_chunks = process_multimodal_chunks(document_content)
print(f"Processed {len(processed_multimodal_chunks)} chunks.")
print(processed_multimodal_chunks[0])
print(processed_multimodal_chunks[1])
步驟3:多模態(tài)嵌入
這就是多模態(tài)檢索的神奇之處。你需要一個能夠?qū)⑽谋荆ㄗ詈檬菆D像和音頻)嵌入到共享向量空間的模型。Gemini在這方面表現(xiàn)出色。
- Gemini的GenerativeModel可以接受混合輸入(文本和圖像),并生成單個嵌入。對于音頻,通常需要嵌入轉(zhuǎn)錄后的文本。?
- 使用文本嵌入模型(例如text-embedding-004)處理文本/表格/音頻轉(zhuǎn)錄,并使用視覺編碼器(例如CLIP或自定義編碼器)處理圖像,確保它們的嵌入空間兼容或?qū)R。準確對齊會更加復雜。
import google.generativeai as genai
from PIL import Image
#配置Gemini
genai.configure(api_key="YOUR_GEMINI_API_KEY")
async def get_gemini_multimodal_embedding(content_type, content, model_name="models/embedding-001"):
"""
使用Gemini生成多模態(tài)嵌入。
對于圖像來說,“content”應為PIL圖像對象。
對于文本來說,“content”應為字符串。
"""
model = genai.GenerativeModel(model_name)
if content_type == "text":
embedding = await model.embed_content(cnotallow=content)
elif content_type == "image":
# 確保“content”是PIL圖像對象
embedding = await model.embed_content(cnotallow=content, task_type="RETRIEVAL_DOCUMENT")
else:
raise ValueError(f"Unsupported content type for embedding: {content_type}")
return embedding['embedding']
# 加載嵌入圖像的函數(shù)
def load_image_for_embedding(image_path):
try:
return Image.open(image_path)
except Exception as e:
print(f"Error loading image {image_path}: {e}")
return None
async def embed_multimodal_chunks(processed_chunks):
embedded_chunks = []
for i, chunk in enumerate(processed_chunks):
embedding_vector = None
if chunk["type"] in ["text", "table_text", "audio_text"]:
embedding_vector = await get_gemini_multimodal_embedding("text", chunk["content"])
elif chunk["type"] == "image":
image_pil = load_image_for_embedding(chunk["path"])
if image_pil:
embedding_vector = await get_gemini_multimodal_embedding("image", image_pil)
else:
print(f"Skipping embedding for corrupted image: {chunk['path']}")
continue # Skip if image couldn't be loaded
if embedding_vector:
embedded_chunks.append({
"chunk_id": f"chunk_{i}", # Unique ID for retrieval
"embedding": embedding_vector,
"original_content": chunk["content"], # Store original text/description
"path": chunk.get("path"), # Store image path
"audio_url": chunk.get("audio_url"), # Store audio URL
"type": chunk["type"],
"metadata": chunk["metadata"]
})
return embedded_chunks
import asyncio
async def main_embedding():
embedded_data = await embed_multimodal_chunks(processed_multimodal_chunks)
print(f"Embedded {len(embedded_data)} chunks.")
print(embedded_data[0])
asyncio.run(main_embedding())
步驟4:矢量數(shù)據(jù)庫存儲
將你的chunk_id、embedding和metadata字段(包括原始內(nèi)容、路徑、URL)存儲在矢量數(shù)據(jù)庫中。
- 專用于生產(chǎn)級的矢量數(shù)據(jù)庫?選擇方案:Pinecone、Weaviate、Chroma、Qdrant、Milvus。這些數(shù)據(jù)庫都針對大規(guī)模矢量搜索進行了優(yōu)化。?
- 它們允許你存儲向量以及相關(guān)元數(shù)據(jù)。這些信息對于RAG來說,都是至關(guān)重要的。?
- 用于開發(fā)/測試的本地向量存儲。其中,Langchain的FAISS或Chroma(內(nèi)存/本地持久)都非常適用于快速原型開發(fā)。
from langchain_community.vectorstores import Chroma
from langchain_google_genai import GoogleGenerativeAIEmbeddings
import numpy as np
#配置 Gemini 進行嵌入
genai.configure(api_key="YOUR_GEMINI_API_KEY") #確保設置了API密鑰
embeddings_model = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
def store_in_vector_db(embedded_chunks, db_path="./multimodal_chroma_db"):
documents_for_chroma = []
metadatas_for_chroma = []
ids_for_chroma = []
embeddings_for_chroma = []
for chunk in embedded_chunks:
text_content = ""
if chunk["type"] in ["text", "table_text", "audio_text"]:
text_content = chunk["original_content"]
elif chunk["type"] == "image":
text_content = chunk["content_description"]
documents_for_chroma.append(text_content)
ids_for_chroma.append(chunk["chunk_id"])
embeddings_for_chroma.append(chunk["embedding"])
metadata = {
"type": chunk["type"],
"page": chunk["metadata"].get("page"),
"original_source": chunk["metadata"].get("original_source"),
}
if chunk.get("path"): # For images
metadata["image_path"] = chunk["path"]
if chunk.get("audio_url"): # For audio
metadata["audio_url"] = chunk["audio_url"]
metadatas_for_chroma.append(metadata)
#首先,初始化一個空的Chroma集合
db = Chroma(
embedding_functinotallow=GoogleGenerativeAIEmbeddings(model="models/embedding-001"),
persist_directory=db_path
)
#添加文檔、嵌入和元數(shù)據(jù)
# 確保所有列表的長度相同
db.add_texts(
texts=documents_for_chroma,
metadatas=metadatas_for_chroma,
ids=ids_for_chroma,
embeddings=embeddings_for_chroma
)
db.persist()
print(f"Stored {len(embedded_chunks)} chunks in Chroma DB at {db_path}")
return db
db = store_in_vector_db(embedded_data)
步驟5:多模態(tài)檢索
當用戶提出問題時,你將嵌入他們的查詢并使用它來搜索你的矢量數(shù)據(jù)庫。
- 使用相同的Gemini文本嵌入模型嵌入用戶的自然語言查詢。?
- 在矢量數(shù)據(jù)庫中執(zhí)行相似性搜索以檢索最相關(guān)的塊(可以是文本、圖像描述或音頻轉(zhuǎn)錄)。?
- 如果用戶的查詢本身包含圖像或音頻,你可以使用Gemini的多模態(tài)嵌入功能嵌入整個查詢(文本+圖像/音頻)。這可以實現(xiàn)真正的多模態(tài)搜索。
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_community.vectorstores import Chroma
# 確保已經(jīng)配置好Gemini
genai.configure(api_key="YOUR_GEMINI_API_KEY")
#加載嵌入模型以進行查詢
query_embeddings_model = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
def retrieve_multimodal_chunks(user_query, db, top_k=5):
retrieved_docs = db.similarity_search(user_query, k=top_k)
retrieved_multimodal_content = []
for doc in retrieved_docs:
content_item = {
"type": doc.metadata.get("type"),
"content": doc.page_content,
"metadata": doc.metadata
}
if doc.metadata.get("image_path"):
content_item["path"] = doc.metadata["image_path"]
if doc.metadata.get("audio_url"):
content_item["audio_url"] = doc.metadata["audio_url"]
retrieved_multimodal_content.append(content_item)
return retrieved_multimodal_content
db = Chroma(embedding_functinotallow=query_embeddings_model, persist_directory="./multimodal_chroma_db")
user_query = "Explain the neural network architecture shown in the diagram and its audio properties."
retrieved_info = retrieve_multimodal_chunks(user_query, db)
print(f"Retrieved {len(retrieved_info)} relevant chunks.")
for item in retrieved_info:
print(f"Type: {item['type']}, Content (excerpt): {item['content'][:100]}..., Path/URL: {item.get('path') or item.get('audio_url')}")
步驟6:多模態(tài)LLM整合(使用Gemini)
最后,將檢索到的多模態(tài)塊傳遞給Gemini進行推理和生成。
- Gemini可以直接接受文本字符串列表和PIL圖像對象。對于音頻,你需要提供從相關(guān)音頻片段轉(zhuǎn)錄的文本。?
- 構(gòu)建一個包含用戶查詢和檢索到的內(nèi)容的提示。?
- 如果LLM不直接支持多模態(tài)輸入,你需要將所有檢索到的模態(tài)轉(zhuǎn)換為文本(例如,圖像字幕、音頻轉(zhuǎn)錄、表格摘要),然后僅將文本傳遞給LLM。之后,你需要明確指示LLM在其響應中引用原始資源(通過路徑/URL)。Gemini支持直接多模態(tài)輸入,因此無需進行此操作。
import google.generativeai as genai
from PIL import Image
# 配置Gemini
genai.configure(api_key="YOUR_GEMINI_API_KEY")
async def generate_response_with_gemini_multimodal(user_query, retrieved_multimodal_content):
model = genai.GenerativeModel('gemini-pro-vision')
prompt_parts = [
f"User's question: {user_query}\n\n",
"Here is some relevant information from my knowledge base:\n\n"
]
for item in retrieved_multimodal_content:
if item["type"] in ["text", "table_text", "audio_text"]:
prompt_parts.append(f"<{item['type']}_chunk>\n{item['content']}\n</{item['type']}_chunk>\n\n")
elif item["type"] == "image" and item.get("path"):
try:
image_pil = Image.open(item["path"])
prompt_parts.append(image_pil)
prompt_parts.append(f"\nDescription of image from knowledge base: {item['content']}\n\n")
except Exception as e:
print(f"Warning: Could not load image {item['path']} for prompt: {e}")
prompt_parts.append(f"[Image content at {item['path']} could not be loaded. Description: {item['content']}]\n\n")
if item.get("audio_url"):
prompt_parts.append(f"(Associated audio clip: {item['audio_url']})\n\n")
prompt_parts.append("Please provide a comprehensive answer to the user's question based on the provided information, referencing details from the text, images, and audio if relevant.")
try:
response = await model.generate_content(prompt_parts)
return response.text
except Exception as e:
print(f"Error generating content with Gemini: {e}")
return "Sorry, I could not generate a response at this time."
import asyncio
async def main_generation():
final_answer = await generate_response_with_gemini_multimodal(user_query, retrieved_info)
print("\n--- Final Answer from LLM ---")
print(final_answer)
asyncio.run(main_generation())
評估指標
評估多模態(tài)LLM RAG應用程序是一項復雜的任務,因為你需要評估多個維度的性能:檢索質(zhì)量、生成質(zhì)量;其中至關(guān)重要的是,系統(tǒng)集成和利用所有模態(tài)的程度。
以下是評估指標的詳細介紹,為了清晰起見進行了分類:
Ⅰ、檢索指標
這些指標評估你的系統(tǒng)根據(jù)查詢檢索相關(guān)多模態(tài)文檔或塊的效果。這里的挑戰(zhàn)在于,當查詢可能是多模態(tài)的,并且檢索到的項目也是多模態(tài)時,如何定義“相關(guān)性”。
A.核心檢索指標:
這些是標準的IR指標,但經(jīng)過調(diào)整以考慮檢索到的多模態(tài)塊的類型和相關(guān)性。
- Precision@k:在檢索到的排名靠前的詞塊中k,有多少真正與查詢相關(guān)??如果檢索到的詞塊的文本、圖像或音頻內(nèi)容有助于回答查詢,那么該詞塊就可能是相關(guān)的。你需要人工標注人員來標記不同模態(tài)下的相關(guān)性。?
例如:對于“展示狗狗在水中玩耍”的題目,如果檢索到的前三個詞塊分別是一張狗狗游泳的圖片、一段關(guān)于寵物水上安全的文字以及一段潑水的音頻片段,你需要評估每個詞塊的相關(guān)性。? - Recall@k:在知識庫中所有真正相關(guān)的詞塊中,有多少個詞塊被檢索到排名靠前k?需要對給定查詢的所有相關(guān)多模態(tài)詞塊進行全面的基本事實評估。創(chuàng)建起來頗具挑戰(zhàn)性。?
- F1-Score:準確率和召回率的調(diào)和平均值。?
- 平均準確率(MAP):這是一種流行的指標,它考慮了相關(guān)文檔的順序。如果一個高度相關(guān)的文檔被較早地檢索到,那么它的得分就會更高。?
- 歸一化折扣累積增益(NDCG@k):比MAP更復雜。它會根據(jù)相關(guān)性分配不同的分數(shù)(例如,0=不相關(guān),1=比較相關(guān),2=高度相關(guān)),并根據(jù)位置降低相關(guān)性。例如,如果一張圖片比較相關(guān),但其附帶的文本描述高度相關(guān),則可以給予部分評分。?
B.特定模態(tài)檢索相關(guān)性:
文本生成評估
這些指標評估LLM生成的自然語言響應的質(zhì)量,通常通過將其與參考(基本事實)答案進行比較來評估。
- 精確匹配(EM):二進制指標,指示生成的答案是否與參考答案完全匹配。?簡單但嚴格。適用于答案非常精確的事實類問題。在RAG中,它指示LLM是否正確提取并格式化了精確信息。?
局限性:如果措辭不同但含義相同,則無法捕捉語義相似性。? - BLEU(雙語評估測試):比較生成文本和參考文本的n-gram(詞序列)。分數(shù)越高,重疊度和相似度越高。?適合評估流暢度以及生成的答案如何從相關(guān)檢索內(nèi)容中捕捉關(guān)鍵短語。?
局限性:主要關(guān)注詞匯重疊,語義意義關(guān)注較少。? - ROUGE(面向召回率的摘要評估):一組指標(ROUGE-N、ROUGE-L、ROUGE-S),用于衡量n-gram、最長公共子序列或跳躍二元模型的重疊度,通常側(cè)重于召回率(生成的文本覆蓋了多少參考內(nèi)容)。?這對于摘要任務或預期生成的答案涵蓋檢索到的文檔中的廣泛事實時特別有用。?
MultiRAGen使用多語言ROUGE:這對于多語言RAG系統(tǒng)至關(guān)重要。它擴展了ROUGE,使其能夠比較不同語言的文本或評估跨語言摘要,確保無論生成語言如何,語義內(nèi)容都能得到保留。? - METEOR(具有明確排序的翻譯評估指標):除了n-gram重疊度之外,METEOR還融合了同義詞、詞干提取和釋義,并考慮了詞序。與BLEU或ROUGE相比,它能夠提供更穩(wěn)健的語義相似度和流暢度評估。
多模態(tài)輸出評估(針對特定模態(tài)的輸出)
雖然你的主要LLM輸出可能是文本,但如果多模態(tài)LLM生成圖像或音頻(例如,圖像字幕、從文本生成聲音),這些指標就會變得相關(guān)。
對于圖像字幕(例如,當大型語言模型從圖像生成字幕時):
- CIDEr(基于共識的圖像描述評估):衡量生成的標題與一組人工參考標題之間的相似度。它使用TF-IDF(詞頻-逆文檔頻率)對n-gram進行加權(quán),賦予稀有但重要的詞匯更高的權(quán)重。如果你的MLLM是生成檢索到的圖像描述的系統(tǒng)的一部分,CIDEr可以幫助評估這些描述的質(zhì)量。?
- SPICE(語義命題圖像標題評估):專注于標題的語義內(nèi)容。它將標題解析為語義“場景圖”(對象、屬性、關(guān)系),并對這些圖進行比較。這對于確保LLM的標題能夠正確識別和關(guān)聯(lián)視覺元素至關(guān)重要,這對于實現(xiàn)準確的多模態(tài)理解至關(guān)重要。?
- SPIDEr(結(jié)合兩種指標):通常是圖像字幕任務的首選指標,因為它平衡了詞匯重疊(CIDEr)和語義準確性(SPICE)。?
語義對齊/跨模態(tài)一致性
這些指標評估在檢索和推理過程中不同模態(tài)(例如文本和圖像、文本和音頻)之間的相互理解程度。
- BERTScore:比較生成文本與參考文本/檢索內(nèi)容的語境化嵌入(來自BERT或類似模型)。它本質(zhì)上衡量語義相似度。?非常適合評估生成響應的流暢性和語義質(zhì)量。此外,它還可用于評估文本查詢與檢索到的多模態(tài)塊的文本成分(轉(zhuǎn)錄、描述)之間的語義重疊度。?
它會匹配候選句子和參考句子中的單詞,計算它們在BERT嵌入之間的余弦相似度,然后根據(jù)這些相似度計算準確率、召回率和F1。? - CLIP評分:使用CLIP(對比語言-圖像預訓練)模型的嵌入來測量圖像與文本描述之間的語義相似度。?
a.檢索:評估檢索到的圖像在語義上與文本查詢的匹配程度,反之亦然。
b.生成:如果你的MLLM生成圖像描述,CLIP評分會評估這些描述與圖像本身在語義上的對齊程度。它是圖文對應關(guān)系的有力指標。
圖像質(zhì)量(如果LLM直接生成或處理圖像)
這些指標關(guān)注生成或處理的圖像的感知質(zhì)量和多樣性。
- FID(Fréchet Inception Distance):使用從預訓練的Inception-v3網(wǎng)絡中提取的特征,量化生成圖像與真實圖像的特征分布之間的相似性。FID分數(shù)越低,表示質(zhì)量越高,與真實圖像的相似度也越高。?如果你的MLLM具有生成圖像的能力(例如,根據(jù)檢索到的文本描述生成圖像),F(xiàn)ID會評估這些生成圖像的真實度。?
- KID(Kernel Inception Distance:核初始距離):提供一種比FID更無偏且更魯棒的替代方案,在Inception特征上使用多項式核。不易出現(xiàn)模式崩潰問題。?與FID類似,用于評估生成圖像的感知質(zhì)量。?
- 初始分數(shù)(IS):通過測量生成圖像的條件類別分布與邊緣類別分布之間的KL散度來評估圖像的多樣性和質(zhì)量。它使用預先訓練的初始模型對圖像進行分類。IS值越高,質(zhì)量越高(圖像可分類)和多樣性越高(圖像屬于不同的類別)。?
這是為了確保生成的圖像既逼真又多樣化。
音頻評估(如果LLM直接處理或生成音頻)
這些指標評估音頻的質(zhì)量和相關(guān)性。
- 人工標注的聲音質(zhì)量(OVL-整體質(zhì)量水平)和文本相關(guān)性(REL-與文本的相關(guān)性):人工主觀評估。OVL評估聲音的感知質(zhì)量(清晰度、無噪點、自然度)。REL評估音頻內(nèi)容與給定文本(例如,查詢或生成的轉(zhuǎn)錄)的對應程度。這對于真正理解音頻的用戶體驗至關(guān)重要,因為自動化指標可能會忽略細微差別。?在RAG中,你可以使用OVL來確保檢索到的音頻足夠清晰,以便LLM進行處理,并使用REL來確保音頻內(nèi)容在語義上與文本上下文一致。?
- Fréchet音頻距離(FAD):FID的一種音頻專用變體。它使用從預訓練音頻分類模型(例如VGGish)中提取的特征,量化生成的音頻樣本與真實音頻樣本的特征分布之間的相似性。FAD值越低,表示質(zhì)量越高,與真實音頻的相似度也越高。如果你的MLLM生成音頻,F(xiàn)AD會評估生成音頻的真實度和質(zhì)量。
Ⅱ、生成指標
這些指標重點關(guān)注生成的答案的質(zhì)量及其與檢索到的上下文的關(guān)系,特別考慮到信息的多模態(tài)性質(zhì)。
- 正確性:這是最直接也是最關(guān)鍵的指標。它評估LLM生成的答案是否在事實上準確,并針對用戶的查詢提供了正確的信息。?在多模態(tài)RAG設置中,“正確性”意味著答案能夠準確反映檢索到的塊(文本、圖像、音頻轉(zhuǎn)錄)的任何模態(tài)中的信息。?
例如,如果用戶問“汽車是什么顏色的?”,而檢索到的圖像清晰地顯示了一輛紅色汽車,則正確答案是“紅色”。?
如果音頻片段確認了日期,則答案應該反映該日期。? - 相關(guān)性:這評估生成的答案是否直接解答了用戶的問題,并提供了實用且相關(guān)的信息,同時不包含多余或偏離主題的細節(jié)。?答案的相關(guān)性是根據(jù)用戶的多模態(tài)意圖來判斷的。如果用戶提供了一張圖片并詢問其中的特定對象,則答案必須與該對象相關(guān),并充分利用視覺信息和文本查詢。?
- 文本忠實度:這評估生成的答案是否完全基于檢索到的語塊文本部分中的信息并與其保持一致。它旨在防止出現(xiàn)“幻覺”或編造文本來源中不存在的信息。在多模態(tài)RAG系統(tǒng)中,此指標專門用于區(qū)分文本的忠實度。它有助于確定LLM是否正確地從文本段落(例如,從轉(zhuǎn)錄的音頻、文檔文本、表格摘要)中提取和總結(jié)信息。如果文本內(nèi)容為“貓坐在墊子上”,而LLM內(nèi)容為“貓坐在床上”,則不符合文本忠實度。?
- 圖像忠實度:評估生成的答案是否與檢索到的圖像中呈現(xiàn)的信息有事實依據(jù)且一致。它確保LLM不會誤解或?qū)σ曈X內(nèi)容的細節(jié)產(chǎn)生幻覺。?這對于多模態(tài)RAG至關(guān)重要。如果檢索到的圖像顯示“一只藍色的鳥”,但LLM卻顯示“一只綠色的鳥”,則圖像忠實度不合格。它直接考驗LLM準確感知和使用視覺信息的能力。?
- 文本上下文相關(guān)性:這評估檢索到的文本塊(包括轉(zhuǎn)錄的音頻和表格摘要)與用戶查詢的相關(guān)程度。它是衡量檢索組件對文本源的準確性的指標。?雖然用戶的查詢可能是多模態(tài)的(例如,文本+圖像),但此指標專門檢查系統(tǒng)是否提取了對答案有用的正確文本文檔或塊。如果文本塊描述的是“水泵”,而查詢是關(guān)于“水龍頭”的,則相關(guān)性較低。?
- 圖像上下文相關(guān)性:這評估檢索到的圖像塊與用戶查詢的相關(guān)程度。?
如果用戶查詢“自行車齒輪”,系統(tǒng)檢索到一張自行車輪胎的圖像,則圖像上下文相關(guān)性較低。如果檢索到一張變速器的詳細圖表,則相關(guān)性較高。這時,圖像的多模態(tài)嵌入(例如,通過Gemini或CLIP)就至關(guān)重要。
Ⅲ、系統(tǒng)級/端到端指標
這一部分指標評估了整個RAG系統(tǒng)的整體用戶體驗和性能。
- 響應時間(延遲):系統(tǒng)多快提供答案?(多模態(tài)處理可能更加密集)。?
- 魯棒性:系統(tǒng)如何處理嘈雜的輸入(模糊的圖像、低沉的音頻)、模糊的查詢或缺失的模態(tài)??
- 用戶滿意度:最終指標,通常通過調(diào)查或隱性反饋(例如,重新查詢率)收集。?
- 成本效益:運行多模態(tài)編碼器、嵌入和LLM推理的計算成本。
Ⅳ、評估方法
- 人工評估(黃金標準):對于多模態(tài)連貫性、忠實度和整合質(zhì)量等細微方面,人工注釋者通常不可或缺。他們可以評估相關(guān)性、正確性和整體答案質(zhì)量。?
- LLM-as-a-Judge:使用強大的LLM,根據(jù)預定義標準和檢索到的上下文來評估RAG系統(tǒng)的響應。這可以自動化某些人工評估環(huán)節(jié),但需要謹慎、及時的工程設計。?
- 定量基準:對于檢索而言,創(chuàng)建包含多模態(tài)查詢和嚴格標注的相關(guān)多模態(tài)文檔的數(shù)據(jù)集至關(guān)重要。對于生成而言,創(chuàng)建用于比較的黃金標準答案至關(guān)重要。?
- A/B測試:對于實際應用,通過將不同的RAG策略或模型部署到不同的用戶組并測量參與度、任務完成率或用戶滿意度來比較它們。?
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。?原文標題:??Enhancing LLM Capabilities: The Power of Multimodal LLMs and RAG?,作者:Sunil Rao
