現在的科技領域,有關人工智能有沒有被吹得太厲害,一直都有爭論,沒完沒了的。不過,像谷歌 DeepMind 的安全研究專家和機器學習科學家 Nicholas Carlini 這樣的人可不多,他用自己的經歷給咱們展現了不一樣的看法。通過他寫的東西,咱們能知道大型語言模型在實際用的時候很厲害,花樣也多。這可不是光嘴上說說,而是真能改變工作辦法、讓干活更快、還能冒出新點子的好東西。
最近,Carlini 自己寫了一篇特別長的文章,仔細講了他平常怎么用 AI。這篇文章可厲害啦,不光讓咱們看到了 AI 技術到處都能用,還能讓咱們猜猜以后科技會怎么改變咱們的生活。
Carlini 在文章里舉了 50 個他自己用 AI 的例子,像工作效率提高啦、寫東西有創意啦、幫忙編程啦等等好多方面。不過讓人吃驚的是,這 50 個例子只是他用 AI 的一小部分,他說還不到 2%呢。這可太讓人震驚啦,不光說明 AI 技術厲害,還說明咱們可能還沒完全明白 AI 的潛力有多大。
實際上,Carlini 的經歷可能是個大趨勢的開頭:隨著 AI 技術越來越好,用的人越來越多,咱們可能正站在一場技術大革命的邊上呢。就像以前個人電腦和互聯網徹底改變了咱們工作生活的樣子,AI 說不定就是下一個能讓社會大變樣的重要力量。那面對這樣的情況,咱們該怎么看 AI 技術的發展呢?是小心點好,還是大膽去擁抱變化?
原文如下:
作者:DeepMind 安全研究專家和機器學習科學家 Nicholas Carlini
我覺得“人工智能”模型(我說的是大型語言模型)沒有被吹過頭。確實,每出來個新技術,都會招來騙子。好多公司都說自己在用“人工智能”,就像以前說自己靠“區塊鏈”一樣。(咱們都見過好多回啦)同樣,咱們可能現在就在個泡泡里。互聯網在 2000 年泡泡破了,可咱們現在用的互聯網應用,以前在科幻小說里才有。
但我覺得最近咱們在這方面的進步可不只是吹出來的,是因為過去這一年,我每個星期都花好幾個小時跟各種大型語言模型打交道,它們解決我給的難任務的本事讓我特別吃驚。所以我能說,這些模型讓我寫代碼的速度至少快了 50%,不管是做研究項目還是自己弄點編程的小副業。
我在網上看到好多說大型語言模型有用沒用的人,要么太樂觀,說所有工作三年里都能自動化,要么特別悲觀,說一點用沒有,以后也不會有。
所以在這篇文章里,我就是想讓大家討論得實際點。我不會說以后會怎么樣。我就是想列個表,這是我(一個研究機器學習的程序員和科學家)跟不同的大型語言模型交流的 50 次,這些交流讓我做研究的本事強了不少,還幫我弄了些隨便的編程小項目。這里面包括:
- 用我以前沒用過的技術弄出個完整的網絡應用程序。
- 教我怎么用各種框架,就算我以前沒用過。
- 把幾十個程序改成 C 或者 Rust 語言,性能能提高 10 到 100 倍。
- 把大的代碼庫簡化,讓項目簡單不少。
- 給我去年寫的差不多每一篇研究論文寫一開始的實驗代碼。
- 把幾乎所有無聊的任務或者一次性的腳本都自動化了。
- 差不多完全代替了我以前在網上找怎么設置和配置新軟件或者項目的搜索。
- 在幫我解決錯誤信息方面,代替了差不多 50%的網上搜索。
要是給這些應用例子分分類,大概能分成“幫忙學習”和“把日常無聊的事自動化”這兩類。前面那個對我特別重要,因為能讓我輕松對付以前覺得難的任務;后面那個也重要,因為能讓我專心做我最拿手的,解決真正難的問題。
關鍵是,這些例子都是我怎么實實在在用大型語言模型的。不是為了顯擺技術多牛,就是根據我工作的實際情況。這就是說,這些例子可能看著不怎么厲害,但其實我平常工作好多也普普通通的,現在能用的大型語言模型差不多把這些工作都自動化了。
通過這篇文章,我的目的就是一個例子接一個例子地給你看,過去這一年我怎么用大型語言模型提高工作效率,一直說到你聽煩了為止。要知道,就算你可能看過不少例子了,其實我給你看的還不到我用大型語言模型的總數的 2%。
細微差別
要說互聯網做得不好的地方,那肯定是對細節的處理。我絕對不覺得現在的大型語言模型能統治世界,也不打算說以后的模型能做啥不能做啥。我就想說說,現在的模型對我到底有沒有用。
你可能會問,為啥還得寫篇文章來證明語言模型有用呢?這不是明擺著的事嗎?但其實,不管是在學術界、軟件工程領域還是媒體行業,都有不少人說大型語言模型一點用沒有,就是一陣風,過幾年就沒人提了,對世界一點影響沒有。我不同意這些觀點,因為現在的大型語言模型已經證明有用啦。
但同時,我也得說,還有另一幫聲音特別大的人,他們覺得現在的模型能把所有程序員都代替了,大家都不用學編程了,因為很快都得失業。雖然反駁這些不是我這篇文章的主要目的,但我得說,我不支持這種特別極端的看法。
另外,我也不會說“只要目的好,用啥辦法都行”,就算這些模型訓練的時候有好多不好的影響,我也不覺得就該使勁用。
我知道這些模型可能有不好的后果,可能特別嚴重,像亂傳錯消息、亂用、監控人、搶人工作(甚至有人擔心能讓人滅絕)。我以后會寫篇文章仔細說說大型語言模型可能帶來的壞處,到時候會在這放個鏈接。不過,這跟語言模型有沒有用是兩碼事——這才是我在這想說的。
我也知道你可能因為語言模型老出不準的信息、老重復知道的事、碰上復雜情況就完蛋這些毛病不想用它們——可能我比你更清楚這些缺點。但這篇文章不說這些。因為我覺得,就算有這些毛病,模型還是有用的。
而且,我也知道培訓這些模型的倫理問題爭議可大了。你可能不同意沒經過允許就用人家的數據來訓練(我可能比你更明白這里面的事)。也許你關心的是那些為了訓練模型拿很少錢的人。我承認這些都是問題,但這篇文章也不說這些。
就像我一直說的:我在這說的,就是這些模型現在這個樣子到底有沒有用。
我的背景簡介
一般來說,我不是那種別人說啥我都信的人。比如說,十年前信息安全界流行加密貨幣的時候,我從來沒寫過關于區塊鏈的研究論文。我也從來沒買過比特幣,因為在我看來,除了能拿來賭錢和騙人,一點實際價值沒有。我一直都懷疑,每次有人跟我說“有個新技術能改變世界”,我都不搭理。
所以,第一次有人跟我說人工智能能大大提高我的工作效率,還能改變我平常工作的辦法,我也不信,我說:“等我看到真有用我才信。”
另外,我是個搞安全研究的。這差不多十年里,我一直忙著證明人工智能模型在碰到沒訓練過的情況的時候怎么就不行了。我證明了只要稍微改改機器學習模型的輸入,它的輸出就能全錯;或者這些模型就是記住了訓練數據里的一些例子,實際用的時候就重復。我很清楚這些系統的缺點。
但是,現在我在這說,我覺得現在的大型語言模型是互聯網出來以后,對我工作效率提高最大的東西。說實話,要是今天讓我在能用互聯網和一個最先進的語言模型里選一個來解決工作里隨便一個編程任務,我選語言模型的次數能超過一半。
怎么用語言模型
下面我就說說我怎么用大型語言模型來提高工作效率。
你可能對我舉的例子不感興趣,覺得太荒唐。也可能這些例子跟你的需要沒關系,這我能理解。但我只能從我自己的角度說。這些例子都是我過去一年跟大型語言模型交流的記錄里直接拿出來的。
1、給我開發完整的應用
去年,我弄了個測驗,讓人看看 GPT-4 在處理幾個特定任務上怎么樣。這個測驗可火了,有超過一千萬的頁面瀏覽量。你可能想不到,我差不多讓 GPT-4 給我寫了這個應用的第一個版本。這是通過一連串的問題弄的,我先問應用的基本結構,然后一點點加功能。整個交流有 30000 個字,把當時的 GPT-4 模型的本事都快試到底了。你要是看看這些交流,能看到從我跟模型說需求讓它寫完整個東西,到我讓它改具體的地方(比如說“別比平均分,用核密度估計說它在哪個百分位”),還有我復制粘貼錯了的信息(比如說,“畫圖錯了:numpy.linalg.LinAlgError: 奇異矩陣”),還有我就問個簡單問題(比如“怎么在網頁上用 JavaScript 加個 iframe,內容是從字符串加載的?”)。
這個辦法能行,主要是因為語言模型擅長處理別人解決過的問題,這個測驗 99%的內容就是些基礎的 HTML 和 Python 后端服務器,誰都能寫。這個測驗讓人喜歡不是因為技術多牛,是因為測驗的內容。把重復的部分都自動化了,我就能輕松弄好這個項目。
其實,要是沒有語言模型幫忙,我可能根本就不會弄這個測驗,因為我不想花時間從頭寫整個網頁應用。就算我會編程!我相信,就算是現在的模型,也能讓大多數人光靠問問題就能解決以前解決不了的重要任務。
我還有些類似的例子以后說,像我讓模型給我寫整個應用,等這些應用發出來,我會明說有語言模型幫忙。
2、當新技術的向導
我以前總能跟上新框架的步子。但一個人的時間有限,因為我的工作,我大部分時間都在跟最新的研究進展,不是最新的 JavaScript 框架。
這就是說,我開始一個不是我研究領域的新項目的時候,一般有兩個選擇:一個是用我知道的技術,就算這些技術可能老了十年二十年,對小項目也夠用;另一個是學新的(一般也更好)辦法。這時候語言模型就有用啦。對我來說新的框架或者工具,像 Docker、Flexbox 或者 React,對別人可能很熟。世界上可能有成千上萬的人很了解這些技術。現在的語言模型也能懂。這就是說,我能通過跟語言模型交流學習,學會解決任務需要的知識,不用靠那些假設讀者啥都懂、目標特別明確的死板教程。
比如說,今年早些時候,我弄一個 LLM 評估框架的時候,想在一個限制的環境里運行 LLM 生成的代碼,省得它把我電腦上隨便的文件刪了啥的。Docker 是干這個的好工具,可我以前沒用過。
重要的是,這個項目的目的不是學會用 Docker,Docker 就是我達到目的的一個工具。我就需要學會 10%,保證能安全用就行。
要是在 90 年代,我可能得買本關于 Docker 的書,從頭學,看前面幾章,然后跳著看怎么弄我想要的功能。過去十年好點了,我可能會在網上找怎么用 Docker 的教程,跟著做,然后找遇到的錯誤信息,看有沒有人跟我一樣。
但現在,我只要讓一個語言模型教我用 Docker 就行。
3、開始新項目
想起來,我最早學的編程語言是 Java。我特別喜歡編程,但有一件事我特別煩:面對新項目的空白屏幕。特別是用 Java 的時候!就算是讓程序編譯個“hello world”程序——這個“public static void main string args”到底是干啥的?括號放哪?哪些字母大寫?為啥這用花括號,那用方括號?
所以我就像小孩一樣——讓我爸幫我弄。
二十年過去了,我還是不喜歡用不熟悉的框架開始新項目。光為了弄好開頭的代碼就得花好多時間,而且我都不知道自己在干啥。
比如說,我最近想試試寫點 CUDA 代碼,看看一個簡單的貪心搜索在 GPU 上的性能跟別人在 CPU 上高效優化的比怎么樣。
但我不會 CUDA 編程。我會寫 C 語言,知道 GPU 咋工作、內核啥功能、內存咋布局啥的,但真要寫往 GPU 發任務的代碼?我不知道從哪開始。所以我直接讓模型給我寫 CUDA 程序的初稿。完美嗎?肯定不是!但這是個開頭。這就是我要的。你能看到這里面代碼好多錯!其實我完全能接受。我不是要完美的辦法,就是要個開頭,我能從這接著弄。要是以后的模型能做得更好,那就太棒了。但現在我有的已經幫了大忙了。
另一方面,我在家弄一些個人項目的時候,用了個樹莓派 Pico W。這是我第一次用。我想讓它給我干點事,特別是跟網絡有關的。再說,我肯定能在網上找到有人說怎么弄我想弄的。但你最近看過網上的東西嗎?前五個結果經常是些沒用的垃圾,代碼有問題,就為了搜索引擎優化改了改,但還是不行。
所以,我直接讓一個語言模型教我怎么弄我想弄的。我以前弄過微控制器,所以大概知道它們咋工作。但我沒用過 Pico W。我就需要點幫忙弄好所有依賴的東西,然后我能自己弄剩下的。
我給新的微控制器寫的第一個“hello world”程序一般就是讓一個 LED 燈閃。這能讓我試試能不能編譯上傳代碼到設備里,引腳設置對不對,基本上知道我在干啥。所以,我就直接讓弄個閃的程序。(再說一遍:網上有這個嗎?幾乎肯定有。但那樣我就得去找。)我有了這個代碼能運行了,從這我就知道后面咋弄了。我知道 python 咋工作(信不信由你!)。所以,我能從這接著改東西,把特殊的 Micro Python 的東西弄好。
我碰到別的要專門處理的問題,我能再讓模型幫我。比如說,我接著就讓模型給我寫個連 wifi 的腳本。
4、簡化代碼
我是個安全研究員,經常得處理別人的研究項目,里面好幾千行代碼,我得弄明白咋工作才能攻擊。這聽著不難,要是每個人都寫清楚的代碼,確實不難,但現實不是這樣。研究人員一般沒動力發清楚的代碼。所以,經常發出來的都是亂亂的代碼能湊合用就行。(我自己也這樣。)
我不能給你舉跟研究有關的例子,但我能給你說我正在弄的一個個人項目的例子。聽說我對康威的生命游戲特別著迷。最近,我想找個快的辦法,用 Python 評估一些生命游戲的模式。有個 C++的工具叫 golly 能做這個,但我不想把我的 Python 代碼改成 C++的。
golly 有個命令行工具正好我能用——我要做的就是簡化那個支持 50 種不同命令行選項的 C++代碼,讓它只做我想要的。所以我把 500 行的 C++代碼給大型語言模型,讓它給我個更短的文件做一樣的事。
你知道嗎?這可太管用了。然后,我讓它給我個圍繞 C++代碼的 Python 封裝器。也管用。這是那種讓人頭疼的任務,要是我自己弄,可能永遠弄不完。但現在我能讓別人幫我弄,我得到的東西比我原來的 Python 代碼快 100 倍。
我發現我經常這么干。這還有個例子,我用 Python 也這么干。
再說一遍,這些任務不復雜。但每次這么干,我都能省好多時間。這就是我覺得大型語言模型現在厲害的原因之一:它們的用處可能不咋好看,也不會因為說“這是我用大型語言模型簡化日常工作的普通辦法”就被網上夸,但這是真的有用。
5、處理無聊的任務
我好多要做的任務都特別無聊,不用想太多,但又必須做。
其實,我發現我拖著不做任務,經常是因為我知道做這些會無聊會難受。大型語言模型大大減輕了這種難受,讓我知道做任務的時候只要解決好玩的問題就行。所以,我一個一個給你說說我讓大型語言模型幫忙解決的特別普通的問題。
比如說,最近我得把一個用 Python 3.9 寫的程序拆開。大部分 Python 反編譯器只支持到 Python 3.7,在我這個 3.9 的上用不了。
反編譯其實不難,主要是弄對控制流程別出錯。所以,我沒自己花時間把幾千個操作碼和幾百行代碼弄好,讓大型語言模型幫我弄了。它干得特別好!比我想的好多了。這有三個交流,我讓模型幫我干了這個。另一個例子是,我要把一些沒結構的數據弄成有結構的格式。比如說,我做一個項目,要列一些書名和作者名。我在網上找了些沒結構的格式的數據,讓大型語言模型幫我弄好格式。最近,我寫一篇博客說怎么破解一個保護,想展示我改的代碼的全部差別。所以我把差別和以前怎么把差別弄成 HTML 的例子貼上,讓大型語言模型按以前的格式給我弄差別。另外,我工作的時候經常要給我用的資源弄引用。谷歌學術引用論文很容易,我能直接復制粘貼。但引用網頁就有點麻煩;我最近開始讓大型語言模型給我弄引用(確保這是正確的!)我可以繼續舉出至少一百個類似的例子。但我想你已經明白了我的意思。
我完全明白這種任務可能會讓人覺得“就這?”但我們要記住,五年前這些模型幾乎不能連貫地寫出一個段落,更別說為你解決整個問題了。
6、讓每個用戶都變成“高級用戶”
要是你看過不太會用某個工具的人用,可能會有點難受。他們可能花好幾分鐘甚至幾小時去做一個本來用個宏或者同時用幾個程序就能自動完成的任務。可是,學這些操作技巧要花時間,還很難。比如說,我最近想寫個 Python 程序處理蘋果 Lisa 鍵盤的輸入。我在網上找到一個人用 C 語言寫的相關代碼,里面好多像#define KEYNAME key_code 這樣的語句,我想把它們變成一個 Python 字典,把整數代碼對應到字符串。我是個 Emacs 用戶。我知道在 Emacs 里咋解決,這對我不難。這是我剛記下來的關鍵操作:C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ { 雖說這對我很自然,可到現在,我在 Emacs 上花了大半輩子才這么熟練,熟練到這都成自然反應了。但你知道現在我把大型語言模型連到編輯器里,我會咋做不?C-h C-h 請把這些 #define 重寫成{keycode: string,...}的字典格式。然后,文本就在我眼前重寫好了!就是在這種情況下,我覺得大型語言模型對不是專家的人的潛在用處甚至比專家還大。這個模型給每個人都提高了起點,要是你以前完全不會,現在突然能做很多事。
7、當作 API 參考
真正的程序員想搞懂某個工具咋工作會去讀參考手冊。但我比較懶,我更想直接得到答案。所以現在我就問大型語言模型。我給別人展示這些例子的時候,有人會有點防備,說:“大型語言模型沒做啥你用別的工具做不了的事!”你知道不?他們說得對。但是,用搜索引擎能做的事,用實體書講這個主題的也能做;用實體書能做的事,讀源代碼也能做。不過,每一種都比前一種簡單。事情越簡單,你就做得越頻繁,做法也不一樣。這就是我問“哪個$命令可以傳遞所有剩余參數”然后得到答案的例子。(緊接著是另一個“我該咋用這個東西”的問題!)這其實是我用大型語言模型最常用的辦法之一。我沒法給你展示更多這樣的例子,是因為我在 Emacs 和我的 shell 里都內置了問大型語言模型的工具。所以,我想做這些事 90%的時候,都不用離開我的編輯器。