作者 | Thomas Betts、Anthony Alford
譯者 | 平川
策劃 | Tina
本文要點
簡介
Thomas Betts:大家好。在 InfoQ,我們一直致力於向讀者提供最新的軟體創新和趨勢信息。我知道,有時候新消息滿天飛,我們主要關注那些與我們目前正在從事的工作密切相關的主題,或是我們感興趣的主題。有時,你可能會意識到,一些你以前可以置之不理的東西,現在已經不容忽視了。我承認,對於過去十年間的很多新聞,關於大數據、機器學習、人工智慧,我都是這麼看的。我發現這很有趣,但因為那不是我的工作,所以我對大多數主題的理解都很淺。這沒什麼問題。通常來說,軟體架構師就是這麼處理問題的。
我們所掌握的知識往往呈 T 形。我們需要了解的學科範圍很廣,但通常,我們只深入了解其中的幾個,除非我們不得不再去深入地了解其他學科。我認為,這就是 ML 和 AI 的發展現狀。那不再是一件無關緊要的事。架構師每天都要面對它們。因為產品負責人、首席技術官、執行長,甚至我們的客戶都在問,「能加入一些人工智慧功能嗎?」
就是這樣,我想到了今天的節目。我邀請了 Anthony Alford 來幫助解釋一些與 ML 和 AI 相關的概念。我認為,這些概念現在是成為一名高效的軟體架構師所必備的知識。Anthony 的聲音可能聽起來很熟悉,因為他也是 InfoQ 的編輯。他和 Roland Meertens 共同主持了 Generally AI 播客,那個節目剛剛開始第二季。Anthony,感謝你參加我的 InfoQ 播客節目。
Anthony Alford:謝謝你們的邀請。
Thomas Betts:對於我們今天的討論,我做了一個很大的人工智慧詞彙表。裡面有很多術語,我認為,架構師需要理解這些術語是什麼,然後弄清楚自己需要了解多少,才能與同事進行明智的對話。我想,今天我們可以提供足夠的信息,使架構師們有能力進行那樣的對話,並且能夠認識到,當出現什麼情況時,他們就必須開始將其用於項目或思考設計。使他們了解更多的背景信息,這將幫助他們在做進一步研究時取得更大的成功。這樣行嗎?
Anthony Alford:聽起來不錯。
AI 通常指深度學習或神經網絡
Thomas Betts:首先,請說出你的定義,什麼是 AI?
Anthony Alford:AI 就是人工智慧。
Thomas Betts:好吧,今天的節目就到這裡。
Anthony Alford:言歸正傳。事實上,當我與人們談論這個問題時,我會說,「對於你試圖解決的問題,AI 確實會告訴你更多你不知道的困難」。它不是一個實際的解決方案。好消息是,大多數人在談論 AI 時,他們實際上是在談論某種類型的機器學習。毫無疑問,機器學習是一項技術,而且是一個經過充分研究、明確定義的科學分支。事實上,現在大多數人所說的機器學習是深度學習,也稱為神經網絡。它早在 20 世紀 50 年代就出現了,因此人們對它進行了廣泛的研究。
ML 模型不過是接受輸入並提供輸出的函數
Thomas Betts:是的,我認為人工智慧不是一種你可以買到的產品。你可以買一個機器學習模型。你可以構建一個機器學習模型。你可以將其添加到你的系統中,但你不能只是說,「我想要一個 AI」。但人們就是這麼談論它的。接下來,讓我們開始討論些已經存在的東西,有形的部分。請舉幾個例子說明一下,當人們說「我想在我的系統中包含 AI」時,他們是怎麼想的。他們談論的機器學習元素是什麼?
Anthony Alford:當然,大多數人談論的是大語言模型或生成式人工智慧。作為軟體開發人員,我想告訴人們的是,你可以把這些東西看作是一個函數。我們經常編寫調用外部庫函數的代碼。在某種程度上,你可以這樣想。它只是一個可以調用的函數。輸入和輸出都很複雜,對吧?輸入可能是一張完整的圖片或是一個播客音頻,而輸出也可能是一些比較大的東西,比如播客的文稿或摘要。
Thomas Betts:大多數人想到生成式 AI 時都是說,給我一些文字、圖片、聲音。這是輸入。對於機器學習模型,所有這些都會歸結為 1 和 0,對吧?它會把它們分解成某種它能理解的數據並對其進行數學運算,對吧?
Anthony Alford:是的,沒錯。同樣,當我與軟體開發人員交談時,我說,「當你考慮這些函數的輸入和輸出時,它們都只是一個浮點數數組」。實際上,它可能是一個多維數組。對此,有一個抽象術語叫向量。如果你看一些常見的機器學習庫,就會發現它們用到了向量這個詞。它是指一個多維數組,但是你必須能夠用向量來表示所有的輸入和輸出。
構建 ML 模型就像編寫大量的單元測試並優化函數
Thomas Betts:是的,這些是我多年前在大學裡學到的數學知識,但因為我不是數據科學家,所以我不會每天都用到這些詞,我會忘記它們,「哦,是的,多維數組,我知道那是什麼」。但實際上,我不需要把這話說出來。我有了作為輸入的向量。接下來我該怎麼做?如何構建這些模型?
Anthony Alford:如果你真想構建自己的模型,我們可以稍後再講,但你可能會考慮不那樣做。但總的來說,這些模型的構建是一個叫做訓練和監督學習的過程。從軟體開發人員的角度來看,你真正需要的是一套單元測試。一個非常大的單元測試套件,也就是我們期望的函數的一些輸入和預期輸出。本質上講,訓練的過程是隨機編寫一個函數。它從一個隨機函數開始,然後不斷地修復該函數中的錯誤,直到單元測試通過。也並不是說一定要通過。你還可以告訴它,「這裡有一種方法可以計算測試失敗的程度,務必每次都要縮小這個數值」。
Thomas Betts:這就用到機率了,一切都歸結為數學。同樣,我習慣於編寫單元測試,我說,「我的輸入是 A 和 B,我期望輸出 C」。而你說,「這是 A 和 B,我想要 C」。但這裡的問題是,你怎麼知道離 C 有多遠呢?
Anthony Alford:沒錯,是這樣。這取決於數據類型。我說過,輸入和輸出都變成了向量,但我們不妨假設一個最簡單的情況,比如你正在構建一個輸出實際數值的模型。輸入是房子的平方英尺和房間的數量等,而輸出是預期房價。如果你對它做單元測試,則可以用你期望的數值減去你得到的數值來衡量單元測試的偏離程度。你可以做誤差平方和。這樣一來,機器學習就會不斷地改變函數,縮小誤差平方和。對於像文本或圖像這樣的東西,要衡量單元測試的偏離程度可能會有點麻煩。
語言模型是用句子訓練的,用來預測句子中下一個單詞出現的機率
Thomas Betts:我們正在深入探討生成式 AI 的所有概念。到目前為止,我們只談了文本的例子,暫時還沒有涉及音頻、圖像及其他的東西,因為原理都是一樣的。大多數人都熟悉如何與 ChatGPT 交互。我給它輸入一些東西,它給我輸出一堆文本。這些文本是如何產生的?我們是如何創建這些 LLM 的,讓人們可以對它們說,「當我輸入這個句子,我期望這個句子得到回應」?
Anthony Alford:好吧,你想聽多長的故事?我們可以從 2017 年開始說,或者更早。
Thomas Betts:我們看一些高層次的細節吧。我覺得,那些里程碑式的東西有助於我們了解故事的來龍去脈。
Anthony Alford:你說的對。簡單來說,像 ChatGPT 這樣的東西或所謂的語言模型,函數的輸入是一個單詞序列或更抽象的 Token。輸出是所有可能的 Token 以及它們成為下一個 Token 的機率。讓我們通過一個例子來看一下。如果我輸入序列「once upon a...」,下一個單詞是什麼?
Thomas Betts:我猜是「time」。
Anthony Alford:是的。LLM 會給出每一個可能的單詞和它的機率,而 time 是下一個單詞的機率非常高。那麼像 pancake 這樣的詞機率就會比較低。這是一個機率分布。我們其實知道答案。在訓練中我們知道,對於這個單元測試,time 這個詞的機率是 100%,其他單詞的機率為 0。這是一個機率分布。LLM 給出的機率分布是另一個。有一種方法可以衡量兩者之間的差異,即交叉熵損失。
藉助這個方法,你就可以訓練並改進它。LLM 會使 time 一詞在其輸出中的機率接近 100%,而其他單詞的機率都為零。這是一種語言模型,它們就是利用我上面提到的方法進行訓練的。你獲取一大堆文本,從中生成一些序列,去掉一個或多個單詞,然後再由 LLM 來填充這些單詞。它的填充方式就是給出每個可能的單詞的機率分布。在理想情況下,你去掉的那個單詞機率最高。
Anthony Alford:正是如此。
Anthony Alford:是的。一般來說,如果我們要討論數據類型的話,這是一個枚舉。對於枚舉數據類型,我們可以稱之為分類器。你談論的是,是狗還是貓。它會針對每個可能的輸出提供一個答案。每個可能的枚舉值都有一個與之相關聯的機率。你想要真正的答案接近 100%,而剩下的接近零。對於文本也是一樣。LLM 會將整個詞彙表以機率分布的形式給出。
神經網絡是在做矩陣乘法,而且用的矩陣非常大
Thomas Betts:當你聽說這些模型有多大時,就會知道它們受過多少訓練。基本上,ChatGPT 和 GPT-4 是用你可能從網際網路上能得到的所有信息進行訓練的。我不知道這是不是真的,但人們就是這麼說的。
Anthony Alford:基本上是這樣。那說的是數據集。還有就是組成模型的參數的數量。當我們談論這些深度學習模型時,我們談的是神經網絡。神經網絡本質上就是矩陣乘法。我前面提到過的輸入向量,你可以把它們想像成矩陣。你可以用它乘以模型的矩陣。我們說的這些矩陣項有時會被稱為權重,因為最終你要做的就是計算輸入值的加權和。當我們討論模型多大時,我們討論的是其中有多少個矩陣參數。我們不知道 GPT-4 有多少參數。他們沒說。GPT-2 的話,它的矩陣中有大約 15 億個參數。
Thomas Betts:是的,我想現有應該有……
Anthony Alford:數千億。
Thomas Betts:數千億,是的。怎麼才算大語言模型?數以 10 億計嗎?
Anthony Alford:是的。這不是一個很難達到的數值。但我們現在看到的是,如果模型有數百億或數千億參數,那它多半很大。現在也有小一點的,你可以看下 Llama 之類的東西……谷歌的 Gemma,還有微軟的 Phi。它們仍然是有數十億參數的模型…現在,從 10 億到 100 億都被認為是一個小模型。那樣的模型已經足夠小,它們可以在你的筆記本電腦上運行。
Thomas Betts:好吧,你剛才提到了其他幾個名字,我覺得那是架構師們喜歡的東西,「哦,我想我聽說過 Llama。Gemma 聽起來也很耳熟。」還有一個是 Psi 嗎?
Anthony Alford:Phi,P-H-I。這是個希臘字母。在美國,我們寫成 Phi,但在其他地方是 Phee。
Hugging Face 是語言模型的 GitHub
Thomas Betts:有一個叫「Hugging Face」的網站,我不是很了解。你可以在上面找模型,也可以測試模型。那是個什麼樣的網站?
Anthony Alford:你可以把它想像成語言模型的 GitHub。事實上,我提到過一個庫。他們有 SDK。他們有一個庫,一個 Python 庫,你可以安裝在你的筆記本電腦上,它會在後台下載並運行這些比較小的語言模型,在你的機器上運行。他們所做的就是提供包含我提到的那些矩陣項的文件。
Thomas Betts:那是組合模型,對吧?我一直以為,訓練的過程就是我運行程序,然後它輸出模型。而這個過程可能需要幾個小時或幾天,但一旦完成,模型就出爐了。現在模型有了,不管是大語言模型,還是小語言模型,你說我都可以放在筆記本電腦上運行。其中一些,如果是比較小的機器學習模型,我們一會兒就可以運轉起來了,對吧?
機器學習生命周期的兩個階段
Anthony Alford:哦,是的。我們可以把機器學習模型的生命周期分為兩個階段,第一個即你提到的訓練階段。我們可以把這個階段看作是開發一個函數,一旦編寫完成,我們就可以構建它,並將其部署為一個 jar,或者某種你可以使用的庫。模型訓練好以後,你可以加載它並提供輸入,然後得到輸出,這就是所謂的推理階段,即模型從輸入推斷生成一些輸出。這就是模型生命周期的兩大階段。
自回歸模型會將輸出結果作為下一個輸入,並將其添加到上下文中。
Thomas Betts:回到大語言模型,你說預測下一個單詞,然後再預測下下個單詞。在這個過程中,它會向模型反饋。我的理解是,它就像打了興奮劑一樣不斷地自動補全,一個字母,一個單詞。它就像在說 「我全都會」。它會不斷地將正在構建的句子反饋到上下文中。
Anthony Alford:是這樣。你會聽到人們把這些模型稱為自回歸模型,而這正是它們在做的事情。你提供初始輸入,有時我們稱之為 「提示」。我們也把模型的輸入稱為上下文。提示是初始上下文,然後它會輸出一個 Token 並將其放在末尾,作為新的上下文反饋給模型,就這樣反覆這個過程。它們還能輸出一個表示 「停止」的 Token。這樣,模型就知道該停止了。我曾在手機上試過自動補全,就是一遍又一遍地重複自動補全過程。雖然最終產生一堆胡話,但思路是完全一樣的。
Token 是模型用來做出響應的單詞或單詞的組成部分
Thomas Betts:你已經說了好幾次 「Token」,而我一直在說 「單詞(word)」。我知道,外行人通常認為這兩個詞可以互換,但其實它們並不完全是一回事。Token 並不總是單詞。那麼在這些語言模型中,Token 是指什麼?
Anthony Alford:最開始的時候,人們用的就是單詞。我們可能都很熟悉搜尋引擎所做的詞幹提取之類的事情,在這類事情里,單詞本身實際上並不能稱為 Token。我們之所以想做一些不完全限於單詞的事情,是因為我提到過,模型的輸出只能是它所知道的 Token。你可能見過這樣的情況:「那我們就用位元組作為 Token 吧」。現在,Token 就是位元組對了。從根本上講,它不再是單詞層面的東西。Token 比單詞小。你可能會看到,一個 Token 是幾個字母、字符或位元組。
Thomas Betts:它不再像以前一樣預測下一個單詞,而是預測 T,然後是 I,然後是 M,然後是 E。這樣做的好處是什麼?
Anthony Alford:或者類似的東西,或者 TI。這樣做的目的是為了輸出那些實際上不是單詞的內容,它們不屬於常規詞彙。
Thomas Betts:現在,它是否已經足夠聰明,說 time 是一種可能的 Token,而 TI 是另一種可能?它是否會用兩種方式進行分解?
Anthony Alford:分詞本身幾乎已經成為一種商品。大多數人並沒有真正關注具體的 Token 數據集是什麼樣子的。我認為,通常情況下,你需要的是一種比字符大一點但比單詞小一點的東西。研究人員已經做過實驗。
Thomas Betts:我在使用 ChatGPT 或 OpenAI API 時發現,它會測量用到的 Token 的數量。有時候,你需要按 Token 數量付費。
Anthony Alford:是的,沒錯。因為本質上,輸出是一個 Token,而對於我們提到的輸入,即所謂的上下文,模型有最大 Token 數的限制。現在,很多模型的最大值是數千甚至數十萬。但無論如何,它都會有一個上限,使它不能接收比那個值更大的輸入。
Thomas Betts:是的,我記得在 ChatGPT 問世時,人們發現了這些限制,因為隨著對話的持續,很快,你就會看到對話的第一部分掉出了上下文棧。
Anthony Alford:是的,最大上下文長度內置於模型中。這裡有一個算法複雜度的問題,它是上下文長度的平方。隨著上下文長度的增大,模型也會隨著上下文長度平方的增大而增大,運行時間也會相應地增加,諸如此類。
效率和耗電量
Thomas Betts:這就要說到模型效率問題了。人們一直在討論,在世界各地的數據中心中,構建並運行這些模型需要消耗多少電力。這是你有模型,這是你需要了解的。
Anthony Alford:非常多。
Thomas Betts:如果模型上下文長度是 3 萬或 3.2 萬個 Token,再一平方的話,這個數值一下子就變得非常非常大。
Anthony Alford:哦,是的。它不僅會以平方的形式增長,而且好像還有一個很大的乘數。訓練這些模型會消耗大量的電能,只有訓練它的人才知道消耗了多少。但實際上,沒人知道訓練 GPT-3 或 4 的雲帳單是多少,但一定是一筆不小的開支。
Thomas Betts:是的,這就是為什麼人們不希望構建自己的模型。大多數人並不需要創建自己的 LLM。這些事情已經完成了,人們正在用它們來取代谷歌搜索。但其中一個問題是,你沒有上下文,因為模型不是根據當前事件進行訓練的。和使用谷歌不同,你搜索然後獲得結果。模型只是預測單詞。
Anthony Alford:沒錯。現在,他們正設法在模型中加入這一點。如果你使用必應,必應實際上已經在使用 GPT-4,它會在它的答案中包含搜索結果。我不想劇透,等我們講到 RAG 時,再來討論這個問題。
Transformer——GPT 意味著生成式預訓練 Transformer
Thomas Betts:好吧,我們先把 RAG 放在一邊,對 Transformer 進行一些更深入的探討。我想你和 Roland 在你們的播客中已經談過這個問題了。
Anthony Alford:沒錯,我們從大體上聊了聊 LLM,尤其是 GPT 家族。GPT 中的 T 代表 Transformer,這是谷歌研究團隊在 2017 年提出的。他們寫過一篇論文,題為 Attention is All You Need。他們當時正在研究翻譯。而在此之前,翻譯模型使用的是遞歸,這與我們所說的自回歸併不相同。總之,他們提出了這個模型,其實只是使用了一種叫做 Attention 的特性或機制。他們稱之為 Transformer。
Attention 會對輸入進行加權
Thomas Betts:它可能會丟掉你的一些輸入,或者重新分類,然後說 「這些是該上下文中的重要單詞」。
Anthony Alford:運算過程是,找到與查詢匹配的鍵,然後返回與之相關的值。很多時候,它確實會側重於輸入的某些部分,而不是其他部分。
Thomas Betts:權重就是在這裡加入的,對嗎?
Anthony Alford:完全正確。就是這樣。
Thomas Betts:你提到,這些矩陣都有權重。它會確定輸入哪些單詞或部分,而一個單詞的權重並不總是相同的。在特定輸入的上下文中,它的權重可能變高。
Anthony Alford:對,你解釋得比我還清晰。
Thomas Betts:這不是我第一次嘗試解釋這個問題了。每次我都會解釋得更好一點。這也是我想做這期節目的原因之一。
在你的產品中加入 LLM
Thomas Betts:我們已經談了 Transformer,這只是一個術語,還有 Attention,用於確定輸入的內容。我們以 GPT 為例討論了輸出,但 GPT 是一個品牌術語,LLM 才是通用術語,對嗎?
Anthony Alford:是的。
Thomas Betts:這就像面巾紙和紙巾的區別。比方說,我想在我的應用程式中使用這些 LLM。我的產品負責人、執行長就會說,「在上面加點人工智慧」。我希望看起來我們是在創新。我們必須要有一些前瞻性,比如 「看看模型怎麼樣並提出看法」。在這方面,我們該怎麼做呢?
Anthony Alford:我能插播一篇 InfoQ 的文章嗎?就在今年年初,我編輯了電子雜誌《生成式人工智慧的實際應用》(Practical Applications of Generative AI)。我們特別邀請了幾位 LLM 專家來討論這個問題。強烈建議大家都讀一讀。我們有公開發行的商業 LLM,比如 ChatGPT 的 GPT,還有 Claude,以及谷歌的 Gemini。亞馬遜雲科技也有一些。總之,如果你發現其中一種看上去有效,那就試試。這樣,你可以利用這些商業軟體中的一種,快速採用 LLM 功能。那只是一個 API,一個基於 Web 的 API。你可以使用 SDK 調用它,所以它看起來和其他 Web Service 一樣。
這是第一點。第二,長期成本,對吧?因為這是一個 Web 服務和 API,就像我們說的,我們是按 Token 付費的。實際上,這可能很便宜。但從長遠來看,成本是個問題,隱私也可能是個問題。雖然這些商業 LLM 承諾「我們不會保留你的數據,我們會保證你的數據安全",他們也確實做得更好了,但是,在代碼生成等情況下,它也會把數據返回給你。
我記得最近發生了一起訴訟。有人的代碼被用來訓練模型,他們會說,這個東西輸出的是我的代碼,對吧?有人擔心會侵犯版權。無論如何,從長遠來看,如果你想將 LLM 功能引入內部,你可以使用其中的一個開源模型。你可以在自己的雲中運行它,也可以在自己機器上的公有雲中運行它。這樣你就能更好地控制它。
Thomas Betts:就是構建和購買模型的差別,對嗎?
Anthony Alford:正是如此。
Thomas Betts:「讓我們看看這是否可行 」,我喜歡這樣的想法。做實驗。在公有雲上進行這些測試,或許可以設置一些非常嚴密的防護措施,以確保不會發送私人數據。這裡我又得插播一條 InfoQ 的信息。最近,AI、ML 趨勢報告出爐了。我聽了那個播客。其中提到,在將數據發送到 OpenAI 或他們正在使用的 API 之前,由於他們做了太多的設置來過濾和清洗數據,導致一些重要的背景信息被刪除,所以返回的結果並不理想。一旦將模型引入公司內部,你就可以說:"哦,數據歸我們所有。數據永遠不會離開我們的網絡。我們可以發送任何數據"。突然之間,返回結果的質量也提高了。
Anthony Alford:毫無疑問,這個實驗很容易做。如果你發現實驗有效,那麼將其引入公司內部也是可行的。簡單來說就是這樣。
自託管開源 LLM
Thomas Betts:就像你說的,「如果你想按使用付費,那很容易上手」。這是一種方法。至於你說的引入內部使用,你提到,可以在自己的雲上使用模型。就像我們在 Azure 和亞馬遜雲科技的雲上一樣。那從根本上講,是不是我啟動一個 EC2 實例,然後自己安裝就行了。
Anthony Alford:這是一種方法。當然,像亞馬遜雲科技這樣的服務提供商會給你一個增值版本,並為你啟動它,這與按使用付費的常規模型非常相似。沒錯,你可以這麼做。你可以在 EC2 上實現。
Thomas Betts:好的。你有沒有在做產品即服務、平台即服務、基礎設施即服務,如果是的話,那麼你可以在上面做任何你想做的事情。你得到的結果可能會有所不同,但這可能是你在下一階段實驗中要採用的另外一種方式。對我來說,啟動個系統,部署個模型,然後說:"好吧,這是我們使用公共 API 得到的結果,這是我們在公司內部使用私有 API 得到的結果。「也許你會考慮成本,也許你會考慮結果的質量。
Anthony Alford:是的,當然。
LLM 比較
Thomas Betts:人們是怎麼比較這些模型的?對於使用 OpenAI 和我從 Hugging Face 上拉取的某個模型,我該怎麼做同類比較?
Anthony Alford:這確實是個問題。這些模型變得越來越好,做出這樣的比較更難了。過去,對於線性回歸之類的東西,對於監督學習,我們知道答案,我們可以有 一個指標,基於準確率之類的東西。平方誤差的總和是多少?但如今,ChatGPT 的輸出效果如何?好吧,如果你讓它幫你做作業,然後你的作業得了 A,那就相當不錯了。事實上,不管你信不信,他們現在經常用這些模型做這樣的事,他們說:「我們訓練的這個模型可以參加 AP 化學考試,並且能及格」。
在文獻中,我還經常看到另一件事,就是他們將自己的模型與基線模型進行比較,他們會讓兩個模型用相同的輸入生成輸出,然後由人類評委對它們進行比較。就像比較可口可樂和百事可樂,五個人中有四個選擇百事可樂。更有趣的是讓 ChatGPT 擔任評委。你可能不相信,很多人在這麼做。我想這並不容易。
Thomas Betts:是的,我一般會說這些事情是非確定性的。你討論的是機率,你不知道答案會不會出來。我問了個問題,得到了個答案。因為你可能不知道會有什麼類型的問題,所以你也不知道會有什麼樣的結果。
Anthony Alford:是的,確實是這樣。最可怕的事情之一就是你不知道會輸出什麼。可能發生一些非常令人不快或尷尬的事,人們在生產環境中使用這些東西時確實會有這樣的擔心。
Thomas Betts:是的。
在應用程式中採用 LLM 之前,請先定義成功的標準
Anthony Alford:但我要說的是... 讓我們回到那份電子雜誌,我們邀請的一位專家指出:「在應用程式中採用 LLM 之前,你應該定義好成功的標準」。這可能是最難的部分。我該如何知道是否已經成功?這取決於你的應用程式,但這是一個應該認真考慮的問題。
Thomas Betts:我喜歡這個說法,因為它把問題又推回給了產品負責人。首席技術官們說,「我需要一些人工智慧」。你希望發生什麼?因為有很多地方是不應該加入人工智慧的。我在從事會計系統開發。你不應該讓它猜測你的帳本。
建議將 RAG(檢索增強生成)作為改進 LLM 採用的早期步驟
Thomas Betts:當我們談論自己使用這些模型時,無論是託管還是內部使用,我們如何才能獲得更高質量的結果?我們是否可以直接使用它們?不久前,我從一個播客中了解到了檢索增強生成技術。我經常聽到有人談論 RAG。請簡要介紹一下這是什麼,以及為什麼這應該把它作為改進 LLM 採用的第一步。
Anthony Alford:還是在專家座談中,他們說,「首先要嘗試更好的提示」。我們都聽說過提示工程。我們知道,在與 ChatGPT 交互時,你的措辭會對它的響應產生很大的影響。一定要嘗試不同的提示。下一步是檢索增強生成(RAG)。我想我們提到過,LLM 經過訓練,但它們不知道訓練後發生了什麼。如果我們問誰贏了昨晚的足球比賽?它不知道,或者它可能不會說它不知道,而是會編造一些完全虛假的事情。這對企業來說是個問題,因為你希望它了解你的內部知識庫,對嗎?比如你想讓它知道維基或文檔中的內容,諸如此類。RAG 的原理是將文檔分成若干塊,本質上,是將一塊塊文本通過 LLM 生成一個個單獨的向量。
這就是所謂的嵌入。向量以某種方式對文本的含義進行了編碼。你可以對所有的文檔做這樣的處理,然後你就有了一個資料庫,每個文檔都有一個與之相關的向量,它可以告訴你一些關於文檔含義的信息。然後,當你向 LLM 提問時,同樣的,問題也會轉化為一個向量,而向量資料庫可以讓你快速有效地找到與問題相近的向量,也就是意義與問題相近的向量。它會獲取這些內容,並將其與你的問題一起填充到 LLM 的上下文中。現在,它連同你的問題都知道了。我們知道,這些 LLM 非常擅長... 如果你給它一大段文字,然後說 "解釋一下這個」 或者 "這裡有個關於這段文字的問題」 。很好,這就是意向機制的作用,讓模型能夠從那個文本塊中找到相關的部分,來回答或解決你提出的問題。
Thomas Betts:我聽到的解釋是,假設我進行搜索,我願意坐在那裡輸入 30 秒鐘,這就是我想出的所有詞,但我不會寫一個非常詳細的提示。恰恰相反,我會說 「根據這些文件回答問題」。我可以把所有這些文件包含到上下文中,現在它知道了, 「這就是我要用的」。我不會只用基礎的 LLM 預測下一個單詞。我要根據上下文來預測下一個單詞。
Anthony Alford:沒錯。檢索部分會自動查找這些文件,並將它們包含在上下文中。這個部分很關鍵... 如果你確實知道這些文檔,比方說,有人給了你這些文檔,「這是我們的用戶手冊,請回答相關問題」。對於客戶服務人員來說,這是一個很酷的用例。如果用戶手冊足夠小巧,能夠包含在上下文中,可能有數十萬 Token,那就再好不過了。但也許,你沒有這樣的手冊。也許你有一堆的知識庫文章。它會找出正確的知識庫文章,然後根據這些文章來回答問題。
Thomas Betts:沒錯,因為我們的知識庫有數萬篇文章,而不是幾百頁。
Anthony Alford:確實如此。
Thomas Betts:你還在使用 LLM,它已經有了補全句子所需的全部知識。
Anthony Alford:是的。
微調是使 LLM 更符合你需求的一個選項
Thomas Betts:不是基於知識庫或訓練文檔新建一個模型。
Anthony Alford:沒錯。但假設你確實想這麼做,而且在某些情況下這可能是更好的解決方案,那麼有個過程叫微調。我前面提到過, GPT 中的 T 是 Transformer,P 是預訓練。這是機器學習中一個完整的子領域,叫做遷移學習(transfer learning)。你可以預訓練模型,而模型是通用的。然後,你可以根據具體情況對其進行微調。在 GPT-2、3 及更高版本中,他們發現你不需要這樣做。它本身就已經很不錯。但微調的作用是對模型進行額外的訓練。不是原封不動地使用模型,而是要重新開始訓練過程。你有自己的單元測試集,有自己的微調數據,知道輸入和輸出。微調的好處是,它所需的數據集比訓練完整的 GPT 要小得多。
Thomas Betts:這是因為你是從已經存在的東西開始的。
Anthony Alford:的確如此。
Anthony Alford:是的,沒錯。事實上,無論是最初的 ChatGPT 還是更新的模型,他們都會對其進行微調,以便模型能給出更有用的答案及遵循指令。GPT-3.5 也是如此。基本上,該模型是基於整個網際網路進行預訓練的,它能給出相當不錯的答案,但他們發現,有時它給出的答案...... 就像那個笑話說的,技術上是對的,但一點用處都沒有。因此,他們對其進行了微調,使其可以遵循指令給出更有用的答案。他們稱其為 「對齊」。其方法是,他們有一個小型數據集,"這是輸入,這是你給的輸出,但這些輸出更好"。他們通過對其進行微調,以獲得更恰當的輸出結果。
向量資料庫提供最近鄰搜索
Thomas Betts:我們回頭看下前面提到的一個東西。你提到,創建向量時要有一個向量資料庫,可以進行向量搜索。對於這個術語,人們可能會問,「我有向量資料庫嗎?」我想 Azure 剛剛宣布他們將……我想現在那還處於 Beta 測試階段。基本上,把你的 Cosmos 資料庫變成一個向量資料庫,就像在門戶中反選一個複選框那麼簡單,眨眼間,你就有了向量。這對我有什麼用?為什麼這會是一個優勢呢?
Anthony Alford:好的,我即將播出的播客就是關於這個問題的。我們提到,對於一大段文字,你可以從中創建一個向量來編碼其含義。這個向量的維度非常高。有成百上千個。你要解決的問題是,給定一個向量後,如何在資料庫中找到與輸入向量相近的向量?你可以把所有的向量都找一遍。基本上是進行全表掃描,然後對輸出進行排序。這樣做其實也不算錯。但這種方法的複雜度很高,在大規模運行時效果也不會很好。你需要的是更類似於 B 樹查找的方法,這種方法的複雜度是 log-N。實際上,向量可能不是最重要的部分,最近鄰搜索才是。我們要解決的問題是,給定一個向量輸入,在你的資料庫中,該向量的最近鄰是什麼?這就是你想要以高效、可擴展的方式解決的問題。
Thomas Betts:了解了。它遍歷、查看我的數據,然後說,「這是所有參數的向量」。基於此,這些是相關的單詞…?
Anthony Alford:不,從字面上看不是這樣的。它只是給出兩個向量,以及它們有多近。
Thomas Betts:向量有多近?它不知道向量來自哪裡?
Anthony Alford:沒錯,就是這樣。現在,一旦找到了相近的向量,同一數據行中的內容或者一個指向內容的指針才是你真正關心的。
Thomas Betts:了解了。
Anthony Alford:但資料庫的作用是進行最近鄰搜索,你給它一個向量,它就會在資料庫中找出最接近的 K 個向量。
Thomas Betts:是的,我認為,我們又回到了起點,人工智慧作為一種產品的情況並不存在。我們使用模糊搜索技術已經有一段時間了。這一直是人們想要的東西,每個人都已經用慣了谷歌。我可以輸入任何我想要的東西,它總能找出答案。就像你說的,你把詞幹... 這是另一個問題,我沒有準確地說明想要什麼樣的答案。因此,這不是在資料庫中找到這一行,而是找到與我的意圖相近的記錄,這才是它們正在做的。
Anthony Alford:是的,我想你可能會發現,人們稱之為語義搜索或神經搜索,意思是,向量是從神經網絡中生成的。
Thomas Betts:但一切都與此有關。我不知道有什麼東西可以用來找出意圖。
LLM 是解決自然語言處理(NLP)問題的工具
Thomas Betts:我想,在我的認識中,LLM 確實屬於自然語言處理的範疇,對嗎?
Anthony Alford:是的,沒錯。
Thomas Betts:因為它們曾經是一回事。我的團隊里有數據科學家,他們從事自然語言處理領域的工作。現在它們還是一回事嗎?它只是一個子集,還是說它在 LLM 相關的新聞中被濫用了?
Thomas Betts:好的。
Anthony Alford:它可以做得很好,而且是開箱即用的。再說一下,我們說,Google 和 Attention 就是你需要的所有東西。他們提供了一個叫 BERT 的版本,可以做命名實體、詞性、標記之類的事情。
LLM 很有用,因為它們非常通用,但這並不能使它們成為通用人工智慧
Thomas Betts:了解。這些 LLM 都是通才。得想辦法讓它們更具體。如果你心中有一個特定的用例,那麼你可以沿著一條微調路線前進。你可以找到另一種更符合要求的模型,這會有不少好處……運行成本會更低,答案的質量可能會更高,返回結果的速度可能會更快,如果計算量更少的話。
Anthony Alford:是的,這也是人們對 LLM 感到興奮的一個原因,因為它們非常通用。於是人們開始問,"這是通用人工智慧嗎?」 這一直是人工智慧研究的聖杯。是的,我們可以做出一個下棋下得很好的程序,但它不能開車。聖杯就是建立一個能解決任何問題的模型。我們自詡為人類,我們可以完成很多不同的任務。我們可以做播客。我們可以製作賽車模型或閱讀書籍。人工智慧的聖杯就是一個模型統治一切,而 LLM 不需要做任何額外的訓練就能做很多事情。早期的 GPT 論文就是這樣寫的:」看,我們把這個東西做出來了。它可以完成摘要、問答、翻譯、代碼生成等所有任務。「這也是它讓人們為之興奮的原因之一。它看起來無所不能。
Thomas Betts:是的,我認為,現在的問題是我們如何使用它?因為它看起來很強大。但回到你的觀點,你頭腦中要有一個具體的產出。你的目標是什麼?為什麼要添加這個?因為這聽起來很刺激。每個人都想使用它,但你要有一個意圖。如何把它融入你的產品?如何把它融入你的解決方案?
Anthony Alford:是的。根本問題是,我要解決什麼業務問題?我怎麼知道我是否成功了?
AI Copilots 與 AI Agent
Thomas Betts:時間就要到了。我再問最後一個問題,然後我們就總結下。
Anthony Alford:好的。
Thomas Betts:什麼都是 Copilot?這又是一個術語。它與 AI Agent 有什麼不同?它們聽起來都像是把一個東西人格化。關於這一點,可以另外做一番討論。但它們不是一碼事。Copilot 和 Agent 有什麼區別?
Anthony Alford:我想,我們在 「趨勢播客 」中已經討論過這個問題。Agent 有一定程度的自主權,而 Copilot 則是必須由你按下按鈕讓它啟動。重申一下,我不想把這變成對人工智慧的恐懼。在我看來,人們對人工智慧的恐懼是對自主人工智慧的恐懼。如果我們能通過 Copilot 來減輕這種恐懼,那麼這也許就是我們要走的路。但我認為,關鍵在於自主性。對於 Copilot,它的回答必須有你的同意,然後它才去做。
Thomas Betts:Agent 可以自己做事情,但我們可以有主 Agent。就像你說的,「我不知道如何判斷輸出,所以我要問 ChatGPT,『我是否正確地訓練了我的模型?』「然後你把它反饋給另一個 AI。AI Agent 的情況是,你有一個主 Agent,它監督其他 Agent,那誰來監督主 Agent 呢?
Anthony Alford:監督監督者?是的,確實是這樣。
總結
Thomas Betts:非常感謝你抽出時間。我學到了很多,希望本期內容對觀眾有所幫助。
Anthony Alford:我也是。
Thomas Betts:回顧並更新下我自認為已經理解的東西總是好的,而且是藉助從真正懂行的人那裡聽來的信息。對於我們提到的內容,我會提供相關的連結。eMag 很棒。
Anthony Alford:對的。
Thomas Betts:然後是趨勢報告、播客和其他一些內容。Anthony,再次感謝你參加 InfoQ 播客。
Anthony Alford:這是我的榮幸。感謝你的邀請。
Thomas Betts:希望下次你還能來參加我們的活動。
原文連結:
https://www.infoq.com/podcasts/primer-ai-for-architects/
活動推薦