這是OpenAI官方的cookebook最新更新的一篇技術博客,里面說明了為什么我們需要使用embeddings-based的搜索技術來完成問答任務。
本文原文來自DataLearner官方博客:OpenAI官方教程:如何使用基于embeddings檢索來解決GPT無法處理長文本和最新數據的問題 | 數據學習者官方網站(Datalearner)
盡管GPT的能力很強,但是OpenAI認為,基于embeddings的搜索依然十分重要。甚至,這種方式比模型做fine-tuning更好。本篇博客將簡單介紹一下為什么OpenAI認為目前基于embeddings的搜索是GPT的最強補充能力!
一、GPT的缺點
盡管目前GPT-4或者ChatGPT的能力已經很強大,但是目前它依然有很大的缺陷:
- 訓練數據是基于2021年9月之前的數據,缺少最新的數據
- 無法訪問我們無法公開的文檔
- 基于歷史會話中獲取信息
因此,OpenAI發布了這樣一篇文檔,說明如何使用兩步搜索回答來增強GPT的能力:
- 搜索:搜索您的文本庫以查找相關的文本部分。
- 請求:將檢索到的文本部分插入到發送給GPT的消息中,并向其提出問題。
GPT可以通過兩種方式學習知識:
- 通過模型權重(即在訓練集上微調模型)
- 通過模型輸入(即將知識插入到輸入消息中)
盡管微調可能感覺更自然——畢竟,通過數據訓練是GPT學習所有其他知識的方式——但OpenAI通常不建議將其作為教授模型知識的方式。微調更適合于教授專業任務或風格,對于事實回憶來說則不太可靠。
注意,這里說的是事實回憶,也就是說,如果你有自己的數據,只想從數據中獲得知識或者獲得相關的內容,那么搜索比微調可能更好。舉個例子來說,如果你有大批的歷史數據,你只想找到數據中你需要的部分,包括某些概念在哪里出現過,為什么使用了它等等。這些都算是事實回憶。
但是,如果你希望模型可以基于某種模式生成某些內容。例如,你希望模型可以基于XX風格生成某些工作日志甚至是宣傳內容,那么微調可能效果更好。
類比來說,模型權重就像長期記憶。當您對模型進行微調時,就像為一周后的考試而學習。當考試到來時,模型可能會忘記細節,或者錯誤地記住它從未讀過的事實。
相比之下,消息輸入就像短期記憶。當您將知識插入消息時,就像帶著開放的筆記參加考試。有了筆記,模型更有可能得出正確的答案。
相對于微調,文本搜索的一個缺點是每個模型一次只能讀取有限數量的文本,以OpenAI為例,其一次輸入的內容限制如下:
模型名稱
文本最長輸入
gpt-3.5-turbo
4096個tokens(大約5頁)
gpt-4
8192個tokens(大約10頁)
gpt-4-32k
32768個tokens(約40頁)
延續這個比喻,您可以將模型想象成一位學生,盡管可能有許多參考書可供借鑒,但一次只能查看幾頁筆記。
因此,為了構建一個能夠利用大量文本回答問題的系統,OpenAI建議使用“搜索-提問”方法。
三、文本檢索
搜索文本的方法很多,包括:
- 基于詞匯的搜索(Lexical-based)
- 基于圖形的搜索(Graph-based)
- 基于嵌入的搜索(Embedding-based)
OpenAI推薦的詞嵌入方法。嵌入很容易實現,并且在問題中表現尤為出色,因為問題通常在詞匯上不會與它們的答案重疊。
可以考慮將僅使用嵌入的搜索視為作為整個系統的起點。更好的搜索系統可能會結合多種搜索方法,以及特性,如受歡迎程度、最近性、用戶歷史記錄、與先前搜索結果的冗余、點擊率數據等。
通過將問題首先轉換為假設的答案然后再進行嵌入的技術,如HyDE,也可以提高問答檢索的性能。同樣,GPT還可以通過自動將問題轉換為一組關鍵詞或搜索術語來潛在地改善搜索結果。
四、如何建立基于embeddings的搜索系統來解決問題
總的來說,這樣的系統包含3個步驟:準備需要檢索的知識、檢索、提問即可:
- 準備搜索數據(僅一次)收集:即獲取你要用的數據,例如OpenAI的案例是下載幾百篇有關2022年奧運會的維基百科文章切塊:將文檔分成短小的、大多是自包含的部分以進行嵌入嵌入:使用OpenAI API對每個部分數據獲得embeddings結果存儲:存儲embedding是(對于大型數據集,可以使用向量數據庫)
- 搜索(每次查詢一次)給定用戶問題,從OpenAI API生成查詢的embeddings使用embeddings,按照與查詢相關性對文本部分進行排序
- 提問(每次查詢一次)將問題和最相關的部分插入到發送給GPT的消息中返回GPT的答案
簡單總結一下就是將原始數據用嵌入的方式存儲,然后針對問題獲取embeddings結果,再利用這個結果檢索最相似的內容,把這個提問和最相似的結果發給GPT,獲得GPT的回答即可。也就是說,這是另一種解決GPT無法回答最新數據和長文本內容的方法!
成本
這個方法比原始的方法來說多了幾個步驟,但是成本并不一定更多,因為GPT的接口比embedding的接口更貴。如果系統中查詢次數比較多,那么成本主要在步驟上面的步驟3(提問)。有個簡單的計算方法:
- 對于使用gpt-3.5-turbo來說,每次查詢假設1000個tokens,那么每次查詢成本0.002美元,約等于1美元查詢500次
- 對于gpt-4接口來說,假設每次查詢依然1000個tokens,那么每次查詢成本0.03美元,一美元可以查詢30次!
但是這只是簡單估算,具體的成本可能還要看系統什么樣子。
總結
這是一個非常棒的idea。可以解決目前GPT或者其它大模型沒有最新數據或者輸入限制的問題。在AutoGPT中,作者也有一個思路,就是每次都把最近的問題以及最相關的目標一起發送給GPT,獲得答案,以此來獲得更長記憶的能力。但是從實現效果來說,OpenAI這種利用Embeddings先獲取最相關文本再提問的方式可能是比較優雅的。而且也可以控制輸入和輸出的tokens。
官方有代碼實現案例參考原文末尾鏈接:OpenAI官方教程:如何使用基于embeddings檢索來解決GPT無法處理長文本和最新數據的問題 | 數據學習者官方網站(Datalearner)