如何讓大模型自由使用外部知識與工具?
一、背景介紹
首先介紹示例“德州的 NBA 球隊有哪些?他們分別在哪一年獲得 NBA 總冠軍?”對于這樣的問題,ChatGPT 可以非常準確地回答。這個例子說明了類似 GPT 的模型,已經有非常強的世界知識記憶能力,并且存儲在它們的參數當中,針對不同的問題,它能夠準確地將其調用回答該問題。
“在2000年以后,有哪些球隊沒有獲得過總冠軍?”對于較難的問題,ChatGPT 還能夠完成嗎?實際上是不行的。類似的例子還有非常多。哪怕模型記住了某個知識,但并不能進行較為嚴格的邏輯推理。對于它不會的問題,它就不回答。這樣的能力它們暫時還是缺失的。這隱含了包括大模型在內的很多神經基礎模型(Neural Base Model)的一大缺陷,這是因為大部分的外部的知識都是通過類似 Continuous representation 的方式存儲在模型的參數當中。因此,當處理邏輯推理或離散推理的場景時,通常來說,這些模型并不能很好地回答。
例如剛剛提到的需要一定的邏輯推理才能解決的問答系統,或者想構建一個尋路系統,比如在 UCLA 里,部署自動送外賣的工具。顯而易見,如果想找到目標的位置,需要實現尋路的算法,像 DFS 找最優的路徑。這個算法想用神經網絡(Neural Network)完成,通常需要大量的數據。如果只采集某個特定領域(Domain),訓練出來的模型,通常來說也只能夠適用于該領域,而不能遷移泛化。
這一系列的問題激發了我個人博士生涯的工作,如何讓傳統的 Symbolic AI 工具被神經網絡所使用。之前提到,需要進行快速和慢速思維(Fast and Slow Thinking),普遍的認知是神經網絡可以快速推理,回答簡單的問題,比如識別一個 Object,判斷句子是正向還是負向。而對于相對較難的需要一定的思考才能解決的問題,比如圍棋、尋路可能會需要一定的外部的工具或者知識才能解決。
如何將這兩個模塊進行交互并且合并。傳統的方法都是基于解析(Parsing)的方法,也就是將自然語言的輸入轉化為程序,并能夠被 Symbolic 模塊執行。中間的程序通常需要大量的標注才能訓練,我的研究方向更多的是能不能不構建所謂可微分的 Neural-Symbolic AI,還是以神經網絡作為解決問題的模型。希望模型能自由地和外部的工具(logical、計算器或知識圖譜)進行可微分的交互。過程當中,察覺到某個問題需要某種特定的工具,能夠向對應的工具發送相應的請求,得到對應的回答。中間的交互過程能夠盡可能地被可微分化,可計算梯度,輸入和輸出能夠表示成嵌入(Embedding)的形式。這樣,在給定一個數據集,甚至是無標注數據集上,能夠將整個系統直接進行預訓練,而不需要中間結果的標注,這是最終的愿景。顯而易見,如果這樣的系統能夠實現的話,它能夠直接訓練于無標注的數據集,比如文本或結構化的數據。
今天報告主要展示三個工作,可能運用了不同水平的 Symbotic 模塊。
- 第一個工作,嘗試如何讓語言模型調用知識圖譜中的信息,并進行簡單的推理。知識圖譜是否能幫助模型解決復雜的問題。
- 第二個工作,嘗試遷移到多模態。如果給定更多的數據集,比如視覺語言或網絡數據,是否可以訓練模型,使其根據不同的 Query自動地選取出更最相關的觀點(Points)輔助式獲取答案。
- 第三個工作,是否可以利用大語言模型動態的生成最適合解決某個問題的小程序。基于這個小程序調用不同的工具,解決需要上網搜尋或爬取信息的較難的問題。
二、OREO-LM: 用知識圖譜推理來增強語言模型
1、為什么想使用知識圖譜
介紹基于知識圖譜增強語言模型(OREO-LM)。為什么想使用知識圖譜呢?雖然知識庫已經被研究了多年,但它也有一定的局限性,比如不完整,它包含的信息可能只有節點信息。但它也有顯著的優勢,比如使用一個很大的知識庫或整個 Web 作為知識的來源。相對來說,知識圖譜相比這類知識庫較為輕量,它已經將世界的知識抽象成離散的,并且每個節點使用少量的信息,輕量并簡單的知識表征形式。因此可以非常容易地將其和部署的大小模型存儲在同一個地方,快速地調用并執行。由于它的離散形式、圖結構,如果處理帶有邏輯推理或多跳的問題,知識圖譜可以非常容易處理該問題。例如“哪一位是圖靈獎獲得者,同時出生在加拿大”,可以在知識圖譜上獲得對應的結果。
推理過程可以抽象成簡單的邏輯推理的表達式,之前已經有非常多的借助知識圖譜或其他的知識庫來增強語言模型的工作。一種非常簡單的方式,比如給定知識圖譜,可以預訓練一個 KG 嵌入,知道每個實體的向量嵌入的表征,然后將該表征加到詞嵌入。這種方法一定程度上將知識圖譜里的某些信息讓模型獲得,顯而易見,這種增強的方式并沒有充分地利用圖譜的推理及交互能力。模型并沒有真正的在圖譜上進行游走,找到二跳的路徑,只是寄希望于向量嵌入能夠記住相應的圖里的所有的信息,顯而易見,其是有缺陷的。
2、知識推理與語言模型結合
我們的工作當中希望模型能夠更自由地和外部的知識圖譜進行交互,并且嘗試在圖上進行游走與推理。實際過程當中,給定義預訓練的語言模型,比如T-5將模型所有的參數凍結或微調。預訓練的模型將它切成若干塊(Block),比如說語言模型編碼器(Language Model Encoder)切成3塊。塊與塊之間,加入知識圖譜交互層(Knowledge Graph Interaction Layer)也就是語言模型知識圖譜的交互層。在每個交互層之中,提取出比較難,需要從知識圖譜里面獲得信息的 Query,將這些 Query 以嵌入形式發送給 KG,這樣 KG 就能夠根據 Query 進行游走,比如從 Germany 出發,走不同兩條路徑得到新的節點。然后將該信息通過嵌入形式傳回語言模型,這樣的交互可以重復多次,從而讓模型處理需要多跳才能解決的問題。我們將交互層加在語言模型塊中,所以將模型稱之為 OREO-LM,交互像是奶油,模型就是餅干。
3、介紹語言模型是如何運作
我們的工作核心是在圖上進行游走。很自然地在最開始的時,需要獲得問題里最基礎的圖上的表征。首先使用已經預訓練的實體鏈接(Entity Linking)模型,找出 Query 中有哪些基礎的實體。有多少實體,圖譜初始化多少個推理狀態(Reasoning State),推理狀態的初始化100%停留在最初始的實體上。
之后,需要讓模型能在圖譜上進行游走。在這篇工作當中,游走的表征就是將圖譜的推理表征成有限狀態機(Finite-State Machine),即每一個階段維持新的實體分布,而每一次更新過程相當于在圖譜上做一次實體分布的更新。
為了實現這一點,每一次更新過程之前知道下一步更新時往哪個方向走,即在當前情況下,下次游走的關系(Relation)是什么。在這份工作當中,把輸入表示成分布。假設1000維度的概率分布,每個維度表示預測要使用該關系的概率。根據這關系分布游走,也就是重新估全圖上每一條邊的權重。比如開始有100%的概率在 Bohos 節點,而 Bohos 有三條出去的邊(Influenced、Founded和is a),假設 Founded 有最高的概率,會將它賦予最高的概率的權重。在下次更新過程當中,會以更新過的圖上的權重來做游走。那么更新之后最高概率的節點就變成了 Walter Gropius。整個過程可以被表示成一個簡單的在圖上的隨機游走的形式,因此稱該過程為情境化隨機游走。這個步驟是完全可微分的,如果在數據集上訓練,模型可以直接傳遞梯度到關系和實體的模塊當中。在這個框架下如何獲得關系?在傳統的工作中,首先識別出問題中需要哪些最基礎的關系,可以先通過解析方法把它轉成一個程序,如果希望用神經網絡的方法和 KG 進行結合的話,并不能預先獲得該信息。
那么如何得到該信息?實現方式是在識別出的每個實體后,增加兩個特殊 Token(RET、T-ENT)。這兩個 Token 是語言模型和外部的知識圖譜進行交互的條件。在若干個語言模型塊之后,會將 RET 的嵌入輸出,將它與預先得到的關系鍵存儲器(實體嵌入,關系嵌入)進行相乘來得到預測的關系分布。所有的關系 REL 的輸出和關系存儲器都是可以被訓練的,因此將模型預測出的關系輸出發送給 KG,KG 進行一次的游走。在每次游走后,得到更新的實體分布,將這個信息傳送給模型。一種非常簡單的方式就是將它加權平均于一個實體存儲模塊(Entity Memory),每個實體還是表征實體嵌入。這種方式它非常簡單粗暴,但有缺陷,尤其是表征有多個實體的集合。如果集合當中包含了兩個離得特別遠的實體,比如一個形容一個人、一個建筑,那么這兩個的平均值并不一定是最合理的實體表征。在我另外的一篇工作基于快速邏輯的方法中,選用了 Fast set 表征 set 嵌入。在這工作里,為了簡單實現,使用加權平均數。通過實體分布的加權平均,得到更新以后的實體嵌入,直接將這嵌入加在目標實體之后。通過這種模式,可以非常容易地將更新后的知識傳輸給模型,并且整個 Query 和檢索結果的所有過程都是可被微分的。
這整個模塊可以被重復多次。在第一次的 State transition (推理)之后,在經過若干個語言模型的內部的推理后,增加第二次交互層就可以實現多跳的推理。比如在第一跳的過程中得到 Walter Gropius,在第二跳知道 Walter Gropius 參與了哪些事件?發現預測和之前第一步的不同,第二次的最高關系變成 Participate,這樣就可以得到最終的結果。
在整個過程中,語言模型和知識圖譜并不是互相割裂的,兩個模塊是互相幫助彼此。語言模型能夠幫助知識圖譜更好地預測,在圖譜上應該怎么樣游走來預測最合理的關系。同理反之,知識圖譜告訴語言模型解決這個問題需要哪些相應的知識。因此這兩個模塊可以有機的進行結合。
4、實驗結果
實驗選用 T5 作為基礎的語言模型。在 T5 的基礎之上增加 OREO-LM 塊。尤其在 Multi-hop QA 上,這種增強模式有非常大的模型性能提升。
同時除了能夠提升模型的性能以外,這種顯式的知識圖譜推理也能幫助更好地解釋模型的決策。比如問“where was the Lisa kept during ww2”模型不止準確的回答“the Ingres Museum”,同時還能將模型預測的關系進行top1的選擇,了解它們通過怎樣的路徑得到最后的結果。比如說 Lisa 的創始人在哪里,以及 war 2發生在哪里?通過這兩條路徑,能夠更準確的得到最后答案,并且理解模型為什么會輸出該答案。
在之前的實驗結構里展示了 OREO-LM 能夠提升模型的推理性能。但是,該性能提升是否真的來自于知識圖譜的推理,為了驗證這一點,做了一個蠻有意思的實驗。首先,選擇知識圖譜上的非簡單的 Triple。這些 Triple 只要能夠找到對應的知識圖譜上的一個實體(能非常容易獲得回答)。但是,為了驗證模型有一定的推理能力,不希望知識顯式存在 KG 里面。我們將對應的某一種類型的知識全部從 KG 里刪除。比如將所有包含 Capital Of 的邊全部從 KG 里刪除。如果模型還能回答對應的問題,邊(Edge)是它已經記住的知識,或它必須從圖譜上進行多跳的推理,或選擇其他的知識和邊來輔助回答模型預測出這一條不存在的邊。
實驗結果,如果增加多個推理模塊,在刪除知識的邊之后,性能下降會越來越小。某種意義上,在顯式的知識圖譜上推理確實提升模型的魯棒性,尤其是對于在知識圖譜缺失了很多信息的情況下面,它還能通過多跳來輔助回答相應的問題。為了進一步驗證這一點,我們將不同的刪除掉的 Query,模型到底選擇哪條多跳路徑來展示成了一個樹的形式。每條路徑可以簡單的理解為單一邏輯規則。比如想預測首都在哪里,模型的選擇路徑:先知道這個國家的總統在哪里,總統是誰,這位總統居住在哪里或者哪個地方工作,這條簡單的路徑可以用來輔助預測這個國家的首都是哪里。同樣預測一個人的伴侶,他工作在哪里或他居住在哪里,或他使用怎樣的語言,都可以通過其他的路徑去預測。
實驗和結果總結,如果想增強神經基礎模型,僅使用最基礎的 Symbolic Operator。在這份工作里,只是最基礎的知識圖譜游走,就已經取得很不錯的性能,哪怕使用較小的模型參數,也能取得很好的性能。為了讓整個框架能真正的 Work,最核心的一點是可以端到端訓練,不需要中間的任何的標注,只在無標注得數據上就能學到如何真正的推理。如果想訓練而不需要中間標注,讓推理過程(尤其是 symbolic 推理)變得可微分是一個最關鍵的步驟。通過這種方式,模型可以直接在每個下游 QA 數據集做預訓練或端到端訓練,這是讓模型能夠真正 Work 的關鍵。
三、REVEAL: 用多個知識庫檢索來預訓練視覺語言模型
以上工作可能局限于純文本領域,并使用了知識圖譜,我們知道非常多的知識源,比如網上的文本或知識庫。在 REVEAL 介紹如何讓視覺語言模型使用多知識源?比如“這個小玩具和哪一位美國總統有關聯?”,從維基百科中獲得美國的總統和泰迪熊的信息,找出相應的 Triple,甚至可以從 VQA 數據集里找到相關的問答對。統一將所有選取出來的相關的知識合并在一起。工作的目標是讓模型能選取出來自不同知識源和問題相關的知識;使視覺語言模型具備更好地回答較難問題的能力,能端到端訓練;只在一個數據集中學習檢索怎樣的信息,怎樣將它們給合,并且回答相應的問題。
這類需要外部知識的問題,不僅在純文本里很重要,在多模態中也重要。最近幾年大家越來越關注外部支持的 VQA 答案,比如“在飯里哪部分擁有最多的碳水化合物?”。這樣的問題,不僅需要模型能夠理解圖片里出現什么樣的 Object 以及它們之間的關系,還需要一定的外部知識。比如,米飯是一種主食,而主食包含了最多的碳水化合物。我們的解決思路是讓模型能夠有能力和外部的知識庫進行存儲模塊查找。將所有的外部知識統一編碼在存儲模塊里,傳送模型能夠選取相應的 Token 和知識的結果。
為了實現這一點,需要將不同的 Multimodal 變成 Multi-Source 的 Multi-memory 編碼到統一的存儲模塊里,它的鍵和值的表征需要完全一致。簡單的做法是選用已訓練好的視覺語言模型,比如 Multimodal 的基礎模型,利用它將視覺語言的輸入轉化成序列 Token,并將其全都存儲在大的存儲模塊里,動態地選取,顯而易見是可行的。當文本非常長(圖像本身包含非常多的信息),如果將它全部壓縮在一個序列 Token 里面,可能會有幾百甚至上千個 Token,每個 Token 是一個嵌入。如果存儲在在線服務里,不太可能存儲非常多的知識,最多存儲幾十萬個,不能到幾百萬甚至上千萬,更不用說上億。
1、多模式語料庫中存儲模塊的構建
為了解決這一點,我們選用感知模型(Perceived Model),也就是基于 Transformer Decoder 的框架來壓縮每個知識的實體。比如,原始有1000維度的輸入序列,將它輸入感知模型,該模型可以預先設定好最終保留幾位的知識 Token,如果想保留16位,隨機初始化16位的輸入,將它作為 Decoder 的輸入,壓縮的信息作為 Decoder 的 Key 和 Value,然后將它壓縮成16維的 knowledge value。
通過這種方式,可以將來自不同知識源的數據集里每個實體表示成一個 key-value 對。key 就是單一嵌入,而 value 是壓縮后的16維或32維的 Tokens 列表。壓縮后它大概只需要十幾維的嵌入來表示的知識實體。這統一的存儲模塊(Unified Memory)可以存儲百萬甚至千萬。如果實現云服務的話,可以實現接近上億或者更多的數據集的增強。
2、端到端訓練檢索模塊和問答模
接下來,將展示如何去借助統一的存儲模塊來增強已有模型。首先,展示最基礎的圖像到文本的工作流程。給定圖像和 Prompt,生成完整的說明文字,可以把它的前綴(prefix)也作為模型的輸入,來補全剩下的信息。最簡單的方式是用V-L編碼器把它轉換成 Tokens 列表,然后輸給解碼器自回歸生成后面的信息。示例,描述圖片里有什么東西,標準答案里包含菰屬(Zizania 物種)。這類長尾的單詞,對于較小的語言模型來說,比較難理解且記住。
如何使用外部的已有的統一的存儲模塊來補全信息?現在已有編碼好的統一的存儲模塊且可以動態地去更新,因為每次 V-L 編碼更新后,都會重新的更新 key 和 value。
在線上處理過程中,會根據已有輸入作為 Query 嵌入來選取出和該 Query 最相關的若干個,比如 Top k 個知識實體,將它的 value 取出。在選取過程中,因為知識存儲模塊包含來自不同的數據集,而對于不同的 Query 最相關的知識實體的數據集可能各不相同。因此先通過語料庫門控(Corpus Gating)選取出最相關的數據集,在該數據集中選取 k 個最相關的結果及對應的索引(Index),并選取出相應的 k 結果。
由于最大內積搜索算法(Maximum Inner Product Search)相應的實現,已經有非常多高效的 MIPS 的加速算法,比如基于哈希或基于聚類。這整個算法復雜度其實是 On 于存儲的數量,是非常高效的。
在選取出 k 個結果后,將它和已有的輸入進行融合。最簡單的方法是,直接將每個知識實體拼接在已經編碼好的語言輸入之后。但是,如果希望模型能端到端的訓練檢索的話,它并不能夠直接獲得訓練符。因此,我們實現了一個非常簡單的技巧,在計算得到檢索分數后,將分數承載在每個選取出來的知識實體之上,我們稱之為 Attentive Knowledge Fusion。
實現如下,在計算每個 Query 和知識實體的注意力分數時,將這兩個嵌入進行乘積,它表征了模型預測出每個知識實體有多相關于每個輸入,如果想進一步優化這點,需要判斷這個能力是不是真的對回答問題有用,那有什么信息能更好地輔助獲得這個過程。隱式的過程是模型計算出來的注意力分數,即實體有多好的幫助模型回答相應的問題。為了使模型能夠得到這過程,將計算出的檢索分數乘在每次計算自注意力之前,歸一化之后。假設有6層的注意力編碼,會將信息承接6次,讓它充分地獲得相應的 supervision signal。
通過這種方式,如果在訓練過程中知道某個知識實體非常有用,它對應的注意力分數需增加對應的比率得分,在下次更容易被檢索。
我們在描述圖片數據集上進行預訓練,將預訓練后所有的知識存儲模塊直接凍結,遷移到對應的 VQA 數據集,比如在 OK-VQA 上實現了非常好的結果。
3、實驗結果
在文章中選用4個不同的數據集:WIT、CC12M、Wikidata、VQA-2。將這四個數據集編碼在統一的存儲模塊中進行預訓練,并在 REVEAL 里面實現非常好的結果。比如 PICa 和ReVIVE 都使用 GPT-3 的模型作為顯式的知識庫。值得一提的是,在我們的模型中只用了輕量級的 10B 存儲在模型當中,不需要存儲 350B 的大模型,已經能取得比大語言模型更高的結果。
這里展示模型預測的知識對。比如識別“飛機的航空公司是什么”,模型根據 LOGO 準確地識別出來“加拿大航空公司”,然后找到其相關的兩個說明文字,并找出答案。
進一步,相對更難的例子,例如“這個巴士來自于哪個城市”,人比較難以回答。但通過模型可以找出和巴士非常相似的同款設計風格的來自于舊金山的公交系統。模型最后準確的回答它是來自于舊金山。同理,還能找出其他的需要一定的外部知識補全才能夠回答的案例。
同樣的,這個模型并不僅僅能處理 VQA 的任務,對于加說明文字的數據集也能取得非常好的結果。
除了取得更好的性能外,還希望檢索方法有更好的適應能力。尤其基于 GPT 的模型,通常是收集2021年前獲取的數據做預訓練。但對于最近發生的新聞或信息,沒有辦法高效地更新。我們在實驗中,測試它對沒見過的知識,是否有很好的適應能力。因此在預訓練和微調過程中刪除一定比例的知識實體,比如隨機的從知識代碼里刪除50%的信息,在預訓練之后,僅在最后的推斷階段將該信息給補上。
測試發現,如果全部刪除掉,它的性能下降非常大,上圖藍色線。但是補全后,結果和開始用100%的信息相差無幾。這種結果某種意義上說明,即便在預訓練和微調階段并沒有見過相應的知識,只要在最終推理階段將知識進行補全,或有最新的知識加入到模型,其有能力去選取出相應的實體來回答問題。
總結,我們提出了 REVEAL,其包含了一個非常高效的知識檢索,它可以使用不同的知識源,每個知識源來自于不同的方式,不同的表征。利用所有數據集來幫助回答相對較難的,需要一定知識的問題。我們通過一個非常簡單,但有效的注意力融合的技巧,使 REVEAL 直接在大的語料庫上預訓練,而不需要中間的標注。
四、AVIS: 讓大模型用動態樹決策來調用工具
以上兩份工作,選用的語言模型都是相對較小的 T5 基礎模型。隨著 OpenAI 發布了 GPT-4,很多的熱潮慢慢遷移到我們能不能使用大語言模型解決各種各樣的問題,大語言模型有它自己的缺陷,例如它并不能夠很準確地回答邏輯推理的問題,有沒有可能讓自由地調用外部的工具和知識庫來輔助它解決。通常來說,是不太能直接獲得大語言模型中間表征的參數,因此在這個工作里我們并沒有真正去實現可微分的訓練。相應的我們更多的是使用基于 Prompt 的方法讓語言模型學會調用相應的工具,和如何利用它解決較難的問題。
1、外部工具
比如嘗試讓基于 GPT 的模型或者其他的大語模型調用 Google 的搜索工具,包括文本搜索工具和視覺搜索工具 Lens,它能夠識別圖片里的 Object 和它相關的產品或描述。通過它的輸出回答,不僅僅能給出最基礎的回答,還能標注出每個回答來自于哪個知識源,幫助人類檢驗回答是否準確。
對于需要數學推理的問題,可以利用數學計算器,比如 Wolfram Alpha,是非常強大的科學計算器,可以輔助回答較難的需要一定的數學推理才能解決的問題。
2、外部工具增強的大語言模型
在我們工作之前,其實已經有非常多相應的工作,比如給定較難的問題,利用語言模型拆解成基礎工具調用的程序,通常都是 plan-then-execute 的框架。先利用語言模型作為規劃模塊將復雜 Query 轉化成小的程序。而每個程序就是調用哪個 API,獲得怎樣的結果,回答怎樣的問題。最近效果非常好的例子是,Chameleon 接受不同的模態的問題,將它拆解成 API 列表。比如知識檢索或程序生成器分別調用特定的外部 API 回答相應的子問題。
另一個受到關注的工作是來自于哥倫比亞大學的 ViperGPT 的工作,同樣也是生成 Python 基礎程序。比如回答“how many muffins can each kid have for it to be fair?”首先計算出圖片里有多少松餅,有多少小孩,計算出數量后,確定是否整除,以回答對應的問題。
3、plan-then-execute 的框
這類工作,通常按照 plan-then-execute 的框架。先利用大語言模型的規劃模塊將問題拆解成子問題列表,而每個子問題可能對應一個 API,根據生成出來的程序分別去執行。當然每個執行過程也可以使用大語言模型。但該框架也存在問題。比如其默認問題本身已經包含足量的信息,這樣它才能生成非常完整的程序。
NLP 領域里已經有人研究,如果問題不完整,包含了所謂的印象深刻的推理,比如問題“Did Aristotle use a laptop”,如果拆解成子問題的話,首先需要知道 Aristotle 出生的年份,以及這年份 laptop 是否被發明,最后計算兩者的年月的順序。中間潛在的推理并沒有被顯式地表征在問題里,需要在執行過程中隱式的地生成出來。就像下圍棋,下第一步時并不知道100步后會怎么執行。這是第一個很大的問題。如果在最開始就生產出程序,便不能根據執行過程中的反饋來動態更新程序。第二個問題是,某時刻執行過程不確定。比如回答子問題“圖片里面的汽車來自于哪個品牌?”回答該問題可以用不同的工具解決,比如簡單的 VQA 或生成說明文字再維基搜索。實際上,我們并不知道最終是哪個工具準確地回答該問題。可能是 VQA,但其給出模棱兩可的答案,并不能真正地滿足要求,這時就切換到另一個工具。但如果事先已經存在固定的程序話,就不存在自由切換中間執行過程。
因此,在實行過程中希望能更自由、更動態地讓模型做規劃以及執行。我們實現了大致的框架如上圖。兩個模塊,一個規劃模塊預測出每個階段選用哪個 API,并且發送對應的 Query,根據這個信息選擇并調用對應的 API,得到對應的結果。在該結果之后,判斷該結果是否正確地回答相應的問題。如果沒有,需要再次回到之前的結果。如果某條路徑沒有回答,需要回溯到之前的節點,再次進行規劃;如果回答了子問題,需要進一步決策;如果已經回答了完整的問題,則提前結束搜索過程。
上圖展示如何利用整個框架解決問題。比如“How many floors does this building have?”首先,模型先預測出圖片里有哪個 Object,并進行選擇。根據選擇的 Object 做圖像搜索,找出哪些圖像和Object比較相似,而圖像搜索的過程中得出其是 Bridgewater Place。在推理過程中獲得其確實是答案,回答子問題。但還要回答它有多少層,這則需要一定的常識或領域知識,不是模型本身已存在的記憶。因此,需要借助網絡搜索,比如 Google 或 Bing,回答對應的結果32。
類似的例子較多,每個例子每次中間結果生成的 API 都不一樣。有時選擇的路徑無效,需要選擇另外一個目標,我們的框架可以支持的動態選擇。
追蹤框架如何實行,包含以下幾個模塊。首先,獲得基礎的 M,最開始只保存輸入數據,同時存儲 State 在初始節點。在規劃階段,根據當前的 Memory 決定下一步選擇怎樣的 API 及其對應的 Query。執行結果輸入給 Reasoner,其判斷該結果是否有用。將這個信息加入到 Working Memory 后來判斷 Reasoner 的結果是沒用、有用還是已經回答問題。如果沒用,回到第二個結果,并把 Working Memory 踢出,重新進行遞歸;如果包含有用的信息,更新當前的 State;如果已經回答了對應的問題則跳出。
這個框架的核心在規劃模塊,也就是每個階段選用哪個 API,以及發送怎樣的 Query。實現這點,可以使用 GPT 4 直接做 Zero Shot 的預測,或提供一定的上下文來進行預測。如果 API 的數量達到幾百上千,那Prompt尤其是輸入給模型的例子會非常大。現在大語言模型其實并不能接受非常長的文本輸入。隨著使用的API的數量增多,它并不一定能適應長的 Prompt。因此在這份工作里借助了人類知識,即人工標注者在 VQA 數據集上進行簡單的標注,作為人類如何使用這些工具來回答相應的問題,在收集了幾百個結果后,構建 Transition graph。人類在每個節點或當前情況下會選擇使用哪些工具?一般情況下,不會直接進行網絡搜索。因為,開始并不知道圖像包含哪些信息。通常來說,最開始先用 Captioning 模型或 Object 選擇模型找出最基礎的信息。根據人工定義好的 Transition graph,根據當前的 State 確定下一步有哪些可操作的 Action state。這個 Action 的數量肯定會遠遠小于所有的 API 列表。比如全部有100個,下一步可能只需要10個。然后根據選用的10個和之前人工標注出的 Prompt 動態地生成出最適合當前的上下文 Prompt 輸給模型。模型根據動態生成的 Prompt 預測下一步選用的 Action,以及它對應的輸給 API 的 Query。
圖中展示回答“when was the drum first used for this event?”首先,要了解鼓是什么,以及鼓發生在哪個年代才能回答這個問題。首先找出 object,輸入給大語言模型來選擇哪個 object 與這個問題最相關,可能會選擇錯誤的object,比如選擇第一個,輸給 Reasoner 來判斷它有沒有回答這個問題。如果第一部分選擇的信息沒有鼓,模型則沒有回答正確,那么需要進一步的選擇(像搜索樹一樣直到回答問題)輸給下一步規劃階段,該步知道是什么鼓和鼓的事件,通過 Google 搜索回答出對應的問題。
4、實驗結果
實驗含有最新的 Infoseek 數據集,這是比較難的需要關聯信息才能回答的 VBQ 數據集。上圖發現,之前非常強的 baseline,比如 PALI 哪怕是微調之后也只有16%。第一個 PALM 的模型也只有12.8% ,這樣的結果基本屬于沒有完全的回答。但是在加了所有工具以及規劃階段框架后,能接近50%的準確率,已非常接近完成數據集一半的問題。在此對細節不做展示,包括 Prompt 如何去設計,如何進行用戶實驗,大家感興趣的話可以仔細查閱論文。
最后進行一下總結,一共介紹了三個工作,一是如何利用知識圖譜作為知識庫,幫助語言模型進行較為復雜推理;二是如何使用更多的知識源幫助視覺語言模型,設置注意力和檢索得分的融合,讓模型能夠直接進行訓練;三是給定一個大語言模型,不做任何微調,如何設計一個框架,使其動態地生成最好的程序回答稍微復雜的問題。