劃重點(diǎn)
01Cursor團(tuán)隊(duì)在構(gòu)建人機(jī)協(xié)同體系,旨在改善程序員生活,提高編程效率。
02團(tuán)隊(duì)成員認(rèn)為,未來的編程將更加關(guān)注“你想要?jiǎng)?chuàng)造什么”,而非過度依賴AI。
03為此,他們正在研究如何將AI與人類智慧相結(jié)合,提高編程者的控制力和效率。
04同時(shí),團(tuán)隊(duì)也在探索合成數(shù)據(jù)分類法,以更好地訓(xùn)練AI模型。
05除此之外,他們還計(jì)劃在未來幾年內(nèi)實(shí)現(xiàn)AGI,讓編程更加有趣。
以上內(nèi)容由騰訊混元大模型生成,僅供參考
智東西(公眾號(hào):zhidxcom)
編譯 | 尹明順 吳浪娜
編輯 |漠影
智東西10月10日消息,當(dāng)?shù)貢r(shí)間10月7日,知名播客主持人Lex Fridman和Cursor團(tuán)隊(duì)4名創(chuàng)始成員Michael Truell、Sualeh Asif、Arvid Lunnemark和Aman Sanger進(jìn)行了一場長達(dá)兩個(gè)半小時(shí)的對話。
Cursor是一個(gè)基于VS Code的代碼編輯器,它為AI輔助編程添加了許多強(qiáng)大的功能,它引起了編程和AI社區(qū)的關(guān)注和興奮,風(fēng)頭正盛。那么Cursor作為一個(gè)初創(chuàng)團(tuán)隊(duì),如何能夠與科技巨頭微軟的Github Copilot一戰(zhàn)呢?
在播客中,幾人深度討論了Cursor團(tuán)隊(duì)目前的發(fā)展以及未來的探索方向,還廣泛談?wù)摿司幊痰奈磥,以及人類與AI在設(shè)計(jì)和構(gòu)建復(fù)雜而強(qiáng)大的系統(tǒng)方面達(dá)成合作的各種可能。
團(tuán)隊(duì)成員在博客中詳細(xì)分享了Cursor如何理解你的代碼庫并以此為依據(jù)預(yù)測你下一步要做什么,然后以驚人的速度生成代碼,從而有效提升了編程效率。
他們還介紹了Cursor更多功能,不僅擅長自動(dòng)補(bǔ)全代碼,它還引入了影子工作區(qū)輔助編寫代碼,并能通過簡單的描述來命令A(yù)I編寫更復(fù)雜的代碼,完成更多的任務(wù)。
此外,團(tuán)隊(duì)成員還對AI編程的技術(shù)要領(lǐng)進(jìn)行了深入分析,并對人與AI編程之間的倫理問題展開探討,提到了希望將OpenAI o1模型集成的愿景。
值得一提的是,團(tuán)隊(duì)成員認(rèn)為,快速就是有趣(Fast is Fun)。吸引人們在電腦上創(chuàng)造新內(nèi)容的原因之一就是驚人的迭代速度,而在其他領(lǐng)域,你可能會(huì)受到資源或能力的限制,但在編程的世界,只要有你和計(jì)算機(jī),你就能非?焖俚貥(gòu)建出非常酷的東西。
創(chuàng)始團(tuán)隊(duì)中,Aman Sanger擔(dān)任Cursor的CEO,是一位工程師和企業(yè)家,此前他曾在Instagram和Facebook擔(dān)任領(lǐng)導(dǎo)職位。Arvid Lunnemark是公司的CTO,是一位工程師,曾在Spotify和Google工作。Michael Truell擔(dān)任設(shè)計(jì)主管,Sualeh Asif擔(dān)任公司COO。
▲播客現(xiàn)場介紹Cursor團(tuán)隊(duì)成員(來源:YouTube)
以下是對該播客內(nèi)容的完整編譯(為提高可讀性,智東西調(diào)整了部分問答的順序,并在不違背原意的前提下進(jìn)行了一定的增刪修改)。
一、類似增強(qiáng)版文字處理器,代碼編輯器可處理更多任務(wù)
Lex:代碼編輯器有什么用?
Michael:代碼編輯器主要是構(gòu)建軟件的地方,長期以來,而在今天或很長一段時(shí)間里,代碼編輯器是指對正式編程語言進(jìn)行文本編輯的地方。對于非程序員來說,可以將代碼編輯器理解為程序員專用的增強(qiáng)版文字處理器。之所以說它是增強(qiáng)版,是因?yàn)榇a有很多結(jié)構(gòu)。因此,這個(gè)“文字處理器”即代碼編輯器,實(shí)際上可以為你做很多事情,而這些是傳統(tǒng)的文字處理器在文本編輯方面做不到的。
這包括給代碼中不同的元素提供視覺區(qū)分,以便快速瀏覽;可以在代碼庫中導(dǎo)航,直接跳轉(zhuǎn)到用戶正在使用的內(nèi)容的定義,就像在互聯(lián)網(wǎng)上使用超鏈接;還有進(jìn)行錯(cuò)誤檢查以捕獲基本錯(cuò)誤等。傳統(tǒng)上,這就是代碼編輯器的定義。我認(rèn)為在未來十年內(nèi),隨著構(gòu)建軟件的方式有所變化,代碼編輯器的定義也將發(fā)生很大變化。
Lex:我認(rèn)為代碼編輯器也應(yīng)該很有趣。
Arvid:是的,這非常重要。這實(shí)際上是我們決定構(gòu)建什么的一個(gè)被低估的方面。我們構(gòu)建的很多東西,通過試用它們,再進(jìn)行實(shí)驗(yàn),然后因?yàn)樗鼈儾挥腥ざ阉鼈內(nèi)拥。所以,有趣的很大一部分在于很多時(shí)候要快。快速就是有趣。
Michael:基本上,我認(rèn)為吸引很多人在電腦上構(gòu)建東西的原因之一是這種驚人的迭代速度,而在其他領(lǐng)域,你可能會(huì)受到資源或能力的限制……甚至將一大群人聚在一起編程也是一件令人驚奇的事情,只有你和計(jì)算機(jī),你才能可以非常快速地構(gòu)建出非?岬臇|西。
二、從Copilot的粉絲到開發(fā)Cursor,Cursor起源的兩個(gè)重要時(shí)刻
Lex:對于不知道的人來說,Cursor是一個(gè)超級(jí)酷的新編輯器,它是VS Code的一個(gè)分支。聽聽你們對自己編輯器之旅的講述會(huì)很有趣。我想你們所有人都是VS Code和Copilot的忠實(shí)粉絲。你們是如何接觸到VS Code的,以及這如何引導(dǎo)你們走向Cursor?
Aman:我們最初都是純Vim用戶。沒有Neovim,只有純Vim和終端。至少對我自己來說,當(dāng)Copilot出來的時(shí)候,大約是2021年,我真的很想試試它。所以我進(jìn)入了VS Code,這是唯一可以使用Copilot的代碼編輯器,盡管我真的很喜歡使用Vim,但VS Code和Copilot的體驗(yàn)足以說服我發(fā)生轉(zhuǎn)變。所以,這基本上成了默認(rèn)設(shè)置,直到我們開始開發(fā)Cursor。
Lex:也許應(yīng)該解釋一下Copilot的功能。它是一個(gè)非常不錯(cuò)的自動(dòng)補(bǔ)全工具。當(dāng)你開始寫東西時(shí),它會(huì)建議一到三行代碼來完成它,這是一種有趣的體驗(yàn)。你知道當(dāng)你有親密的朋友時(shí),你的朋友會(huì)幫你補(bǔ)全你的話一樣。當(dāng)它做得很好時(shí),會(huì)有一種親密的感覺?赡“親密”這個(gè)詞不太準(zhǔn)確,但有一種很酷的感覺,就像“哇,它懂我”。然而當(dāng)它不懂你時(shí),就會(huì)有一種不愉快的感覺。所以會(huì)有這種摩擦。但我想說,對于很多人來說,那種“它懂我”的感覺壓倒了“它不懂我”的感覺。
Arvid:我認(rèn)為GitHub Copilot被低估的一點(diǎn)是,即使它出錯(cuò)了也有點(diǎn)煩人,但并沒有那么糟糕,因?yàn)槟阒恍柙佥斎胍粋(gè)字符,也許它就能理解你了,或者你再輸入一個(gè)字符,它就能理解你了。所以即使它錯(cuò)了,也不會(huì)那么糟糕。
Sualeh:你可以進(jìn)行迭代和修復(fù)。我的意思是,對我來說,Copilot的另一個(gè)被低估的部分是,它是第一個(gè)真正的AI產(chǎn)品,第一個(gè)面向消費(fèi)者的語言模型產(chǎn)品。
Lex:所以Copilot有點(diǎn)像語言模型的第一個(gè)殺手級(jí)應(yīng)用。
Michael:是的,它的beta版在2021年發(fā)布。
Lex:那么Cursor的起源故事是什么樣的?
Michael:大約在2020年,OpenAI發(fā)布了scaling laws論文,這是一個(gè)關(guān)鍵時(shí)刻,這個(gè)領(lǐng)域似乎取得了清晰可預(yù)測的進(jìn)展,即使我們沒有任何新想法,看起來只要有更多的計(jì)算能力和更多的數(shù)據(jù),就可以讓這些模型變得更好。
Lex:順便說一下,我們可能需要花三到四個(gè)小時(shí)來討論scaling laws這個(gè)話題。但簡而言之,這是一系列論文中的一篇,這些論文提出了一系列觀點(diǎn),認(rèn)為在機(jī)器學(xué)習(xí)領(lǐng)域,模型的大小和數(shù)據(jù)的大小,越大越好。
Michael:所以在那段時(shí)間,我們中的一些人有很多關(guān)于這會(huì)是什么樣子的概念性討論。對于所有這些不同知識(shí)領(lǐng)域的工作者來說,這項(xiàng)技術(shù)的發(fā)展將如何讓他們變得更好?然后我認(rèn)為有幾個(gè)時(shí)刻,那篇論文中預(yù)測的理論進(jìn)展開始變得非常具體,開始覺得你可以在AI領(lǐng)域做實(shí)際上有用的工作,而不需要去攻讀博士。感覺現(xiàn)在可以構(gòu)建一整套真正有用的系統(tǒng)。我認(rèn)為第一個(gè)時(shí)刻是玩轉(zhuǎn)Copilot的早期測試版,那種感覺很棒,很神奇。
我認(rèn)為第二個(gè)重要時(shí)刻是提前獲得了GPT-4的早期訪問權(quán)限。大約在2022年底,我們開始修改這個(gè)模型,能力的升級(jí)感覺非常巨大。在此之前,我們一直在研究一些不同的項(xiàng)目。因?yàn)镃opilot,因?yàn)閟caling laws,因?yàn)槲覀冎皩@項(xiàng)技術(shù)的興趣,我們一直在修改程序員使用的工具,但這些都是非常具體的工具。所以我們正在為必須在Jupyter Notebook上工作的金融專業(yè)人士構(gòu)建工具,或者嘗試使用這些模型進(jìn)行靜態(tài)分析。
而GPT-4的升級(jí)讓我們感覺這確實(shí)證實(shí)了我們之前預(yù)測的理論進(jìn)展。感覺就像在那個(gè)時(shí)間點(diǎn)你可以立即構(gòu)建很多東西。而且,如果我們保持一致,這真的感覺不僅僅是一個(gè)點(diǎn)解決方案,這將涉及整個(gè)編程領(lǐng)域,所有編程都將通過這些模型進(jìn)行,而且感覺這需要一種不同類型的編程環(huán)境,一種不同的編程方式,所以我們開始構(gòu)建那種更大的愿景。
Sualeh:有一件事我印象非常深刻,我的室友是IMO金牌得主,美國有一個(gè)叫Putnam的比賽,這有點(diǎn)像是大學(xué)生的IMO,也是一個(gè)數(shù)學(xué)競賽,它非常精彩。我記得Shengtong和Aman在2022年6月左右打賭,賭能否在2024年6月或7月的IMO中獲得金牌。
Lex:IMO是國際數(shù)學(xué)奧林匹克競賽。
Sualeh:Arvid和我也參加了,盡管我在某種程度上相信進(jìn)步,但我認(rèn)為想拿下IMO金牌,Aman是在異想天開。但老實(shí)說我完全錯(cuò)了,但這可能是團(tuán)隊(duì)中最有先見之明的賭注。
Aman:我清楚地記得我和Michael有一次對話,在那之前我還沒有非常深入和批判性地思考過scaling laws,他提出了一個(gè)問題,為什么scaling laws就是你需要的一切,或者為什么scaling laws不會(huì)帶來巨大的進(jìn)步?我想我經(jīng)歷了悲傷的五個(gè)階段,最后終于接受了。
我想從那以后我一直對進(jìn)步充滿希望和樂觀。我想要補(bǔ)充的一點(diǎn)是,這也取決于你將在哪些領(lǐng)域看到進(jìn)步。數(shù)學(xué)是一個(gè)偉大的領(lǐng)域,尤其是形式化定理證明,因?yàn)槟憧梢缘玫揭粋(gè)很好的信號(hào)來實(shí)際驗(yàn)證事物是否正確。所以這意味著像強(qiáng)化學(xué)習(xí)這樣的東西可以工作得非常好,我認(rèn)為你可能會(huì)擁有在數(shù)學(xué)上非常超人的系統(tǒng),但從技術(shù)上講仍然沒有AGI。
三、Cursor預(yù)測你的下一步,或?qū)⒏淖儤?gòu)建軟件的方式
Lex:好的,那么我們談?wù)凜ursor。
Michael:對我們來說,決定做一個(gè)編輯器似乎是顯而易見的,至少對于我們想要做的事情和實(shí)現(xiàn)的目標(biāo)來說是這樣的,因?yàn)楫?dāng)我們開始開發(fā)編輯器時(shí),想法是這些模型會(huì)變得更好,它們的能力會(huì)提高,這將徹底改變你構(gòu)建軟件的方式,這不僅會(huì)讓你獲得巨大的生產(chǎn)力提升,而且會(huì)帶來根本性的改變,構(gòu)建軟件的方式也會(huì)發(fā)生很大的變化。所以,如果你是現(xiàn)有編程環(huán)境的一個(gè)插件,那么你對代碼編輯器的控制會(huì)非常有限,我們不想被這些限制所束縛。我們希望能夠構(gòu)建最有用的東西。
Lex:Cursor與Copilot在某種程度上是競爭對手,你們?nèi)绾稳伲靠克俣群凸δ苜|(zhì)量嗎?
Aman:是的,我想這是一個(gè)相當(dāng)有趣,也許非常獨(dú)特的領(lǐng)域,如果你看看以前的技術(shù)浪潮,也許只有一種主要的事情發(fā)生,它解鎖了一波新的公司,但每年,每一個(gè)模型能力的跳躍,你就解鎖了一波新的功能,尤其是編程中可能實(shí)現(xiàn)的事情。
所以我認(rèn)為在AI編程中,即使只是領(lǐng)先幾個(gè)月,更不用說一年了,也會(huì)讓你的產(chǎn)品變得有用得多。我認(rèn)為一年后的Cursor將需要讓今天的Cursor看起來過時(shí)。我認(rèn)為微軟已經(jīng)做了很多很棒的事情,但我認(rèn)為他們不像一個(gè)初創(chuàng)公司那樣有很大的空間真正繼續(xù)創(chuàng)新和推動(dòng)這方面的發(fā)展。
Sualeh:我不知道我是否從功能的角度來考慮它,還是從程序員的能力的角度來考慮它。隨著新的o1模型發(fā)布,我相信會(huì)有更多不同類型的模型,比如更長上下文的,也許更快,所有這些瘋狂的想法你都可以去嘗試,希望其中10%的瘋狂想法能夠變成某種很酷且有用的東西,我們希望人們能更快地?fù)碛兴。換句話說,一個(gè)被低估的事實(shí)是,我們正在為自己創(chuàng)造它。
當(dāng)我們開始構(gòu)建Cursor時(shí),你真的會(huì)感到沮喪,你可以看到模型變得更好,但Copilot的體驗(yàn)沒有改變。就像,這些家伙天花板越來越高,為什么他們不創(chuàng)造新東西?他們應(yīng)該創(chuàng)造新東西。那些Alpha功能在哪里?但沒有那些功能。如果做了新東西,我確信它是一門好生意。我敢肯定這是一項(xiàng)偉大的事業(yè),我是那種真的想嘗試和使用新東西的人,但很長一段時(shí)間都沒有做出新東西。
Lex:當(dāng)你比較Cursor和Copilot時(shí),Copilot很快就開始因?yàn)槟撤N原因而給人一種過時(shí)了的感覺。
Arvid:是的,我認(rèn)為對我們有幫助的一件事是,我們把所有事情都做成了,我們在開發(fā)用戶體驗(yàn)和與模型交互的方式的同時(shí),也在開發(fā)如何讓模型給出更好的答案。所以你如何構(gòu)建提示,或者你如何找到上下文,對于Cursor Tab來說,你如何訓(xùn)練模型?所以我認(rèn)為這有助于我們讓同一批人來負(fù)責(zé)整個(gè)體驗(yàn)。
Sualeh:是的,就像制作UI的人和訓(xùn)練模型的人坐在一起,相距18英尺遠(yuǎn),甚至經(jīng)常是同一個(gè)人。你可以創(chuàng)造出一些如果不交談、不實(shí)驗(yàn)就不可能實(shí)現(xiàn)的東西。
Lex:你們用Cursor來寫Cursor?
Arvid:當(dāng)然。
Lex:我們聊聊無所不能的Tab,堪稱加強(qiáng)版自動(dòng)補(bǔ)全的功能。Tab是怎么工作的?它是什么?
Michael:概括來說,我認(rèn)為Cursor目前在兩個(gè)方面表現(xiàn)不錯(cuò)。當(dāng)然,它還有其他功能,但這兩項(xiàng)功能對程序員來說非常有幫助。一是它就像在你身后觀察,是一個(gè)速度很快、可以搶在你前面輸入并預(yù)測你下一步要做什么的同事。這也是一個(gè)好的自動(dòng)補(bǔ)全功能的初衷,預(yù)測你下一步要做什么,但我們可以更進(jìn)一步,不僅預(yù)測Cursor后面的字符,還能預(yù)測你要進(jìn)行的下一個(gè)整體更改、下一個(gè)差異、接下來要跳轉(zhuǎn)的位置。
第二個(gè)是,能幫助你有時(shí)領(lǐng)先于AI,告訴它該做什么,實(shí)現(xiàn)從指令到代碼的轉(zhuǎn)換。為了做好這兩件事,我們在提高編輯體驗(yàn)上下了很多功夫,讓它們既符合人體工程學(xué),又足夠智能和快速。
四、加強(qiáng)版自動(dòng)補(bǔ)全功能Cursor Tab,消除編輯器中的低熵操作
Sualeh:我們真正想要實(shí)現(xiàn)的是,讓模型能夠?yàn)槲覀兙庉嫶a。這是我們的愿望,在擁有能夠編輯代碼的優(yōu)質(zhì)模型之前,我們進(jìn)行了多次嘗試。有了優(yōu)質(zhì)模型后,為了讓使用體驗(yàn)更加流暢,我們付出了很多努力來加快推理速度,并已經(jīng)開始整合。
Michael剛才也提到了這種跳轉(zhuǎn)到不同位置的能力,我認(rèn)為這種跳轉(zhuǎn)源于一種感覺,即一旦你接受了編輯,下一步要去哪里應(yīng)該非常明顯。比如,我做了這個(gè)更改,模型應(yīng)該直接知道下一步要跳轉(zhuǎn)到第18行。如果你是WIM用戶,你可能會(huì)按18JJ之類的快捷鍵,但為什么我要這么做呢?模型應(yīng)該直接知道。
所以,你只需要按Tab鍵,它就會(huì)跳到第18行,然后顯示下一個(gè)編輯,你再按Tab鍵,你只需一直按Tab鍵,就能一直這樣操作下去。所以內(nèi)部競爭就變成了,我們能讓人按多少次Tab鍵?一旦你有了這個(gè)想法,更抽象地說,要考慮的是如何使編輯達(dá)到零熵狀態(tài)。
也就是說,一旦你表達(dá)了意圖并且編輯,沒有新的信息片段來完成你的想法,但你仍然需要輸入一些字符來讓計(jì)算機(jī)理解你真正的想法,那么模型或許應(yīng)該“讀懂”你的心思,所有零熵位都應(yīng)該只是被Tab鍵消除,這就是比較抽象的說法。
Aman:一個(gè)有趣的現(xiàn)象是,如果你看不同領(lǐng)域的language model loss,我相信每字節(jié)的比特?cái)?shù),這是一種對代碼字符標(biāo)準(zhǔn)化損失的衡量,比語言低,這意味著代碼中有很多token是非常可預(yù)測的,很多字符也是非常可預(yù)測的。而且,當(dāng)你不僅僅是試圖自動(dòng)補(bǔ)全代碼,而是預(yù)測用戶在編輯現(xiàn)有代碼時(shí)的下一步操作時(shí),這種可預(yù)測性會(huì)被進(jìn)一步放大。因此,Cursor Tab的目標(biāo)是消除編輯器中所有低熵操作。一旦意圖得到有效確定,就讓我們直接跳轉(zhuǎn)到未來的某個(gè)時(shí)間點(diǎn),向前跳過。
Lex:那么,Tab在近期內(nèi)應(yīng)該能夠做什么?
Aman:我可以講講讓這些功能發(fā)揮作用的一些細(xì)節(jié)。它們的延遲極低,所以你需要在這個(gè)任務(wù)上訓(xùn)練小型模型。特別是,它們非常需要預(yù)填充token。這意味著它們有非常長的提示,能看到很多代碼,但實(shí)際上生成的token并不多。因此,使用MOE模型是最合適的。這是我們?nèi)〉玫囊豁?xiàng)突破,極大地提高了模型在長上下文中的性能。另一個(gè)突破是我們構(gòu)建的投機(jī)解碼的變體,稱為投機(jī)編輯。我認(rèn)為,這兩點(diǎn)是使其質(zhì)量高、速度快的重要因素。
Lex:那么緩存起作用了嗎?
Aman:緩存起到了巨大的作用。因?yàn)槟阋幚磉@么多輸入token,如果你在給定行中輸入的每個(gè)按鍵都要針對所有傳入的token重新運(yùn)行模型,那么一是會(huì)大大降低延遲,二是會(huì)讓GPU負(fù)載過高。因此,你需要設(shè)計(jì)用于模型的實(shí)際提示,使其具有緩存意識(shí)。然后,你需要跨請求重用KV緩存,以減少計(jì)算量。
Sualeh:希望能跳轉(zhuǎn)到不同的文件。所以,如果你在一個(gè)文件中進(jìn)行了編輯,可能需要轉(zhuǎn)到另一個(gè)文件來完成你的想法,它也應(yīng)該轉(zhuǎn)到第二個(gè)文件。
Arvid:完整的泛化是下一步行動(dòng)預(yù)測。有時(shí)你需要在終端中運(yùn)行命令,它應(yīng)該能夠根據(jù)你編寫的代碼來建議命令,或者有時(shí)它會(huì)給出建議,但你很難判斷它是否正確,因?yàn)槟阈枰嘈畔韺W(xué)習(xí)。你需要知道類型才能驗(yàn)證其是否正確。所以它或許應(yīng)該先帶你到某個(gè)定義的地方,然后再帶你回來,這樣你就有了接受下一個(gè)補(bǔ)全所需的所有必要知識(shí)。
Michael:編程是一門奇特的學(xué)科,有時(shí)你接下來五分鐘要做什么,實(shí)際上是可以根據(jù)你最近所做的事情預(yù)測出來的。那么,我們能否創(chuàng)造一個(gè)世界,讓這接下來的五分鐘要么在你放手的情況下自動(dòng)完成,要么在你看到下一步要做什么并確認(rèn)無誤后,通過輕觸Tab鍵就能快速實(shí)現(xiàn)。
五、增加顯示框提示代碼差異,圍繞審查者體驗(yàn)做設(shè)計(jì)
Lex:Cursor有一個(gè)非?崆乙俗⒛康墓δ埽蔷褪钦麄(gè)diff界面情況。所以,模型用紅色和綠色顯示我們將如何修改代碼,然后可以在聊天窗口中應(yīng)用它,它會(huì)向你顯示diff,你可以接受diff。那么,你能講講這方面的發(fā)展方向嗎?
Sualeh:我們可能會(huì)有四五種不同的diff。我們?yōu)樽詣?dòng)補(bǔ)全功能優(yōu)化了diff,因此它具有與審查大塊代碼時(shí)不同的diff接口。然后,我們正在嘗試優(yōu)化另一個(gè)diff功能,以適應(yīng)處理多個(gè)不同文件的情況。從高層次來看,差異在于,當(dāng)你進(jìn)行自動(dòng)補(bǔ)全時(shí),讀取速度應(yīng)該非?。實(shí)際上,在所有情況下它的讀取速度都應(yīng)該非?欤谧詣(dòng)補(bǔ)全功能中,你的注意力會(huì)集中在一個(gè)區(qū)域,人類無法同時(shí)關(guān)注太多不同的地方。
在界面方面,我們有當(dāng)前框,如果你試圖在某個(gè)地方刪除代碼并嘗試添加其他代碼,它會(huì)嘗試在側(cè)面顯示一個(gè)框。
我們嘗試了三四種不同的方法來實(shí)現(xiàn)這個(gè)功能。最初的方法是在旁邊顯示一個(gè)帶有藍(lán)色刪除線的框。它過去會(huì)以Google Docs的風(fēng)格顯示要?jiǎng)h除的代碼,你會(huì)看到一條線穿過,然后看到新代碼,這非常分散注意力。然后我們嘗試了很多不同的方法……有刪除、紅色高亮等。
之后的迭代版本有點(diǎn)有趣,你會(huì)按住Mac上的option鍵。所以它會(huì)高亮顯示一段代碼,以顯示AI有建議給你。在這個(gè)例子中,輸入和值都會(huì)變成藍(lán)色,藍(lán)色是用來高亮顯示AI對你有一個(gè)建議。它不會(huì)直接顯示建議的內(nèi)容,而只是提示你AI有一個(gè)建議。如果你真的想看到它,就按住option鍵,然后你會(huì)看到新的建議,松開option鍵后,你又會(huì)看到原始代碼。
Arvid:我個(gè)人非常期待在這個(gè)領(lǐng)域做出很多改進(jìn)。我們經(jīng)常把它稱為驗(yàn)證問題,這些差異對于小范圍修改來說很好用。但如果是大范圍修改,或者涉及多個(gè)文件等情況,審查這些差異就有點(diǎn)費(fèi)力了。所以這里有幾個(gè)不同的想法。一個(gè)想法是,差異中的某些部分很重要,包含了很多信息。而有些部分的信息熵很低,就是重復(fù)的內(nèi)容。
所以,或許可以高亮顯示重要的部分,而將不那么重要的部分灰度顯示;蛘,你可以有一個(gè)模型,它查看差異并發(fā)現(xiàn),“哦,這里可能有個(gè)漏洞。”我會(huì)用紅色波浪線標(biāo)記出來,并提示你,“你應(yīng)該重點(diǎn)審查這部分差異。”我覺得這類想法很令人興奮。
而且,你希望用一個(gè)智能模型來完成這項(xiàng)工作。目前的算法只是普通算法,沒有智能性。算法的設(shè)計(jì)需要智能,但你并不關(guān)心它是關(guān)于這個(gè)還是那個(gè),你只希望模型能做到這一點(diǎn)。
Sualeh:所以我認(rèn)為一個(gè)普遍的問題是,隨著這些模型變得越來越智能,它們能夠提出的更改也會(huì)越來越大。而隨著更改越來越大,人類需要做的驗(yàn)證工作也越來越多。這變得越來越……你需要幫助他們。我可不想把所有的時(shí)間都花在代碼審查上。
Aman:GitHub試圖通過代碼審查來解決這個(gè)問題。當(dāng)你進(jìn)行代碼審查時(shí),你正在審查多個(gè)文件中的多個(gè)差異。但就像Arvid之前說的,我認(rèn)為你可以做得比代碼審查更好。代碼審查有點(diǎn)糟糕。你花了很多時(shí)間去理解那些通常對你來說很陌生的代碼,而且它甚至并不能真正捕捉到很多漏洞。
我認(rèn)為,使用語言模型可以顯著改善審查體驗(yàn),例如,使用Arvid之前描述的那種技巧,即可能指向?qū)嶋H重要的區(qū)域。我還認(rèn)為,如果代碼是由這些語言模型生成的,而不是由其他人生成的……代碼審查體驗(yàn)是同時(shí)為審查者和代碼編寫者設(shè)計(jì)的。
在代碼編寫者是語言模型的情況下,你就不必那么關(guān)心他們的體驗(yàn)了,你可以完全圍繞審查者來設(shè)計(jì)整個(gè)體驗(yàn),讓審查者的工作盡可能有趣、輕松、高效。我覺得,如果只是天真地試圖讓這些東西看起來像代碼審查,那就會(huì)出現(xiàn)問題。我認(rèn)為你可以更有創(chuàng)造力,并推動(dòng)可能性的邊界。
Arvid:還有一個(gè)想法是,我認(rèn)為順序很重要。通常,當(dāng)你審查一個(gè)拉取請求(PullRequest)時(shí),你會(huì)看到一個(gè)文件列表,并且從上到下依次審查,但實(shí)際上,你可能需要先理解這個(gè)部分,因?yàn)檫@部分在邏輯上是先發(fā)生的,然后你再理解下一部分,而你不希望自己弄清楚這一點(diǎn),你希望有一個(gè)模型來引導(dǎo)你。
我認(rèn)為,并不是所有的編程都會(huì)變成自然語言。如果我正在和Sualeh結(jié)對編程,Sualeh在電腦前和鍵盤上,有時(shí)如果我來主導(dǎo),我會(huì)對Sualeh說,嘿,實(shí)現(xiàn)這個(gè)功能,這樣就行了。但有時(shí),向Sualeh解釋我想讓他做什么太麻煩了,所以我會(huì)接過鍵盤,給他展示一下。
我寫一部分示例,然后他就明白了,這是最容易的溝通方式。所以我認(rèn)為,對AI來說也是這樣。有時(shí),與AI溝通的最簡單方式就是展示一個(gè)示例,然后它就會(huì)在其他地方執(zhí)行這個(gè)操作。
或者,有時(shí)如果你在做網(wǎng)站,例如,向AI展示你想要什么最容易的方式不是告訴它要做什么,而是拖動(dòng)或繪制東西,也許最終我們會(huì)實(shí)現(xiàn)腦機(jī)接口之類的,你就可以讓它理解你在想什么。所以我認(rèn)為自然語言會(huì)有一席之地。但我肯定地認(rèn)為,它不會(huì)是大多數(shù)人大部分時(shí)間編程的方式。
▲播客現(xiàn)場(來源:YouTube)
六、Apply定制模型創(chuàng)建差異,更少的token使用更智能的模型
Lex:我在使用這個(gè)編輯器時(shí),真的感受到了通用AI(AGI)的存在。感覺它背后有很多機(jī)器學(xué)習(xí)在起作用。能告訴我一些讓它正常工作的機(jī)器學(xué)習(xí)內(nèi)容嗎?
Aman:Cursor真正發(fā)揮作用的地方在于,我們通過這組自定義模型與前沿模型一起訓(xùn)練,這些模型在推理密集型任務(wù)中表現(xiàn)非常出色。Cursor Tab就是一個(gè)很好的例子,你可以將這個(gè)模型專門化,使其甚至比前沿模型還要好。另一個(gè)領(lǐng)域是Apply,令人驚訝的是它需要定制模型,但這是必要的,而且在應(yīng)用方面效果很好。
這些前沿模型在草擬代碼計(jì)劃和生成變化的粗略草圖方面相當(dāng)出色,但實(shí)際上,為訓(xùn)練模型創(chuàng)建差異對于前沿模型來說是非常困難的。如果你嘗試用Sonnet、o1或任何其他前沿模型來做這件事,它會(huì)在一些愚蠢的事情上出錯(cuò),比如計(jì)算行數(shù),尤其是在非常大的文件中。為了解決這個(gè)問題,我們讓模型勾勒出這個(gè)粗略的代碼塊,表明將發(fā)生哪些變化,然后我們訓(xùn)練一個(gè)模型,將該變化應(yīng)用到文件中。
Lex:我們應(yīng)該說,Apply模型會(huì)查看你的代碼,并給你一個(gè)非常好的新操作建議。而看似對人類來說微不足道的將兩者結(jié)合起來的步驟,并不容易。
Sualeh:與普遍認(rèn)知相反,這不是一個(gè)確定性算法。
Aman:是的,你會(huì)發(fā)現(xiàn)其他地方有Apply的淺拷貝,但大多數(shù)情況下它都會(huì)失效,因?yàn)槟阌X得可以嘗試進(jìn)行一些確定性匹配,但它至少會(huì)有40%的時(shí)間失敗了,這會(huì)導(dǎo)致產(chǎn)品體驗(yàn)非常糟糕。我認(rèn)為,隨著模型變得越來越智能,這種趨勢將繼續(xù)下去。所以,Apply還能讓你做另一件事,那就是你可以用更少的token來使用最智能的模型。這在生成所有這些token的延遲和成本方面都很昂貴。
所以,你可以給出一個(gè)非常粗略的草圖,然后讓你的模型去實(shí)現(xiàn)它,因?yàn)閷?shí)現(xiàn)這個(gè)非常粗略的代碼是一個(gè)更容易的任務(wù)。我認(rèn)為這種趨勢將繼續(xù)下去,你可以使用越來越智能的模型來進(jìn)行計(jì)劃,然后也許可以由不那么智能的模型來處理實(shí)現(xiàn)細(xì)節(jié)。也許你可以使用o1,也許它會(huì)有更強(qiáng)大的模型,給出更高級(jí)別的計(jì)劃,該計(jì)劃由sauna遞歸應(yīng)用,然后是apply模型。
Sualeh:也許應(yīng)該談?wù)勅绾巫屗兛臁?/p>
Aman:讓它變快的一個(gè)主要組成部分是投機(jī)編輯。投機(jī)編輯是投機(jī)解碼的一種變體,也許簡要描述一下投機(jī)解碼會(huì)很有幫助。在投機(jī)解碼中,你可以利用這樣一個(gè)事實(shí),大多數(shù)情況下,我會(huì)加上一個(gè)限定,那就是當(dāng)你在語言模型生成中受到內(nèi)存限制時(shí),如果你一次處理多個(gè)token,這比一次生成一個(gè)token要快。
所以我們做的是,不是使用投機(jī)解碼通常所做的,即使用一個(gè)小模型來預(yù)測這些草稿token,然后你的大模型會(huì)進(jìn)去驗(yàn)證,在代碼編輯中,我們對現(xiàn)有代碼的外觀有非常強(qiáng)的先驗(yàn),并且該先驗(yàn)實(shí)際上是完全相同的代碼。所以,你可以做的是,將原始代碼的部分反饋回模型,然后模型大多數(shù)情況下都會(huì)同意,“好吧,我只是要把這段代碼原樣輸出。”
所以,你可以并行處理所有這些行,只要使用足夠多塊即可。然后最終你會(huì)達(dá)到一個(gè)分歧點(diǎn),模型現(xiàn)在將預(yù)測與原始代碼不同的文本。它會(huì)生成這些token,然后,在足夠多的token與原始代碼匹配后,我們會(huì)重新開始以代碼塊為單位進(jìn)行預(yù)測。
這實(shí)際上看起來就像是正常編輯代碼的一個(gè)更快版本。所以它看起來就像是模型重寫所有代碼的一個(gè)更快版本。因此,我們可以使用與diff相同的接口,但它的流式傳輸速度會(huì)快得多。
七、GPT和Claude在編程上哪個(gè)更勝一籌?
Lex:哪個(gè)大語言模型更擅長編程?GPT和Claude,在編程方面,哪個(gè)更勝一籌?
Aman:我認(rèn)為沒有哪個(gè)模型能在所有我們認(rèn)為重要的類別中都優(yōu)于其他模型,這些類別包括速度、編輯代碼的能力、處理大量代碼的能力、長文本上下文,以及其他幾個(gè)因素和編程能力。我現(xiàn)在會(huì)說總體上最好的是Sonnet。我認(rèn)為這是大家的共識(shí)。
o1也非常有趣,它非常擅長推理。所以,如果你給它一些很難的編程面試風(fēng)格的問題或者領(lǐng)導(dǎo)代碼問題,它能做得很好,但它似乎不如Sonnet那樣能理解你的大致意圖。如果你看看其他很多前沿模型,我有一個(gè)疑慮,那就是感覺它們不一定好……我不是說它們在基準(zhǔn)測試上訓(xùn)練,但它們在基準(zhǔn)測試中的表現(xiàn)確實(shí)非常好,相對于所有中間的東西。
所以如果你嘗試所有這些基準(zhǔn)測試和它們評估的分布中的東西,它們會(huì)做得很好。但是,當(dāng)你把它們稍微推離這個(gè)范圍時(shí),Sonnet是我認(rèn)為在保持相同能力方面做得最好的。你在基準(zhǔn)測試中擁有的能力與嘗試指示它執(zhí)行任何與編程相關(guān)的事情時(shí)擁有的能力相同。
Sualeh:順便說一下,這是一個(gè)非常困難且至關(guān)重要的細(xì)節(jié),基準(zhǔn)測試與真正的編程之間的區(qū)別在于,真正的編程并不是面試風(fēng)格的編程。人類有時(shí)會(huì)說半吊子的英語,有時(shí)你會(huì)說,“哦,按照我之前做的那樣做。”有時(shí)你會(huì)說,“添加這個(gè)東西,然后為我做這個(gè)其他事情,然后制作這個(gè)UI元素。”但很多事情都是依賴于上下的。你真的想要理解人類,然后按照人類的意愿去做,而不是……也許抽象地說,面試問題是非常明確具體的。它們在很大程度上依賴于明確說明,而人類的東西則不那么明確。
Aman:關(guān)于Claude,我聽到過一個(gè)有趣的觀點(diǎn),我認(rèn)為AWS有不同的芯片,我懷疑它們與Nvidia GPU的數(shù)值略有不同,有人推測Claude性能下降可能與在AWS Bedrock上使用的量化版本與Anthropics GPU上運(yùn)行的版本不同有關(guān)。
八、Preempt系統(tǒng)可自動(dòng)實(shí)現(xiàn)預(yù)想效果
Lex:在這一切中,一個(gè)好的提示(Prompt)扮演著什么角色?
Arvid:我認(rèn)為這取決于你使用的是哪個(gè)模型,它們都有細(xì)微的差別,對不同的提示反應(yīng)也不同。但我認(rèn)為,最初的GPT-4和去年的某些模型,它們對提示相當(dāng)敏感,而且它們的上下文窗口也很校所以我們有很多與代碼庫相關(guān)的信息,這些信息可能在提示中會(huì)很有用。
你有文檔、你添加的文件、你有對話歷史,然后問題就來了,你如何決定實(shí)際上要把什么放進(jìn)提示里,特別是當(dāng)你的空間有限時(shí)?對于今天的模型,即使你有長上下文,填滿整個(gè)上下文窗口就意味著它會(huì)變慢。這意味著有時(shí)模型實(shí)際上會(huì)感到困惑,而且有些模型比其他模型更容易困惑。
我們內(nèi)部有一個(gè)系統(tǒng)叫做Preempt,它在這方面對我們有一些幫助。我認(rèn)為它是為我們有8000個(gè)token上下文窗口的時(shí)代建立的,它有點(diǎn)類似于當(dāng)你在制作一個(gè)網(wǎng)站時(shí)。你希望它在手機(jī)上能正常工作,你希望它在桌面上也能正常工作,而你有這些動(dòng)態(tài)信息,但你沒有固定的布局。
例如,如果你設(shè)計(jì)一本印刷雜志,你知道你可以把東西放在哪里,但是當(dāng)你有一個(gè)網(wǎng)站或者一個(gè)提示時(shí),你有這些輸入,然后你需要格式化它們,以便它們能總是正常工作,即使輸入非常大,你可能必須削減一些內(nèi)容。所以我們的想法是,好吧,讓我們從中獲得一些啟發(fā)。
設(shè)計(jì)網(wǎng)站的最佳方式是什么?我們非常喜歡的是React以及它的聲明式方法,你在JavaScript中使用JSX,然后直接聲明:這就是我想要的,我認(rèn)為這個(gè)部分比其他部分具有更高的優(yōu)先級(jí)或更高的Z軸順序。在網(wǎng)頁設(shè)計(jì)中,你有一個(gè)渲染引擎,就像Chrome一樣,在Cursor中它是一個(gè)preempt渲染器,它會(huì)將所有內(nèi)容都放在頁面上。你只需說明你想要的效果,渲染器會(huì)自動(dòng)幫你實(shí)現(xiàn)。我們發(fā)現(xiàn)這鐘方法非常有幫助,而且它的作用隨著時(shí)間的推移已經(jīng)發(fā)生了變化。
最初它是為了適應(yīng)較小的上下文窗口,而現(xiàn)在它在拆分進(jìn)入提示詞的數(shù)據(jù)和實(shí)際生成方面發(fā)揮了很大作用。因此,它更容易調(diào)試,因?yàn)槟憧梢孕薷奶崾驹~,然后在舊的提示上進(jìn)行測試,直接查看你的修改是否真的提升了整個(gè)評估集的表現(xiàn)。
Lex:所以你們是真的用JSX來提示嗎?
Arvid:是的。我們有一個(gè)文件組件,它接收光標(biāo)。通常在你的文件中有一行光標(biāo)所在的位置,那可能是最重要的一行,因?yàn)槟鞘悄阏诓榭吹囊恍小H缓竽憧梢越o出優(yōu)先級(jí)。而且,如果你有很多來自整個(gè)代碼庫的代碼塊,你可以使用檢索和嵌入等重新排序分?jǐn)?shù)來為這些組件添加優(yōu)先級(jí)。
Lex:那么當(dāng)人類提問時(shí),也應(yīng)該嘗試使用那樣的東西嗎?這是否意味著問題會(huì)變得松散和混亂,還是這樣的系統(tǒng)應(yīng)該鼓勵(lì)人們更清晰地表達(dá)?
Arvid:我認(rèn)為我們的目標(biāo)是,你應(yīng)該只做對你來說最自然的事情,然后我們的工作就是弄清楚如何實(shí)際檢索到相對重要的事情,以便你的思考是有意義的。
Lex:模型選擇回應(yīng)與一般回應(yīng)有多難?這很難,如何處理不確定性。我是否選擇詢問更多信息以減少歧義?
Sualeh:我們最近為Cursor添加了一個(gè)加入文件的功能。當(dāng)你在編輯代碼或輸入內(nèi)容時(shí),模型會(huì)嘗試預(yù)測你正在做什么,如果模型發(fā)現(xiàn)有不確定的地方,它會(huì)猜測你可能在編寫某種API。然后,模型會(huì)查看你的歷史記錄,推測哪些文件與當(dāng)前的編輯內(nèi)容相關(guān)。
這里有一個(gè)技術(shù)上的難題,就是如何在所有歷史記錄中找到相關(guān)的信息,判斷在當(dāng)前的提示詞下哪些文件最重要。雖然這個(gè)功能還處于試驗(yàn)階段,但相信我們會(huì)逐步完善它,但我們想展示出這個(gè)想法:你是否想添加這個(gè)文件、那個(gè)文件,以便模型幫你編輯?
也許你在編寫一個(gè)API,你也應(yīng)該需要編輯使用這個(gè)API的客戶端和服務(wù)器代碼,那么API發(fā)生變化時(shí),客戶端和服務(wù)器代碼也需要相應(yīng)更新。
Cursor可以做的是,當(dāng)你在編寫提示或代碼時(shí),在你按下回車之前,模型可以幫你找到這些可能需要一起修改的部分。這樣做的好處是,可以提前解決一些不確定性,確保所有相關(guān)的代碼都被正確更新,而不需要手動(dòng)去查找和同步這些改動(dòng)。
九、我們正在接近AGI時(shí)代,但AI Agent還不實(shí)用
Lex:你們怎么看Agent?Agent有多有用?
Arvid:我覺得Agent就像是人類,你能感覺到你正在接近AGI,因?yàn)槟隳芸吹揭粋(gè)演示,它表現(xiàn)得就像一個(gè)真人,這真的很酷。我認(rèn)為Agent在很多事情上還不是特別有用,但我們已經(jīng)越來越接近它們真正變得有用的階段了。
所以我覺得有些類型的任務(wù),有Agent的話會(huì)更好。例如,如果我們有一個(gè)bug,有時(shí)你不能在聊天輸入框中使用Command+C和Command+V,這是一個(gè)非常明確的任務(wù),我只需要用兩句話來說:“這個(gè)不能用,請修復(fù)它。”然后我會(huì)很樂意有一個(gè)Agent,它會(huì)自動(dòng)去處理,修復(fù)這個(gè)bug,然后我回來檢查修復(fù)情況。
它會(huì)找到正確的文件,嘗試重現(xiàn)bug,修復(fù)它,然后驗(yàn)證它是否正確。這可能是一個(gè)需要很長時(shí)間的過程。所以我覺得我會(huì)很喜歡這樣。而且我覺得在編程中,經(jīng)常有人認(rèn)為Agent會(huì)取代所有的編程工作。我不認(rèn)為我們這么認(rèn)為,因?yàn)楹芏嗑幊坦ぷ,很多價(jià)值在于迭代,或者說你其實(shí)不想一開始就明確指定什么,因?yàn)槟阏娴牟恢滥阆胍裁,直到你看到了初始版本,然后你想在此基礎(chǔ)上進(jìn)行迭代,然后提供更多的信息。
所以在很多編程工作中,我認(rèn)為你實(shí)際上想要的是一個(gè)即時(shí)的系統(tǒng),它能立即給你一個(gè)初始版本,然后你可以非?焖俚剡M(jìn)行迭代。
Lex:比如最近推出的ReplicaAgent,它可以設(shè)置開發(fā)環(huán)境,解決軟件包問題,配置一切,包括配置數(shù)據(jù)庫和部署應(yīng)用。這也是你夢想中的一部分嗎?
Arvid:我覺得是的,對于某些類型的編程工作,這真的很酷。
Lex:這在Cursor的范圍內(nèi)嗎?
Arvid:是的,我們目前并沒有積極地在做這件事,但可以肯定的是我們想讓程序員的生活更輕松、更有趣,有些事情真的很乏味,你需要經(jīng)過一系列步驟,你想把這些事情交給Agent去做。然后有些事情,你可以讓一個(gè)Agent在后臺(tái)工作,同時(shí)你也在工作。比如說,你有一個(gè)同時(shí)涉及后端和前端的PR(Pull Request),你在前端工作,然后你可以讓一個(gè)后臺(tái)Agent去處理后端部分,當(dāng)你開始處理后端部分的PR時(shí),你就已經(jīng)有了一些初始代碼可以迭代了。所以這也會(huì)很酷。
十、影子工作區(qū),在后臺(tái)運(yùn)行代碼
Arvid:首先,我們要明確的是,我們希望在后臺(tái)進(jìn)行大量的操作,并且我們正在嘗試很多內(nèi)容。目前,除了緩存預(yù)熱或找出命令鍵提示所需的正確上下文之外,我們并沒有太多其他后臺(tái)操作。但我們的想法是,如果能真的在后臺(tái)進(jìn)行計(jì)算,那么就可以幫助你預(yù)測更長時(shí)間范圍內(nèi)的操作,而不僅僅是預(yù)測你接下來要寫的幾行代碼。
而是預(yù)測在接下來的10分鐘里,你可能會(huì)做什么。通過在后臺(tái)進(jìn)行計(jì)算,我們可以花更多的計(jì)算資源來做這件事。所以我們實(shí)施的影子工作區(qū)(Shadow Workspace)的概念,并在內(nèi)部進(jìn)行實(shí)驗(yàn),是為了真正利用后臺(tái)計(jì)算的優(yōu)勢,我們需要給模型提供某種反饋信號(hào),不然可以通過讓模型思考更長時(shí)間來獲得更高的性能,比如o1就是一個(gè)很好的例子。
但另一種提高性能的方法是讓模型進(jìn)行迭代并獲得反潰對于程序員來說,一個(gè)非常重要的反饋來源是語言服務(wù)器。它存在于大多數(shù)不同的語言中,并且每種語言都有一個(gè)單獨(dú)的語言服務(wù)器。它可以告訴你“你在這里使用了錯(cuò)誤的類型”,并給出錯(cuò)誤提示,或者它還可以跳轉(zhuǎn)到定義,并理解你的代碼結(jié)構(gòu)。TypeScript語言服務(wù)器是由TypeScript團(tuán)隊(duì)開發(fā)的,Rust語言服務(wù)器是由Rust團(tuán)隊(duì)開發(fā)的,它們都通過語言服務(wù)器協(xié)議與VS Code進(jìn)行交互。這樣,VS Code就不需要內(nèi)置所有不同的語言,而是可以使用現(xiàn)有的編譯器基礎(chǔ)結(jié)構(gòu)。
這是為了代碼檢查、跳轉(zhuǎn)到定義以及查看你正在使用的正確類型。當(dāng)你在處理一個(gè)大型項(xiàng)目時(shí),類型檢查和引用查找功能都是必不可少的。如果沒有這些功能,就很難在大型項(xiàng)目中編寫代碼。
Lex:在Cursor中是如何使用語言服務(wù)器協(xié)議進(jìn)行通信的嗎?
Arvid:在Cursor中,我們使用語言服務(wù)器協(xié)議向程序員展示信息,就像在VS Code中一樣,但我們的想法是,我們還想將這些信息展示給智能模型,并且我們想在不影響用戶的情況下做到這一點(diǎn),也就是說,我們想在后臺(tái)進(jìn)行這些操作。
影子工作區(qū)的想法是,我們可以創(chuàng)建一個(gè)隱藏的Cursor窗口這樣你就可以在它里面設(shè)置這個(gè)標(biāo)志,然后把它隱藏起來。雖然你看不到它,但它確實(shí)存在。在這個(gè)窗口中,AIAgent可以隨意修改代碼,只要它們不保存修改,因?yàn)檫@仍然是同一個(gè)文件夾。然后,它們可以從linters(代碼檢查工具)中獲得反饋,跳轉(zhuǎn)到定義,并對代碼進(jìn)行迭代。
這是我們最終想要實(shí)現(xiàn)的目標(biāo),也是我們博客文章主要討論的內(nèi)容,因?yàn)閷?shí)現(xiàn)這一點(diǎn)有點(diǎn)棘手。我們希望它在用戶的機(jī)器上運(yùn)行,以便完全模擬用戶的環(huán)境。在Linux上,我們可以做一些很酷的事情,比如鏡像文件系統(tǒng),并讓AI在文件級(jí)別上進(jìn)行操作,但實(shí)際上,這些操作是存儲(chǔ)在內(nèi)存中的。我們可以創(chuàng)建一個(gè)類似于內(nèi)核的擴(kuò)展來實(shí)現(xiàn)這一點(diǎn)。而在Mac和Windows上,這有點(diǎn)難,但這是一個(gè)有趣的技術(shù)問題,所以我們在進(jìn)行這項(xiàng)研究。
Aman:一個(gè)可能有些粗糙但很有趣的想法是,對保存操作進(jìn)行鎖定。這樣,你可以讓語言模型在保存到磁盤時(shí)鎖定,然后你就不必在保存到磁盤的文件的真實(shí)版本上操作,而是在操作影子工作區(qū)中的那些未保存的內(nèi)容。你仍然可以獲得錯(cuò)誤提示,并可以在其中編寫代碼。然后,當(dāng)你嘗試運(yùn)行代碼時(shí),會(huì)出現(xiàn)一個(gè)小警告,提示有鎖存在,這時(shí)你可以從語言服務(wù)器或影子工作區(qū)中釋放鎖,以便并發(fā)地執(zhí)行其他操作。
十一、模型查詢bug仍有困難,Open o1也不例外
Lex:允許模型修改文件是一個(gè)令人興奮的未來,雖然這聽起來也有些嚇人。設(shè)想AI agent可以自動(dòng)執(zhí)行一系列任務(wù),用戶第二天只需對結(jié)果進(jìn)行審查,AI就好像你的同事一樣。
Aman:我認(rèn)為,模型在可運(yùn)行性方面會(huì)有不同情況。執(zhí)行一些簡單任務(wù)時(shí),用戶可以在幾分鐘內(nèi)順利完成,在本地機(jī)器上運(yùn)行也是合理的。而執(zhí)行一些需要更長時(shí)間以及更大變動(dòng)的任務(wù)時(shí),則需要在遠(yuǎn)程的沙盒環(huán)境中完成。如何精準(zhǔn)將用戶環(huán)境重現(xiàn)在遠(yuǎn)程沙盒中,并能確保代碼運(yùn)行結(jié)果的一致性是極具挑戰(zhàn)的。
Sualeh:我很好奇,你們(用戶)想要什么樣的編碼agent?幫助你們找到漏洞?還是實(shí)現(xiàn)一些新的功能?
Lex:編碼方面,我認(rèn)為應(yīng)該去關(guān)注查找各種級(jí)別的bug,尤其是邏輯錯(cuò)誤,以及實(shí)現(xiàn)方向上的錯(cuò)誤。
Aman:這些模型在簡單地提示下并不善于尋找和發(fā)現(xiàn)錯(cuò)誤。它們的校準(zhǔn)非常差,即便是最聰明的模型o1也是如此。
Lex:您能解釋一下嗎?
Aman:我認(rèn)為這些模型都能夠很好地反映預(yù)訓(xùn)練數(shù)據(jù)的分布,隨著損失函數(shù)的降低,模型的泛化能力也在增強(qiáng)。但現(xiàn)在損失函數(shù)的降低已足夠多,以至于模型能夠?qū)崿F(xiàn)全面的泛化。我們主要在前沿領(lǐng)域使用模型,用它們進(jìn)行代碼生成并對問題進(jìn)行回答。在預(yù)訓(xùn)練階段,GitHub上的大量代碼,數(shù)量高達(dá)數(shù)萬億個(gè)token,Stack Overflow和GitHub Issues等平臺(tái)上也有大量問題和答案,都為任務(wù)提供了豐富的數(shù)據(jù)。
但當(dāng)你嘗試推動(dòng)其中一些在網(wǎng)絡(luò)上并不常見的事情時(shí),比如根據(jù)已有的編輯來預(yù)測下一個(gè)編輯的Cursor Tab目標(biāo),模型的脆弱性就會(huì)顯現(xiàn)出來。
另一個(gè)很好的例子是bug檢測,因?yàn)閷?shí)際上并沒有太多真實(shí)的檢測bug并提出修復(fù)建議的例子,所以模型在這方面會(huì)遇到很大的困難。
但我認(rèn)為,這同樣是一個(gè)模型遷移的問題,我們需要將其他模型遷移到Cursor Tab上,在將非常擅長代碼的通用模型遷移到bug檢測任務(wù)時(shí),效果應(yīng)該也不錯(cuò),只是需要我們稍做引導(dǎo)。
Sualeh:很明顯,我認(rèn)為模型非常了解代碼。當(dāng)它們在預(yù)訓(xùn)練過程中,或許已經(jīng)能夠粗略地察覺到代碼的問題所在。這是因?yàn)橛行┤艘呀?jīng)對這些錯(cuò)誤進(jìn)行了嚴(yán)格的校準(zhǔn)。
但當(dāng)用模型編程的時(shí)候,比如編寫數(shù)據(jù)庫,這是很龐大的數(shù)據(jù)信息,即便設(shè)置了很多嚴(yán)格的校準(zhǔn)程序,可能錯(cuò)誤也還是很難被修正。
十二、危險(xiǎn)代碼標(biāo)注存爭議,開發(fā)團(tuán)隊(duì)并不看好賞金制度
Lex:人類也很難判斷代碼的重要性。如果某行代碼可能造成嚴(yán)重后果,應(yīng)該添加“這行代碼是危險(xiǎn)的”這一注釋。
Arvid:全部大寫,重復(fù)十次
Lex:是的,即使是同一個(gè)人也可能會(huì)忘記單個(gè)代碼的危險(xiǎn)性。
Arvid:我認(rèn)為在一定程度上這也適用于今天的AI模型,如果你真的在每一行中都標(biāo)注dangerous,dangerment,dangerous的話,模型也會(huì)更加關(guān)注這些,并且更有可能在該區(qū)域發(fā)現(xiàn)錯(cuò)誤。
Lex:明確標(biāo)注代碼的潛在危害程度是一種良好的實(shí)踐。
Arvid:但這種做法存在爭議,例如Sualeh就不太喜歡。
Sualeh:雖然從美學(xué)角度來看我不喜歡這種做法,但它確實(shí)對模型和容易遺忘代碼危險(xiǎn)性的人們很有幫助,可以避免一些小的錯(cuò)誤導(dǎo)致嚴(yán)重的情況,例如服務(wù)器宕機(jī)。
Aman:即使是普通的文檔字符中,人們在修改代碼時(shí)也經(jīng)常會(huì)忽略,因此需要明確指出潛在風(fēng)險(xiǎn)。
Lex:人們在修改代碼時(shí)往往只考慮如何改進(jìn)功能,而忽略了潛在的風(fēng)險(xiǎn)。
Arvid:如果能夠?qū)λ写a進(jìn)行形式化驗(yàn)證,就可以確保不會(huì)引入bug。
Aman:這個(gè)設(shè)想中的未來具體會(huì)是什么樣子?
Arvid:我認(rèn)為人們可能不再需要編寫測試了,模型會(huì)根據(jù)代碼自動(dòng)生成規(guī)范,用戶只需審查規(guī)范。同時(shí),智能推理模型會(huì)計(jì)算出代碼是否符合規(guī)范。這種方式適用于大多數(shù)函數(shù)。
Michael:規(guī)范的生真的容易嗎?為軟件明確人類的意圖是具有難度的,畢竟有些想法很難指定,也很難證明它是否真的能夠符合你的想法去執(zhí)行。
Arvid:您認(rèn)為規(guī)范很難生成?
Michael:對于難以用規(guī)范語言描述的需求,形式驗(yàn)證并不可靠。
Arvid:即使有大量的規(guī)范文檔也難以達(dá)成?
Michael:規(guī)范可以取代單元測試。
Arvid:但規(guī)范語言可以不斷發(fā)展,以涵蓋更多需求。
Lex:這一設(shè)想是否適用于整個(gè)代碼庫,而不僅僅是單個(gè)函數(shù)?
Arvid:的確,對整個(gè)代碼庫進(jìn)行形式化驗(yàn)證更難,但這是值得追求的目標(biāo),并且從理論上是可行的。例如,最近有一些研究可以對硬件進(jìn)行形式化驗(yàn)證,包括C代碼、GCC編譯器和Verilog硬件描述語言。大型代碼庫也類似于多層系統(tǒng),如果可以分解并分別驗(yàn)證每個(gè)部分,那么形式化驗(yàn)證整個(gè)代碼庫應(yīng)該是可能的。不過,規(guī)范問題確實(shí)是個(gè)挑戰(zhàn)。
Aman:如何處理副作用和外部依賴?例如調(diào)用Stripe API?
Sualeh:Stripe為其API編寫了一個(gè)規(guī)范。
Aman:是否所有外部依賴都可以提供規(guī)范?例如,如果程序中使用了語言模型作為原語,如何將其納入形式化驗(yàn)證?
Arvid:這也是可能的。
Aman:如何證明語言模型效果?
Arvid:可以證明語言模型的對齊性,或者證明它能夠給出正確的答案。
Sualeh:這是最終的夢想。
Lex:如果這能夠?qū)崿F(xiàn),將有助于確保代碼的正確性和AI的安全性。
Lex:既然模型在bug查找方面存在困難,那么未來的希望在哪里?
Sualeh:希望模型首先能夠幫助發(fā)現(xiàn)一些簡單的bug,例如off-by-one錯(cuò)誤或注釋與代碼不一致的情況。最終,模型應(yīng)該能夠發(fā)現(xiàn)更復(fù)雜的bug。
Michael:強(qiáng)大的bug查找模型對于實(shí)現(xiàn)AI編程至關(guān)重要。如果AI能夠自動(dòng)生成代碼,那么也需要能夠驗(yàn)證代碼的正確性。這不僅是為了幫助人類程序員,也是為了驗(yàn)證AI生成的代碼。
Arvid:是的,但實(shí)際上是怎么做到的呢?有一個(gè)流行的想法是這樣的,引入bug比找到bug更容易,因此可以訓(xùn)練一個(gè)模型并引入一些錯(cuò)誤代碼,然后就可以訓(xùn)練一個(gè)反向錯(cuò)誤的模型,并用其中的合成數(shù)據(jù)去尋找錯(cuò)誤。這是一個(gè)不錯(cuò)的例子。
Michael:還可以利用大型模型和代碼之外的信息來輔助查找bug,例如通過代碼執(zhí)行軌跡和調(diào)試器信息。bug查找工具可能會(huì)有兩種不同的產(chǎn)品形態(tài),其一是在后臺(tái)運(yùn)行的快速模型,用于發(fā)現(xiàn)常見的bug。其二是用于解決特定bug的高計(jì)算量模型,用戶可以支付一定的費(fèi)用去使用。
Lex:是否考慮過用資金將這些整合起來?如果模型能夠找到bug或生成高質(zhì)量的代碼,我愿意付費(fèi)。前幾天,我用Cursor模型生成了三個(gè)完美的函數(shù),主要用于與YouTube API交互,為我提供多語言字幕更新功能。
API文檔不是很好,而且有代碼交叉現(xiàn)象,我用谷歌搜索得不到確切信息,只有一些令人困惑的內(nèi)容,而Cursor生成得則非常完美。我想,真希望能有一個(gè)“打賞”按鈕,寫著“5美元”既可以支持公司發(fā)展,也可以向模型發(fā)送積極反饋信號(hào)比如“Good Job”。在bug查找中,也可以引入類似的賞金機(jī)制。你們有考慮嗎?
Arvid:公司內(nèi)部對此存在爭議。我認(rèn)為在某種程度上,這取決于你對人性的信仰程度。我認(rèn)為,如果你不花任何錢就找到一個(gè)bug那非常棒。如果沒發(fā)現(xiàn)錯(cuò)誤,你就不用花錢,而如果你花錢并找到了一個(gè)bug,并且你要點(diǎn)擊的“接受”,那么它會(huì)顯示在括號(hào)中,比如1美元。
這會(huì)存在一種擔(dān)憂,比如,我們在計(jì)算中投入了很多,也許人們會(huì)復(fù)制粘貼代碼,或者付費(fèi)機(jī)制會(huì)影響用戶的體驗(yàn)。我認(rèn)為,可以考慮把付費(fèi)機(jī)制與產(chǎn)品進(jìn)行分離,如果用戶每月支付一定的費(fèi)用,就可以免費(fèi)獲得所有的功能。
Lex:可以添加一個(gè)“打賞”功能,而不是強(qiáng)制收費(fèi)。
Arvid:即使是打賞也涉及到金錢,可能會(huì)影響用戶體驗(yàn)。
Aman:用戶在分享模型時(shí),人們就已經(jīng)在表達(dá)對模型的認(rèn)可了。
Michael:如果能夠開發(fā)出一種技術(shù)手段來驗(yàn)證bug是否已被修復(fù),那么就可以不必依賴那些依賴于榮譽(yù)系統(tǒng)的賞金機(jī)制了。
十三、AWS基礎(chǔ)設(shè)施非?煽,出現(xiàn)問題的概率微乎其微
Lex:終端和代碼之間有多少交互?在終端中運(yùn)行代碼可以獲得多少信息?是否可以實(shí)現(xiàn)一個(gè)循環(huán),讓模型運(yùn)行代碼并建議如何對代碼進(jìn)行更改?目前代碼及其實(shí)際運(yùn)行是完全分離的嗎?目前,據(jù)我所知是可以在終端中使用“Ctrl+K”來輔助進(jìn)行代碼編寫。
Aman:可以在Check命令和Ctrl+K中使用終端上下文信息。但目前還沒有實(shí)現(xiàn)循環(huán)功能,不過這很有意義。關(guān)鍵問題在于,這個(gè)循環(huán)是在前臺(tái)進(jìn)行還是像之前那樣在后臺(tái)進(jìn)行。
Lex:后臺(tái)運(yùn)行的確很酷,因?yàn)樗梢灾С植煌姆绞竭\(yùn)行代碼。此外,還需要考慮數(shù)據(jù)庫方面的問題,例如如何防止模型修改數(shù)據(jù)庫。
Sualeh:有一個(gè)不錯(cuò)的解決方案。即正在開發(fā)一個(gè)新的API,我認(rèn)為PlanetScale和Turbopuffer數(shù)據(jù)庫都會(huì)支持這種功能。當(dāng)你正在開發(fā)一個(gè)功能并對數(shù)據(jù)庫進(jìn)行測試時(shí),實(shí)際上你并不想針對廣泛的數(shù)據(jù)庫進(jìn)行測試,你可以向數(shù)據(jù)庫添加一個(gè)分支,而不是去修改主數(shù)據(jù)庫。
這種技術(shù)的實(shí)現(xiàn)方式是為數(shù)據(jù)庫的預(yù)寫日志添加分支。數(shù)據(jù)庫公司需要不斷開發(fā)新功能,而分支功能可能成為未來的一個(gè)趨勢,AI agent也可以利用數(shù)據(jù)庫分支進(jìn)行測試。
Lex:在此可以對基礎(chǔ)設(shè)施相關(guān)信息提出一些問題,Cursor團(tuán)隊(duì)目前是主要使用AWS(亞馬遜云科技)嗎?在使用AWS的過程中,都遇到了什么挑戰(zhàn)?
Arvid:AWS非常出色,無論在何時(shí)使用它的產(chǎn)品總是能夠正常工作,雖然完成其設(shè)置過程可能超級(jí)麻煩。實(shí)話說,AWS確實(shí)值得信賴,如果出現(xiàn)問題,那很可能是你自己的問題。
十四、擴(kuò)展問題是公司發(fā)展難關(guān),隱私保護(hù)也亟待突破
Lex:Cursor作為一家初創(chuàng)公司,在發(fā)展中遇到了哪些挑戰(zhàn)?
Michael:隨著請求量級(jí)的不斷提升,緩存和數(shù)據(jù)庫等通用組件都會(huì)遇到瓶頸。例如,我們現(xiàn)在已經(jīng)遇到遇到了數(shù)據(jù)表溢出等問題。此外,我們構(gòu)建的一些定制系統(tǒng),例如用于代碼語義索引和問答的檢索系統(tǒng)回答有關(guān)代碼庫的一些問題,我也一直認(rèn)為這是比較棘手的擴(kuò)展問題之一。
Sualeh:我的超級(jí)高級(jí)工程師朋友們說,在擴(kuò)展過程中很難預(yù)測系統(tǒng)會(huì)在哪里崩潰。您可以提前嘗試預(yù)測,但是在添加這些額外的內(nèi)容時(shí),總會(huì)發(fā)生一些奇怪的事情。具體而言,Cursor將所有的代碼進(jìn)行分塊,然后發(fā)送代碼進(jìn)行嵌入,然后將嵌入代碼儲(chǔ)存在數(shù)據(jù)庫中,但實(shí)際上,并不儲(chǔ)存任何代碼。此后就是我們要確保不引入客戶端bug,因?yàn)槲覀儗@些bug非常嚴(yán)格,服務(wù)器上存儲(chǔ)了許多細(xì)節(jié),一切都是加密的。
因此,技術(shù)挑戰(zhàn)之一就是如何確保本地代碼庫狀態(tài)與服務(wù)器端狀態(tài)保持一致。技術(shù)層面上來說,我們的做法是將對服務(wù)器端的哈希值進(jìn)行下載,并對比本地的哈希值,計(jì)算差額,來確定缺少的文件是什么。但這會(huì)增加網(wǎng)絡(luò)開銷。如果您使用了Cursor,沒有人希望有人一直對WiFi施加操作。
而且,這也會(huì)對數(shù)據(jù)庫造成巨大開銷。它將讀取數(shù)十TB的數(shù)據(jù)庫,每秒鐘接近20TB或者更大的數(shù)據(jù)庫。這太瘋狂。為此,我們采用了Merkle樹結(jié)構(gòu),只需要協(xié)調(diào)單個(gè)哈希,即項(xiàng)目的根節(jié)點(diǎn),去查看哈希值不匹配的子項(xiàng),并以此類推,可以極大地降低開銷。
但隨著使用人數(shù)的增多,代碼庫也變得格外龐大。最初,我們對暗代碼庫進(jìn)行了重新排列,但如今其規(guī)模已經(jīng)遠(yuǎn)不如一些擁有龐大文件的公司的規(guī)模了。建構(gòu)一個(gè)東西很簡單,但擴(kuò)展到更多人、更多公司,這是個(gè)難題。我們也在努力解決這些問題。
Aman:的確,索引系統(tǒng)有很多需要琢磨的東西。實(shí)際上嵌入代碼才是瓶頸。為了避免重復(fù)嵌入同樣的代碼塊,我們采用了一種緩存機(jī)制,即將代碼塊的哈希值與對應(yīng)的向量緩存起來,這會(huì)使得一些公司,在使用Cursor時(shí),代碼嵌入的速度會(huì)大大提升,用戶不需要儲(chǔ)存代碼數(shù)據(jù),只存儲(chǔ)向量數(shù)即可。
Lex:目前,您認(rèn)為代碼庫索引帶來的最大收益是什么?短期來看,代碼庫有什么用呢?
Arvid:最明顯的一點(diǎn)是,當(dāng)你想找出大型代碼庫中特定的一些東西時(shí),你可以通過模糊性的提問來進(jìn)行搜索。比如“我想找到執(zhí)行X功能的地方。”但是你并不知道在文本搜索中要輸出什么語言。你只需要請求聊天,按照enter命令來詢問代碼庫進(jìn)行聊天。很多時(shí)候,模型通常都能夠給你提供正確位置。
Lex:為什么Cursor不考慮在本地進(jìn)行代碼嵌入等操作?
Arvid:我們也考慮過這種方案,但實(shí)現(xiàn)起來很困難。一些用戶使用的是最新的MacBook Pro,但超過80%的用戶用的是Windows機(jī)器,其中許多機(jī)器功能并不是非常強(qiáng)大,實(shí)際上,本地模型實(shí)際僅適用于最新的計(jì)算機(jī),并且構(gòu)建過程也會(huì)出現(xiàn)很大的開銷。因此,即使我們向這樣做,但也還是很難做得到。
Aman:是的,龐大的數(shù)據(jù)庫只會(huì)消耗大量的內(nèi)存與CPU。此外,正如Arvid所說的那樣,本地模型建設(shè)存在著巨大阻力,其中似乎都在朝著MOE架構(gòu)發(fā)展,雖然MOE模型對內(nèi)存帶寬的要求更高,并且有利于本地運(yùn)行,但整體模型的規(guī)模也會(huì)變得更大,需要更多臺(tái)機(jī)器才能運(yùn)行。我認(rèn)為,對于編碼生成而言,用戶希望能夠用到最好、最聰明、最有能力的模型,但在本地實(shí)現(xiàn)卻很困難。
Arvid:實(shí)際上我很喜歡本地模式的替代方案。我認(rèn)為,它仍然處于研究階段,可以把它想象成,為語言模型推理進(jìn)行同態(tài)加密。用戶可以在本地加密輸入的數(shù)據(jù),然后發(fā)送給服務(wù)器進(jìn)行推理。服務(wù)器可以可以對加密數(shù)據(jù)進(jìn)行處理,但無法讀取數(shù)據(jù)的具體內(nèi)容,此后服務(wù)器會(huì)把答案發(fā)回給用戶并進(jìn)行加密處理,用戶只能通過解密查看返還的內(nèi)容。目前同態(tài)加密的成本依然很大,如果能夠降低成本,我相信這會(huì)非常值得期待。
世界上有越來越多的信息和數(shù)據(jù)將流經(jīng)兩個(gè)中心化的參與者,但這會(huì)有些令人擔(dān)憂,比如傳統(tǒng)黑客的入侵,這是非?膳碌摹S脩艨赡軙(huì)被黑客監(jiān)控。人們努力防止不良入侵者使用AI模型,繼而引入一些監(jiān)控機(jī)制,但這些監(jiān)控機(jī)制又可能被濫用,比如用戶的數(shù)據(jù)可能會(huì)被監(jiān)控。所以我們希望,我們可以解決同態(tài)加密問題。
Lex:我想說,這是所有軟件都面臨的挑戰(zhàn)。就像云可以提供很多便利的功能,人們就越來越依賴它,但是它也存在缺點(diǎn),這就是為什么需要依靠強(qiáng)大的安全措施來抵御一些攻擊。但是也又一些具有影響力的公司控制著這些數(shù)據(jù),這就是我們存在著的現(xiàn)實(shí)生活。
Sualeh:是的,我非常擔(dān)心。例如Anthropic公司有這種負(fù)責(zé)任的擴(kuò)展政策,其中我們是低級(jí)別的,當(dāng)我們進(jìn)入高級(jí)別時(shí),任何模型都會(huì)出于合理的安全原因,都會(huì)希望對監(jiān)控有所提示。我認(rèn)為這是合理的,但也存在一些弊端,如果所有信息都被見監(jiān)控,那會(huì)非?膳。
Aman:您認(rèn)為它(AI模型監(jiān)控)與云服務(wù)供應(yīng)商有何不同?
Arvid:我認(rèn)為很多數(shù)據(jù)一開始并不會(huì)流向云供應(yīng)商,而通常你會(huì)把更多的數(shù)據(jù)提供給AI。一開始用戶并不會(huì)把自己的數(shù)據(jù)都放在網(wǎng)絡(luò)上,給那些公司或者模型。但現(xiàn)在AI模型的監(jiān)控更加集中,云服務(wù)中的用戶都可以使用加密密鑰,而AWS對此卻無能為力,但在這里只有中心化AI模型提供商才能夠看到確切的文本內(nèi)容。
十五、關(guān)于上下文訓(xùn)練中關(guān)于上下文和模型訓(xùn)練的探討
Lex:在使用Cursor時(shí)遇到的一個(gè)問題,當(dāng)我在Python中寫代碼的時(shí)候,會(huì)導(dǎo)入一些內(nèi)容,模型怎么知道我想在上下文中提到哪些內(nèi)容,弄清楚這一點(diǎn)有多困難?
Michael:我認(rèn)為我們將來可以在自動(dòng)計(jì)算上下文方面做的更好。需要注意的是,包含自動(dòng)上下文需要權(quán)衡取舍。因此,你為這些模型包含的上下文愈多,其速度就越慢,這些請求的成本的就越高,這意味著,你可以調(diào)用的模型就會(huì)越來越少。此外,對于這類模型來說,如果提示中包含了太多信息,它們會(huì)覺得困惑。因此,在上下文中呈現(xiàn)出的信息準(zhǔn)確性和相關(guān)性的標(biāo)準(zhǔn)要十分高,我們也希望能夠做得更好。
我們在內(nèi)部也嘗試過一些改進(jìn)措施,但目前該領(lǐng)域還存在一些問題。讓語言模型真正達(dá)到理解新信息語料庫?上下文窗口能否無限擴(kuò)展?模型能夠真正做到關(guān)注無限的上下文嗎?能夠?qū)@些上下文進(jìn)行緩存而不必重復(fù)計(jì)算嗎?還有很多想法都在嘗試中,這些想法類似于在模型權(quán)重學(xué)習(xí)過程中進(jìn)行微調(diào)。同時(shí)作為一家公司,我們很高興可以擁有更好的檢索系統(tǒng),也希望可以做的更好。
Aman:一個(gè)有趣證明是VSCode(跨平臺(tái)源代碼編輯器)。
我們處于一個(gè)分叉節(jié)點(diǎn)。VS Code的代碼是開源的,大型語言模型在預(yù)訓(xùn)練過程中已經(jīng)見過這些代碼,并且經(jīng)過微調(diào)和RLHF(人類反饋)訓(xùn)練,能夠回答與代碼相關(guān)的問題。因此,當(dāng)用戶詢問關(guān)于VS Code的問題時(shí),模型有時(shí)能夠給出正確的答案,盡管有時(shí)也會(huì)出現(xiàn)誤差。如果能夠訓(xùn)練一個(gè)專門的模型并成立一個(gè)理解這些問題的代碼庫,這會(huì)很有研究價(jià)值。
另外,我們對于一個(gè)開放性的研究問題充滿興趣,同時(shí)也存在著不確定性,即用戶是希望模型在前端執(zhí)行完所有任務(wù),還是將檢索與代碼生成進(jìn)行分離?未來的幾個(gè)月,可能會(huì)出現(xiàn)一些真正有能力的模型,此后用戶可以單獨(dú)訓(xùn)練一個(gè)非常優(yōu)秀的開源模型并將其作為檢索器,在上下文中為這些更大的模型提供信息。
Lex:如何針對特定代碼庫進(jìn)行模型訓(xùn)練?
Aman:有很多方法可以嘗試,需要通過嘗試確定效果。一件非常幼稚的事情,是嘗試復(fù)制VS Code和一些前沿模型做過的事情。所以我們應(yīng)該繼續(xù)進(jìn)行預(yù)訓(xùn)練。某種持續(xù)的預(yù)訓(xùn)練,在繼續(xù)預(yù)訓(xùn)練階段加入特定代碼庫的數(shù)據(jù),并在指令微調(diào)階段加入關(guān)于該代碼庫的問題。我們從指令微調(diào)開始,建立一個(gè)關(guān)于代碼的常規(guī)指令微調(diào)數(shù)據(jù)集,繼而拋出更多關(guān)于該存儲(chǔ)庫中的代碼問題。
你可以獲取更多難以獲得的真實(shí)據(jù),或者可以使用合成數(shù)據(jù)來執(zhí)行一些操作,讓模型對代碼各種新構(gòu)成部分提出問題。因此,獲取代碼片段,并讓模型對此提出問題,再將其添加到指令中對數(shù)據(jù)點(diǎn)進(jìn)行微調(diào),從理論上講,這一過程可能會(huì)解鎖模型理解該代碼庫問題的能力。
▲播客現(xiàn)場(來源:YouTube)
十六、與OpenAI o1競爭靠什么?
Lex:想問一些關(guān)于OpenAI o1的問題,您認(rèn)為測試計(jì)算系統(tǒng)在編程中的作用是什么?
Aman:我認(rèn)為測試時(shí)間計(jì)算非常有趣。因此,隨著數(shù)據(jù)量和模型大小的擴(kuò)張,預(yù)訓(xùn)練制度將使損失函數(shù)和下游任務(wù)中的表現(xiàn)越來越好。但是,我們正在面臨一些數(shù)據(jù)壁壘。這意味著,繼續(xù)擴(kuò)大數(shù)據(jù)規(guī)模變得更加困難。
因此,擴(kuò)大測試時(shí)間計(jì)算是一種有趣的方法,如果現(xiàn)在增加我們使用推理時(shí)間的flop計(jì)算數(shù)量,使用Infer Time時(shí),這些模型總是會(huì)有更多的flop,但現(xiàn)在,我們也許可以使用相同大小的模型并運(yùn)行更長時(shí)間,并獲得與更大模型規(guī)模相當(dāng)?shù)幕貓?bào)。
某些查詢可能需要100萬億參數(shù)規(guī)模的模型才能處理,但這類查詢可能只占所有查詢的0.1%。在這種情況下,也許有些浪費(fèi)精力。而訓(xùn)練一個(gè)能夠處理99.9%查詢的模型,然后可以采用一種方法為那些真正想要更高智能查詢的人延長推理時(shí)間。
Lex:如何判斷哪些問題需要更高水平的智能?是否能夠動(dòng)態(tài)地在GPT-4與o1使用之間進(jìn)行切換?
Aman:確實(shí)這是一個(gè)問題,也沒有人真正很好地解決它。團(tuán)隊(duì)在Cursor Tab功能中實(shí)現(xiàn)了簡單的模型路由,但在GPT-4和o1之間的切換還比較困難。另外,需要什么級(jí)別的AI來確定對于司機(jī)模型是否太難,可能需要o1模型,但這很難說得清楚。
此外,還需要考慮如何判斷某個(gè)問題對GPT-4來說是否過難,這可能需要o1級(jí)別的模型才能判斷。
測試時(shí)間計(jì)算需要一個(gè)完整的訓(xùn)練策略才能正常執(zhí)行。此外,在大型實(shí)驗(yàn)室之外,可能只有OpenAI,但沒人知道它是如何工作的,有一些非常有趣的論文顯示了它們可能提供了怎樣的暗示。因此測試時(shí)計(jì)算可以歸類為后訓(xùn)練階段,但未來用于訓(xùn)練支持測試時(shí)計(jì)算的模型的算力可能會(huì)超過預(yù)訓(xùn)練階段。
Lex:如果要構(gòu)建一個(gè)與o1競爭的模型,應(yīng)該怎么做?
Aman:也許我們可以訓(xùn)練一個(gè)流程獎(jiǎng)勵(lì)模型。其中有結(jié)果獎(jiǎng)勵(lì)模型和過程獎(jiǎng)勵(lì)模型的區(qū)分,結(jié)果獎(jiǎng)勵(lì)模型是人們接受語言建模訓(xùn)練的傳統(tǒng)獎(jiǎng)勵(lì)模型,它更重視最終結(jié)果。過程獎(jiǎng)勵(lì)模型則需要對思維鏈進(jìn)行層層劃分。OpenAI去年發(fā)表了一篇關(guān)于過程獎(jiǎng)勵(lì)模型的論文,他們使用人工標(biāo)注的數(shù)據(jù)集訓(xùn)練了一個(gè)過程獎(jiǎng)勵(lì)模型。
目前,過程獎(jiǎng)勵(lì)模型主要用于從多個(gè)模型輸出中選擇最佳答案,但還看不出什么特別優(yōu)秀的地方。眾多的學(xué)術(shù)成果中,人們要做的是從語言模型中抽取一些輸出數(shù)據(jù),然后使用過程獎(jiǎng)勵(lì)模型對這些進(jìn)行賦分,繼而選出最佳答案。未來,人們就是使用流程獎(jiǎng)勵(lì)模型及其樹狀結(jié)構(gòu),探索思維鏈的多個(gè)分支,繼而評估分支的質(zhì)量。
Lex:當(dāng)分支質(zhì)量與結(jié)果質(zhì)量密切相關(guān)時(shí),就能夠幫助模型選擇用哪個(gè)分支更好?
Aman:是的,我認(rèn)為也許人們討論開源模型訓(xùn)練流程獎(jiǎng)勵(lì)模型時(shí),采用的是更自動(dòng)化的方式。但目前我并未看到任何東西能夠創(chuàng)造性地使用流程獎(jiǎng)勵(lì)模型來進(jìn)行樹狀結(jié)構(gòu)搜索和編碼。
Lex:有一個(gè)AI安全問題,它更像是哲學(xué)問題。OpenAI曾說,他們向用戶隱藏了思維鏈,這是個(gè)艱難的決定,他們會(huì)在后臺(tái)對思維鏈進(jìn)行監(jiān)控,以此確保模型不會(huì)試圖對用戶產(chǎn)生干擾,這確實(shí)令人震撼。但你們對于隱藏思維鏈這件事有何看法呢?
Michael:我推測,OpenAI可能是為了防止別人從他們的模型中竊取他們的技術(shù)。如果你能夠詳細(xì)看到思維鏈的每個(gè)步驟,那這個(gè)技術(shù)就更容易被獲齲
Lex:所以你也可以用這個(gè)來訓(xùn)練嗎?
Michael:可能大語言模型供應(yīng)商之間會(huì)存在這樣的情況,其中一切API曾經(jīng)提供了他們的所有記錄概率的訪問權(quán)限,但后來又取消了。其中的原因可能就在于,那些訪問了記錄概率的人,可以竊取到模型的技術(shù)信息。
同時(shí)我們也集成o1到Cursor之中,對于o1我們也有濃厚的興趣,并且我覺得很多程序員也都對此充滿期待。但無論如何,o1都不是Cursor默認(rèn)體驗(yàn)的一部分,目前我們還沒有找到將其集成到編輯器中的有效方式。所以我認(rèn)為,如何和使用這個(gè)模型(o1),還是個(gè)未知數(shù)。
Sualeh:我們有一些美好想法,但需要找在發(fā)布之前獲得一些適用的場景。
Aman:o1模型還存在很多限制,比如不支持流式輸出,這意味著用戶無法對輸出過程進(jìn)行監(jiān)督,只能等待文本的出現(xiàn)。另外,它技術(shù)發(fā)展還處于早期階段,有很多需要改進(jìn)的地方,未來會(huì)在增加預(yù)訓(xùn)練數(shù)據(jù)量,擴(kuò)大模型體量的同時(shí),讓搜索工作也變得越來越好。
Lex:GitHub Copilot似乎正在以某種方式集成o1模型,有人認(rèn)為這意味著Cursor要完了?
Michael:我認(rèn)為這個(gè)領(lǐng)域與2010年代的軟件領(lǐng)域有所不同,此處天花板真的非常非常高,所以我認(rèn)為,三到四年內(nèi)最好的產(chǎn)品很快就會(huì)比今天最好的產(chǎn)品更優(yōu)秀。我認(rèn)為即便擁有一個(gè)很好的品牌,但不去創(chuàng)新未來還是會(huì)失敗。接下來幾年我認(rèn)為,關(guān)鍵在于建構(gòu)最好的產(chǎn)品與系統(tǒng),這需要?dú)w結(jié)于建模引擎與編輯體驗(yàn)。
Aman:是的,我認(rèn)為Cursor的優(yōu)勢在于其不僅僅是快速集成新模型就像o1那樣,同時(shí)它也是深度定制的模型,并且很重視用戶體驗(yàn)。
十七、詳刨三類合成數(shù)據(jù)分類法
Lex:您能解釋一下,合成數(shù)據(jù)分類法是什么嗎?
Aman:合成數(shù)據(jù)是可以從AI中獲得的一些數(shù)據(jù),我認(rèn)為合成數(shù)據(jù)主要有三種。第一類是蒸餾,包括語言模型、輸出token或token的概率分布,可以用來訓(xùn)練能力較弱的模型。這種方法無法生成比原始模型更強(qiáng)大的模型,但可以將昂貴的高延遲模型的能力提取到較小或執(zhí)行特定任務(wù)的模型中。
第二類是合成數(shù)據(jù)利用了某些問題中一個(gè)方向比另一個(gè)方向更容易的特點(diǎn)。例如,在bug檢測問題中,引入bug比檢測bug更容易。我們需要做的是,在一個(gè)未經(jīng)充分訓(xùn)練的模型中引入一些bug,然后用這些合成數(shù)據(jù)訓(xùn)練一個(gè)擅長檢測bug的模型。
最后一類,是使用語言模型生成可以輕松驗(yàn)證的文本。比如,想對系統(tǒng)進(jìn)行驗(yàn)證,檢測語言是否能夠達(dá)到莎士比亞的水平,你可以讓猴子或者打字機(jī)去打字,最終就能夠獲得充分的訓(xùn)練數(shù)據(jù)來培養(yǎng)一個(gè)莎士比亞級(jí)別的語言模型。
對于具體的引導(dǎo)代碼的代碼,可以通過測試結(jié)果來判斷這個(gè)測試代碼是否合格,我們也可以使用模型生成、通過測試的代碼來對模型進(jìn)行訓(xùn)練。但我認(rèn)為這種方法很難產(chǎn)生實(shí)際效用,在開放式任務(wù)或者復(fù)雜任務(wù)中,很難找到完美的驗(yàn)證器。
十八、人類反饋聯(lián)動(dòng)AI反饋,共同提升模型訓(xùn)練效果
Lex:人類反饋的強(qiáng)化學(xué)習(xí)(RLHF)和AI反饋的強(qiáng)化學(xué)習(xí)(RLAIF)相比而言如何?對AI模型性能提升都有什么作用?
Aman:RLHF是根據(jù)人類反饋信息來進(jìn)行訓(xùn)練的,我認(rèn)為,如果能夠?yàn)閷W⒌娜蝿?wù)提供充分的人類反饋那么效果會(huì)非常不錯(cuò)。
RLAIF則比較有趣,它根據(jù)約束條件執(zhí)行工作,比如使用語言模型來驗(yàn)證解決方案比生成一個(gè)解決方案要容易,它更容易奏效,因?yàn)镽LAIF可以實(shí)現(xiàn)一種遞歸循環(huán)。
我們可以將二者進(jìn)行結(jié)合,在兩者之間選擇一個(gè)平衡點(diǎn),比如在模型生成的正確代碼中,加入少量的人工反饋,大概50-100個(gè)示例,就能夠讓模型的先驗(yàn)內(nèi)容與我們的構(gòu)想實(shí)現(xiàn)一致。
這看起來與普通的RLHF不同,普通的RLHF通常需要大量的示例對獎(jiǎng)勵(lì)模型進(jìn)行訓(xùn)練。
十九、AI會(huì)在實(shí)現(xiàn)AGI前獲菲爾茨獎(jiǎng)?
Lex:根據(jù)你的直覺,生成與驗(yàn)證或者生成與排序哪個(gè)更容易呢?
Aman:根據(jù)直覺而言…可能是這樣的…既定情況下驗(yàn)證更容易,而非找到證明。
Sualeh:AI獲得菲爾茲獎(jiǎng)的可能性有多大?
Sualeh和Arvid:AI更容易獲得菲爾茨獎(jiǎng)。
Aman:雖然AI已經(jīng)解決了許多難題,但現(xiàn)在還不確定定理證明領(lǐng)域中AI效用如何。其次,對于我們距離解決這些非常非常難的開放性問題還有多遠(yuǎn),我的直覺也不那么準(zhǔn)確了。
Lex:你認(rèn)為AI會(huì)先獲得菲爾茲獎(jiǎng)嗎?而不是物理學(xué)或其他的什么。
Sualeh:我認(rèn)為百分之一百是會(huì)獲得菲爾茨獎(jiǎng)的。我覺得,一些奧數(shù)難題,比如伯奇和斯溫納頓-戴德(Birch and Swinnerton-Dyer conjecture)猜想對于AI而言還是非常難的,現(xiàn)在還并不知道如何去解決這些問題。
Aman:AI可能會(huì)在實(shí)現(xiàn)AGI之前就獲得菲爾茨獎(jiǎng)。
Sualeh:如果能獲得,我會(huì)非常開心的,我覺得,可能在2028或者2030年就會(huì)實(shí)現(xiàn)吧。
二十、談縮放規(guī)律的未來,“模型越大越好”觀念已失效
Lex:談到縮放規(guī)律(scaling laws)的話題,大家可以就此談一下自己看法,對于現(xiàn)狀以及未來的發(fā)展有何看法?
Aman:最初OpenAI關(guān)于縮放規(guī)律的論文存在一些錯(cuò)誤。他們提到了關(guān)于優(yōu)化學(xué)習(xí)效率的問題。后來,Chinchilla的論文提到了一個(gè)更準(zhǔn)確的版本。自那時(shí)起,人們開始不再專注于計(jì)算優(yōu)化,而是更加關(guān)注在有限的推理預(yù)算下獲得更優(yōu)異的效果。
Aman:我認(rèn)為,這些縮放規(guī)律曲線的維度遠(yuǎn)比我們最初僅用于計(jì)算參數(shù)數(shù)量和數(shù)據(jù)的維度要豐富得多。比如,推理計(jì)算就是一個(gè)顯而易見的維度。我認(rèn)為,上下文長度是另一個(gè)明顯的維度。假設(shè)我們關(guān)注推理計(jì)算和上下文窗口這兩個(gè)方面,也許我們想要訓(xùn)練的是某種狀態(tài)空間模型(SSM)。
它們在處理超長上下文時(shí),成本要低得多,速度也要快得多。即使訓(xùn)練時(shí)的擴(kuò)展屬性可能需要10倍的計(jì)算量,也就是說,需要花費(fèi)10倍的計(jì)算資源來訓(xùn)練模型,以達(dá)到相同的能力水平,但這也是值得的。因?yàn)槲覀冏铌P(guān)心的是超長上下文窗口下的推理成本預(yù)算。因此,人們未來將會(huì)這些維度上進(jìn)行探索。
Lex:你覺得大家是否還在相信“越大越好”這一理念?
Aman:對于原始性能和原始AI來說,更大的模型肯定更好。我認(rèn)為,人們還是會(huì)更看好蒸餾技術(shù)。如果我們投入大量、大量的資金進(jìn)行訓(xùn)練,以獲得最具性價(jià)比的模型,那么我們可以調(diào)整多少個(gè)參數(shù)呢?
這一點(diǎn)確實(shí)值得關(guān)注。因?yàn)閮H僅在推理時(shí)間上盡可能多地投入計(jì)算,這種天真的做法,人們已經(jīng)在Llama模型上嘗試過了;蛘,僅僅是對7B(70億參數(shù))模型進(jìn)行過度訓(xùn)練,使用的token數(shù)量也遠(yuǎn)遠(yuǎn)超過了最優(yōu)需求。
但是,如果你真的在意這件事,也許我們可以像Gamma所做的那樣,不僅僅是在token上進(jìn)行訓(xùn)練,而是實(shí)實(shí)在在地通過最小化與Gemma 27B分布的KL散度來進(jìn)行訓(xùn)練,這就涉及到了知識(shí)蒸餾。實(shí)際上是在所有這些token上,花費(fèi)計(jì)算資源來訓(xùn)練這個(gè)擁有270億參數(shù)的模型,然后將其中的內(nèi)容蒸餾到一個(gè)更小的模型中。
Lex:蒸餾只給你一個(gè)更快的模型,越小意味著越快?
Aman:我認(rèn)為,蒸餾在理論上是從你正在訓(xùn)練的數(shù)據(jù)中提取更多的信號(hào)。這可能是另一種方法,不是完全克服數(shù)據(jù)墻,而是部分地幫助我們克服數(shù)據(jù)墻。可以訓(xùn)練的數(shù)據(jù)有限,讓我們用所有這些token來訓(xùn)練這個(gè)非常大的模型,然后我們將它蒸餾成這個(gè)較小的模型。相比于我們自己去訓(xùn)練模型,蒸餾能夠讓模型獲得更多的信號(hào)。
Lex:如果給你們10萬億美元的預(yù)算,你們會(huì)如何做?
Aman:我認(rèn)為有很多關(guān)于訓(xùn)練這些大型模型的秘密和細(xì)節(jié),只有大型實(shí)驗(yàn)室才知道。即使我努力去做,也會(huì)浪費(fèi)很多錢。
Lex:假設(shè)獲得所有信息,包括訓(xùn)練參數(shù)以及方式方法,未來五年中你會(huì)如何投資才能使你們所說的原始AI實(shí)現(xiàn)最大化?
Sualeh:我覺得,答案很簡單。你只需盡可能地購買足夠多的計(jì)算機(jī),此后每一天所要做的就是購買GPU,研究人員就可以根據(jù)目標(biāo)來選擇去訓(xùn)練大模型還是小模型了。
Aman:這涉及到一個(gè)問題,我們是真的受到計(jì)算和金錢的限制,還是受到其他什么制約?
Sualeh:更多是受限于自身觀念吧,但也存在其他一些限制因素。
Lex:你們會(huì)選擇進(jìn)行大量的實(shí)驗(yàn)還是選擇使用這些計(jì)算資源來訓(xùn)練一個(gè)巨大的模型?
Arvid:可能會(huì)選擇通過實(shí)驗(yàn),我覺得現(xiàn)在我們?nèi)允芟抻谖覀兡壳八钟械挠^念。
Aman:我認(rèn)為是這樣的,因?yàn)榧幢銚碛辛耸澜缟纤械挠?jì)算能力和可收集的數(shù)據(jù),最終還是會(huì)受到限制,而且限制的不僅僅是想法,是受制于更卓越的工程技術(shù)。即便擁有世界上所有的資金,真正能在這里有所作為的人并不多。
研究工作中包含大量純粹的、極其艱難的工程技術(shù)工作。舉個(gè)例子來說,如果你看看原始的Transformer論文,將文獻(xiàn)中嵌入的許多非常有趣的概念融合在一起,而且還需要編碼,這些過程,都需要杰出的工程師來完成,就像GNOME Azure。
進(jìn)一步說,讓下一代模型進(jìn)行并行化工作,這需要龐大的工程量,我認(rèn)為要讓所有這些事情都奏效,需要投入大量的工程技術(shù)工作。比如,能夠?qū)⒐こ掏度氤杀窘档?0倍,讓那些擁有美好想法的人真地實(shí)現(xiàn)那些結(jié)構(gòu),提升40%到50%的GPU的利用率,那研究工作的效率可能會(huì)大幅提升。
Sualeh:如果能夠看到一個(gè)清晰的改進(jìn)路線,那么結(jié)果就會(huì)唾手可得。我認(rèn)為,可能OpenAI和其他一些實(shí)驗(yàn)室的做法是對的,它們抓住了這些成果。比如,GPT-4.25。現(xiàn)有方法是有效的,那就不需要考慮創(chuàng)新,只有當(dāng)現(xiàn)在遇到瓶頸時(shí),才需要?jiǎng)?chuàng)新。我認(rèn)為,如果擁有10萬億美元的預(yù)算,也許實(shí)際上會(huì)先去擴(kuò)大規(guī)模,然后再對自身的觀念進(jìn)行更新。
只要現(xiàn)有的方法有效,就沒有必要嘗試新的想法。只有當(dāng)現(xiàn)有方法遇到瓶頸時(shí),才需要新的想法。如果擁有10萬億美元的預(yù)算,那么可以先嘗試擴(kuò)大規(guī)模,然后重新評估想法。
Aman:我們都相信,去實(shí)現(xiàn)AGI需要全新的觀念。我們也相信,可以在更小的規(guī)模內(nèi)去測試一些新的觀念,而且我們有信心這會(huì)奏效。對于當(dāng)前的實(shí)驗(yàn)室而言,將有限的研究和開發(fā)人才投注到開發(fā)其他的新想法之中是十分困難的,畢竟現(xiàn)存方案在未來較長時(shí)間都有效。
二十一、談編程未來,仍需程序員領(lǐng)航
Lex:你們現(xiàn)在處于編程世界的中心。你們認(rèn)為編程,編程的本質(zhì)在未來幾個(gè)月,在未來幾年,甚至十年會(huì)發(fā)生什么變化?
Michael:我認(rèn)為,我們對未來充滿期待,因?yàn)槌绦騿T在很長一段時(shí)間內(nèi)都坐在“歷史的駕駛座”上。我們曾談到過這個(gè)問題,這需要程序員有著高效、代理能力與控制能力,他們可以修改任何你想修改的東西,并且對你構(gòu)建的內(nèi)容進(jìn)行快速迭代優(yōu)化。
此處,與“同計(jì)算機(jī)對話形的編程”有差別,與計(jì)算機(jī)對話,就好比你在Slack上與工程部門或工程師進(jìn)行交談一樣,輸入需求到一個(gè)獨(dú)立的文本框,AI就會(huì)自動(dòng)為你完成這些工作。但這也有些問題,首先會(huì)有延遲性,其次這也意味著放棄了一些控制力。
從根本上說,工程實(shí)際的執(zhí)行情況,是根據(jù)你構(gòu)建的細(xì)微決策來進(jìn)行的,其中人的關(guān)鍵作用是不能被AI取代的,要讓人類坐在“駕駛位”來掌舵。
而未來編程的情況,很可能是程序員可以控制代碼庫的抽象級(jí)別,可以通過觀察偽代碼的形式對代碼庫進(jìn)行編輯。而且程序員也可對編程軟件的邏輯進(jìn)行修改,保留其控制權(quán),這樣可以大幅度提升生產(chǎn)力。
但這只是一個(gè)模糊的想法,還需要很多細(xì)節(jié)需要解決,最終能否實(shí)現(xiàn)還有待觀察。但是人本身的控制力、效率以及以人為中心觀念是非常重要的。我們認(rèn)為,對于一些像Arvid之前提到一樣,某些編程,可以把它交給聊天機(jī)器人。但大多數(shù)編程任務(wù)仍需要人深度參與。
Lex:編程的基本技能是否會(huì)發(fā)生根本性的變化?
Michael:實(shí)際上,我認(rèn)為現(xiàn)在是開發(fā)軟件非常令人興奮的時(shí)刻。不管什么時(shí)候,很多代碼依然還是需要查閱很多難以理解的信息。但今天的編程比過去有趣多了,人們開始享受編程,F(xiàn)在的編程讓人具備快速構(gòu)建事物的能力,人們的控制力也被極大提升了。
對于那些編程人員來說,這也是個(gè)充滿意義的時(shí)期,人們的創(chuàng)意和趣味會(huì)被放大,如果你是程序員,那今天應(yīng)該更加注意這部分的特殊性。
Arvid:我也同意,最近我們正對代碼庫進(jìn)行一次比較大的遷移,將Node.js中的Async Local Storage替換為 Context對象。即使可以借助AI,這個(gè)工作也依然需要我與另一個(gè)工程師耗費(fèi)大概五天的時(shí)間。不過未來,我們可能只需要給AI展示幾個(gè)例子,然后這個(gè)遷移任務(wù),就可以在10分鐘內(nèi)完成。程序員可以借助AI更快的工作,而不需要在事先就考慮太多,而且任何事情,其實(shí)都可以先去嘗試新方法,嘗試的成本并不高。
Aman:我覺得在編程中有兩種方式,其一是努力思考,仔細(xì)尋找解決問題的最佳方法然后用有限時(shí)間來驗(yàn)證。其二是直接執(zhí)行代碼,看是如何執(zhí)行的并就此進(jìn)行更新。我也更認(rèn)同后一個(gè)方案。
Lex:那對于現(xiàn)在想要學(xué)習(xí)編程的人而言,你們有什么建議呢?應(yīng)該學(xué)習(xí)什么?比如Java亦或者PHP?
Aman:我認(rèn)為,每個(gè)人都有學(xué)習(xí)編程的自身原因。但我覺得,實(shí)際上那些真的熱愛編程的人,會(huì)是最好的程序員。在我們團(tuán)隊(duì)內(nèi)部,很多人在工作后依然會(huì)用Cursor編寫自己的編程,有的人甚至?xí)镜搅璩咳c(diǎn)去做這件事。當(dāng)他們難過的時(shí)候,還會(huì)說“我需要寫點(diǎn)代碼。”來寬慰自己。
這種對編碼的熱愛,驅(qū)使他們成為了最好的程序員,我也認(rèn)為這些人將會(huì)認(rèn)真投入到那些他們研究的事物之中。我認(rèn)為,未來的編程者們需要會(huì)更多地關(guān)注“你想要?jiǎng)?chuàng)造什么”。
Sualeh:程序員可以通過更豐富的方式表達(dá)自己的意圖。
結(jié)語:共建人機(jī)協(xié)同體系,改善程序員生活
Lex最后運(yùn)用Cursor團(tuán)隊(duì)的宣言為本次談話做出總結(jié),在《工程天才》中他們說“我們是一個(gè)應(yīng)用研究實(shí)驗(yàn)室,構(gòu)建不可思議的生產(chǎn)性人機(jī)協(xié)同系統(tǒng)。”
宣言中寫道:“首先,我們正在培養(yǎng)未來的工程師,即人類AI程序員這比任何一個(gè)工程師的效率都高出一個(gè)數(shù)量級(jí)。這種混合型工程師可以輕松地控制代碼庫,并且無需進(jìn)行低熵鍵盤操作。即使在最復(fù)雜的系統(tǒng)中,他們也會(huì)以判斷的速度迭代。通過結(jié)合AI和人類智慧,他們將比最好的純AI系統(tǒng)更聰明、更工程化。我們是一群研究人員和工程師。我們構(gòu)建軟件和模型,在有效性和可能性基礎(chǔ)上進(jìn)行發(fā)明。我們的工作已經(jīng)改善了成千上萬程序員的生活。”
Lex稱,在這個(gè)談話中,至少讓編程更有趣了。
來源:YouTube