我給大模型的描述是: 鄧明軒: 這個(gè)問(wèn)題實(shí)際上是對(duì)大型語(yǔ)言模型的 Prompt 描述,我認(rèn)為這也是當(dāng)前程序員需要學(xué)習(xí)的一項(xiàng)技能,你必須學(xué)會(huì)如何與大型語(yǔ)言模型進(jìn)行交互,你可以告訴它代碼塊是什么樣的,請(qǐng)它簡(jiǎn)化或轉(zhuǎn)化為一個(gè)類或打包到一個(gè)類中完成任務(wù)。因此,Prompt 是一項(xiàng)非常重要的技能,我提醒大家要去學(xué)習(xí),并在實(shí)際工作中不斷提升,這將決定了后續(xù)使用這種基于大型語(yǔ)言模型生成代碼工具的效率。Prompt 寫得越好,效率就會(huì)越高。 關(guān)于 Prompt,吳老師使用的是中文,我個(gè)人認(rèn)為,在當(dāng)前的環(huán)境中,如果你的英文水平能夠達(dá)到一定程度,最好開(kāi)始使用一些英文的 Prompt。我們必須面對(duì)這個(gè)現(xiàn)實(shí),即大型語(yǔ)言模型目前無(wú)論是國(guó)內(nèi)還是國(guó)外訓(xùn)練的,它從各種資源中獲取的數(shù)據(jù)更多是英文的,因此大型語(yǔ)言模型對(duì)于理解英文的偏好和能力要強(qiáng)得多。當(dāng)然,我們希望中文的表現(xiàn)越來(lái)越好,但這之前,我們應(yīng)盡量適應(yīng)這種工具的發(fā)展。 可能有人問(wèn):有了大語(yǔ)言模型,我們是否還需要學(xué)習(xí)英語(yǔ)?根據(jù)我的個(gè)人使用體驗(yàn),雖然目前大型語(yǔ)言模型在翻譯等方面的表現(xiàn)已經(jīng)相當(dāng)出色,但用英語(yǔ)直接與它進(jìn)行交互會(huì)有獲取更多信息的能力。因此,從短期來(lái)看,我仍然認(rèn)為學(xué)習(xí)英語(yǔ)會(huì)有所助益,盡管對(duì)許多程序員來(lái)說(shuō)英語(yǔ)一直是個(gè)難題。 就生成的這段代碼而言,總體結(jié)構(gòu)非常完整,代碼看起來(lái)幾乎可以運(yùn)行,但一些配置項(xiàng)可能需要進(jìn)一步編寫。此外,它提到了 SMTP。在很多年前分析 SMTP 協(xié)議時(shí),我們需要了解各種配置和端口等信息,如果現(xiàn)在要我突然寫這樣的代碼,可能要花很長(zhǎng)的時(shí)間去檢查各種細(xì)節(jié),不過(guò)有了這些工具就可以幫助生成相關(guān)代碼。 我之前與少杰討論過(guò)這個(gè)話題:如果你的基礎(chǔ)扎實(shí),能力為 2,那這個(gè)工具就是一個(gè)倍增器,可以增加 40 倍,變成 80;但如果你的能力只有 1,那么它只會(huì)增加 40。** 你的基礎(chǔ)能力在使用這個(gè)工具時(shí)會(huì)被放大。** 因此,我建議大家深入了解編程語(yǔ)言的本質(zhì)以及底層技術(shù)等知識(shí),你可能無(wú)需記住具體的字段或 main 結(jié)構(gòu),因?yàn)楝F(xiàn)在大型語(yǔ)言模型可以幫助生成。 彭靖田: 這個(gè)問(wèn)題,我從兩個(gè)角度來(lái)考慮。首先,大型模型有能力生成代碼,但最終這段代碼要能運(yùn)行才會(huì)成為有價(jià)值的交付物。因此,我們通常會(huì)將生成的代碼與開(kāi)發(fā)人員編寫的代碼進(jìn)行比較,包括代碼是否適合進(jìn)入生產(chǎn)環(huán)境。這其中的一個(gè)重要方面是 Prompt 的應(yīng)用,比如當(dāng)我們討論一段代碼是否適合在生產(chǎn)環(huán)境中使用時(shí),九要考慮我們的 Prompt 是否會(huì)檢查密碼以明文形式存儲(chǔ)。 現(xiàn)在,我們只進(jìn)行了一輪的對(duì)話和詢問(wèn),目前的輸出結(jié)果已經(jīng)足夠好,開(kāi)發(fā)人員能提供這樣的代碼也相當(dāng)不錯(cuò)了。但這段代碼要投入生產(chǎn)環(huán)境,通常第一反應(yīng)可能是是否需要一個(gè)配置管理器或?qū)⑴渲帽4鏋?YAML 文件?例如在端口號(hào)和配置項(xiàng)中出現(xiàn)的用戶名和密碼,生成的代碼將密碼作為明文字符串放置在代碼文件中,這不是一個(gè)很好的做法。這個(gè)問(wèn)題也在于在初始需求中沒(méi)有給大語(yǔ)言模型足夠詳細(xì)的信息,但通過(guò)進(jìn)行多輪對(duì)話,大型模型可以更好地解決。 關(guān)于一個(gè)優(yōu)秀的大型模型或使用大型模型生成良好代碼的最佳實(shí)踐,我認(rèn)為有兩個(gè)關(guān)鍵點(diǎn)需要注意。第一是描述清楚需求細(xì)節(jié),甚至可以將自己視為一名架構(gòu)師,將大模型想象為擁有不同背景(例如前端、后端腳本等)的員工,作為架構(gòu)師的你應(yīng)該如何提出需求?第二是要多輪問(wèn)詢、逐步完善。我做過(guò)一個(gè)小實(shí)驗(yàn),使用 GPT-4 完整地生成了一個(gè)開(kāi)源項(xiàng)目,目標(biāo)是進(jìn)行完整的雙語(yǔ)電子書(shū)翻譯。這個(gè)項(xiàng)目的整體代碼庫(kù)可能有幾千行,完全是由 GPT-4 生成的,但是經(jīng)過(guò)了許多輪的對(duì)話。 站在架構(gòu)師的角度,最初的問(wèn)題可能不是具體的 100 行代碼程序,而是讓大模型理解你如何設(shè)計(jì)這段代碼,例如需要分成哪幾個(gè)模塊、數(shù)據(jù)庫(kù)密碼檢查是否只需要一個(gè)簡(jiǎn)單的函數(shù)就夠了等,所有這些都可以通過(guò)架構(gòu)設(shè)計(jì)來(lái)完成??傊?,多輪對(duì)話、逐步完善并將自己視為架構(gòu)師,用這種自上而下的設(shè)計(jì)讓中間節(jié)點(diǎn)和葉子節(jié)點(diǎn)的代碼變得更加友好。 鄧明軒: 我完全同意彭老師提到的觀點(diǎn)。作為開(kāi)發(fā)者,我們應(yīng)該將自己視為架構(gòu)師來(lái)思考這個(gè)問(wèn)題。對(duì)于這些編程工具、AI 工具,我們可以稱之為 Copilot,輔助駕駛而非主駕駛。因此,我們真正使用的時(shí)候,不能期望只描述一個(gè)需求就可以迅速完成一個(gè)完整的軟件。相反,它為我們提供了代碼塊,我們有責(zé)任將這些組織起來(lái),包括項(xiàng)目的工程時(shí)間規(guī)劃、項(xiàng)目管理等,只有通過(guò)自己的思考,我們才能更好地利用這個(gè)“副駕駛”。我們不能把方向盤交給它,讓它代替我們駕駛,這是不合適的做法。 另外,彭老師提到我們的任務(wù)是檢查安全性,而在生成的代碼中又涉及密碼等敏感信息,這引發(fā)了一個(gè)問(wèn)題:當(dāng)前的語(yǔ)言模型是基于 Transformer 架構(gòu)的,而且大多數(shù)情況下是盲目生成的,它缺乏自省能力,如果直接向它提問(wèn),它會(huì)按照神經(jīng)網(wǎng)絡(luò)的方式逐字生成結(jié)果。因此,我們需要進(jìn)行多輪對(duì)話。也就是說(shuō),當(dāng)我向它提問(wèn)并生成了一段文本后,我可以將這段文本反饋給它,詢問(wèn)是否符合要求或者提出其他的要求。這些都是與大型語(yǔ)言模型進(jìn)行互動(dòng)的良好實(shí)踐。 Michael Yuan: 我很大程度上同意兩位老師的觀點(diǎn),這里只提出一點(diǎn):當(dāng)運(yùn)行一個(gè) Python 腳本時(shí),很可能是在本地環(huán)境下進(jìn)行分析,在這種情況下,使用明文密碼可能并不是一個(gè)問(wèn)題。 那么,這就涉及到 Prompt 工程師在做什么的問(wèn)題。Prompt 工程師是否會(huì)最終消失?我覺(jué)得不太可能,因?yàn)?Prompt 工程師是在應(yīng)對(duì)需求并解決需求,就和人與人之間的對(duì)話一樣,需要經(jīng)過(guò)多輪交流。 現(xiàn)在,我們公司里大約一半的開(kāi)發(fā)者都在使用 Copilot,每個(gè)人每月支付大約 10 美元,因?yàn)橛幸恍┏绦騿T非常依賴 Copilot。他們之前是這樣使用 Copilot 的:描述一個(gè)算法,然后讓它生成相應(yīng)的代碼,而并不是像今天這個(gè)案例一樣,已經(jīng)將業(yè)務(wù)需求分割好后再描述一個(gè)具體場(chǎng)景。比如我需要對(duì)一個(gè)向量進(jìn)行排序,這都是已知的算法,但我懶得找,所以讓 Copilot 來(lái)幫忙,我寫一個(gè)簡(jiǎn)短的提示,然后讓它生成代碼。這就是 Copilot 和 GPT-3 時(shí)代生成代碼的方法。 今天,我們生成代碼需要進(jìn)行多輪對(duì)話。ChatGPT 令人驚訝的地方在于能夠跟隨對(duì)話,我們可以繼續(xù)提問(wèn),可以在對(duì)話中指代之前提到的內(nèi)容,而它也能理解我在指代什么。當(dāng)我提供描述并生成代碼后,可以運(yùn)行該代碼并將結(jié)果反饋給它,告訴它哪里出錯(cuò)了,然后它可以繼續(xù)生成下一輪代碼,通過(guò)多次迭代,生成的代碼會(huì)越來(lái)越符合預(yù)期。 我認(rèn)識(shí)一個(gè) CTO,他有大約 10 年沒(méi)有寫過(guò)代碼了,最近他想要?jiǎng)?chuàng)建一個(gè) Discord 機(jī)器人,但對(duì)于如何使用 Python 處理他并不熟悉。于是,他向 ChatGPT 描述了想要實(shí)現(xiàn)的功能,然后 ChatGPT 生成了一段代碼。初次生成的代碼并不能正常工作,他就將錯(cuò)誤信息反饋給了模型,然后重新生成了一段代碼。經(jīng)過(guò)幾輪的交互,他花了大約半天的時(shí)間在一個(gè)不熟悉的領(lǐng)域中生成了大致能夠運(yùn)行的代碼。我覺(jué)得這展示了 ChatGPT 的能力,盡管并不能完全理解需求,但通過(guò)不斷交互就能夠逐漸實(shí)現(xiàn)想要的結(jié)果。 這并不是說(shuō)只需簡(jiǎn)單的描述,大語(yǔ)言模型就能完全理解。實(shí)際上很多時(shí)候,我們自己都并不清楚究竟想要什么,我們可能需要先看到一些代碼,然后逐漸明確自己的需求。這個(gè)過(guò)程可能需要花費(fèi)相當(dāng)長(zhǎng)的時(shí)間。盡管如此,我仍然覺(jué)得這是一項(xiàng)令人印象深刻的技術(shù)。 這也給編程工具的用戶界面帶來(lái)了很大的挑戰(zhàn)。Copilot 的使用非常簡(jiǎn)單,你只需在其中編寫注釋,然后讓它將注釋轉(zhuǎn)化為相應(yīng)的代碼。這是一次性的代碼生成過(guò)程,然而要實(shí)現(xiàn)更復(fù)雜的功能,就需要一個(gè)能夠支持對(duì)話的用戶界面了。 鄧明軒: 這里涉及兩個(gè)問(wèn)題:質(zhì)量和安全性。質(zhì)量與我們對(duì) Prompt 工程的學(xué)習(xí)和掌握有關(guān)。而安全性則有兩個(gè)方面需要考慮:首先是工具本身提供的安全輔助功能,另一方面是作為代碼使用者,我們?nèi)绾慰紤]安全問(wèn)題。 我想提一下亞馬遜云科技推出的 Code Whisperer 工具,它實(shí)際上對(duì)代碼的安全性進(jìn)行了檢查和提示。當(dāng)然,盡管可以使用工具來(lái)輔助我們更好、更快速地發(fā)現(xiàn)安全問(wèn)題,但我們?nèi)匀恍枰獙?duì)項(xiàng)目的代碼負(fù)責(zé)。例如,我們需要考慮是否可能泄露敏感信息或者代碼是否可能被錯(cuò)誤使用,尤其是在涉及對(duì)外服務(wù)的方面,我們還需要考慮這些服務(wù)是否會(huì)對(duì)其他系統(tǒng)造成重大損害。 大型語(yǔ)言模型的多輪對(duì)話會(huì)受限于容量,可能只有幾十 KB,因此檔面對(duì)復(fù)雜的項(xiàng)目,或者一個(gè)由 10 人或 20 人組成的團(tuán)隊(duì)時(shí),其容量可能遠(yuǎn)遠(yuǎn)不夠。此外,還有整個(gè)軟件環(huán)境,包括軟件設(shè)計(jì)和需求描述等方方面面的考慮。因此,作為程序員,我們需要對(duì)這個(gè)領(lǐng)域有全面了解,從頭到尾清楚了解相關(guān)結(jié)構(gòu)。在這種情況下,我們會(huì)將其中的細(xì)微問(wèn)題拆分出來(lái),與大型語(yǔ)言模型進(jìn)行交互,一定程度上避免由于容量限制而無(wú)法處理復(fù)雜的邏輯跟蹤。當(dāng)然,這也涉及到安全性的問(wèn)題。 回到質(zhì)量問(wèn)題,我認(rèn)為質(zhì)量同樣是程序員的責(zé)任。在這方面,工具也對(duì)我們提出了一些要求,如果你的代碼質(zhì)量較高,那它將更容易理解,生成代碼的可用性也會(huì)更高。最終代碼質(zhì)量的責(zé)任仍然在于代碼的擁有者,也就是我們自己,我們需要真正對(duì)此負(fù)責(zé)。 Michael Yuan: 對(duì)于代碼質(zhì)量,有一些簡(jiǎn)單的方法可以采用,例如將代碼與編譯器進(jìn)行鏈接,使生成的代碼立即進(jìn)行自動(dòng)編譯,并通過(guò)編譯器提供的錯(cuò)誤信息進(jìn)行修復(fù)。此外,還可以與數(shù)據(jù)庫(kù)等工具結(jié)合使用,自動(dòng)掃描檢測(cè)常見(jiàn)的問(wèn)題。所以,代碼質(zhì)量并不是一個(gè)無(wú)法解決的科學(xué)問(wèn)題,而是一個(gè)工程問(wèn)題,我們可以通過(guò)各種工具的結(jié)合來(lái)不斷接近最優(yōu)解。 不過(guò),目前對(duì)代碼質(zhì)量的控制問(wèn)題可能會(huì)有一些爭(zhēng)議。目前,從個(gè)人角度來(lái)評(píng)判代碼質(zhì)量的一個(gè)重要標(biāo)準(zhǔn)是可擴(kuò)展性,也就是代碼編寫后是否容易修改。然而,現(xiàn)在有一些流派認(rèn)為,未來(lái)尤其是對(duì)于前端框架而言,這種代碼質(zhì)量可能并不重要。 可以設(shè)想一個(gè)未來(lái)的場(chǎng)景,整個(gè)應(yīng)用程序都是由大型模型生成的,不存在需要人為修改的問(wèn)題,如果需求發(fā)生變化,只需重新生成代碼即可。某些場(chǎng)景下,每次生成的代碼都只使用一次,不存在擴(kuò)展代碼的問(wèn)題。當(dāng)然,現(xiàn)在可能還無(wú)法實(shí)現(xiàn)這一點(diǎn),但這是一個(gè)可能出現(xiàn)的未來(lái),如果成為現(xiàn)實(shí),那么會(huì)對(duì)代碼質(zhì)量的評(píng)價(jià)產(chǎn)生重大影響。因此,我認(rèn)為在架構(gòu)上編寫可擴(kuò)展且優(yōu)雅的代碼并不重要,至少在某些場(chǎng)景中不重要。 我們?cè)僬務(wù)劦诙c(diǎn),即安全問(wèn)題。我認(rèn)為,人類編寫的代碼在某種程度上也是相對(duì)安全的,否則就不會(huì)存在那么多問(wèn)題,也不會(huì)有像 Rust 這樣的語(yǔ)言出現(xiàn)。對(duì)于安全問(wèn)題的解決,人們?cè)诰帉懘a時(shí)已經(jīng)用了很多工具,例如 Rust 通過(guò)編譯器解決內(nèi)存安全問(wèn)題、Java 通過(guò)運(yùn)行時(shí)方法解決內(nèi)存安全問(wèn)題等。 多輪對(duì)話的有趣之處在于,生成的代碼可以通過(guò)工具運(yùn)行,然后將工具的結(jié)果反饋給模型,然后模型做進(jìn)一步優(yōu)化,這個(gè)過(guò)程可能比人類做得更好。 彭靖田: 我最后補(bǔ)充一個(gè)我個(gè)人非常認(rèn)同的觀點(diǎn),即關(guān)于“我們今天應(yīng)該如何解決 AI 生成代碼的安全隱患?”這個(gè)問(wèn)題沒(méi)有太多可討論的,因?yàn)檫@與 AIGC 無(wú)關(guān),代碼就是代碼,無(wú)論是誰(shuí)生成的都存在安全隱患,所以我不想討論這個(gè)問(wèn)題。 我更關(guān)注生成代碼的質(zhì)量高低,也就是 AI 生成代碼的問(wèn)題。目前,有兩種對(duì)此完全不同的觀點(diǎn)。有一類觀點(diǎn)認(rèn)為,每個(gè)人都應(yīng)該開(kāi)發(fā)自己的大模型,因此出現(xiàn)了很多專注于大模型的創(chuàng)業(yè)公司。然而訓(xùn)練語(yǔ)料庫(kù)是有限的,在 OpenAI 和其他國(guó)外大廠已經(jīng)做了很多投入的情況下,是否值得從零開(kāi)始開(kāi)發(fā)一個(gè)大模型還需要探討。我們需要知道的是,一些大模型并沒(méi)有特別針對(duì)編寫代碼這一任務(wù)進(jìn)行增強(qiáng),特別是當(dāng)我們要在生產(chǎn)環(huán)境中將其作為生產(chǎn)力工具替代選擇時(shí)。 我們招聘一個(gè)研發(fā)工程師時(shí)為什么要寫招聘要求?為什么要對(duì)研發(fā)工程師進(jìn)行分類?因?yàn)樗麄兓撕芏鄷r(shí)間進(jìn)行自我訓(xùn)練,他們的訓(xùn)練來(lái)自各種類型的教程、框架手冊(cè)、項(xiàng)目實(shí)踐等。如果你的公司有自己的代碼庫(kù),可能沒(méi)有開(kāi)源,或者你正在進(jìn)行一個(gè)特定領(lǐng)域的項(xiàng)目,有許多開(kāi)源框架和基礎(chǔ)項(xiàng)目代碼,那么是否應(yīng)該進(jìn)行 fine-tuning(微調(diào))?是否可以提升模型的權(quán)重,使通過(guò) fine-tuning 得到的模型能夠更好地解決代碼生成問(wèn)題,而不是從零開(kāi)始開(kāi)發(fā)一個(gè)模型?我認(rèn)為這可能是一個(gè)可以考慮的方向。 Michael Yuan: 我們團(tuán)隊(duì)主要使用 Copilot 來(lái)生成代碼,因?yàn)樗c GitHub 的 IDE 結(jié)合非常緊密,我認(rèn)為這一點(diǎn)非常重要。如果你要在其他地方使用它,你就需要打開(kāi)另一個(gè)用戶界面(UI),這將增加工作量。然而,剛才提到的多輪對(duì)話生成應(yīng)用并且使用人工工具進(jìn)行檢查,這是一個(gè)很好的方向。比如,我可以將它集成到問(wèn)題跟蹤(Issues)或討論(Discussion)中。 關(guān)于代碼質(zhì)量本身,有很多工具可供選擇。今天代碼中的許多問(wèn)題都源自所謂的供應(yīng)鏈問(wèn)題,這意味著你依賴于其他人的代碼,如果其他人的代碼出了問(wèn)題,你的代碼就會(huì)受到影響。另外,復(fù)制、粘貼的代碼可能會(huì)在大型模型中帶來(lái)更多問(wèn)題。這段代碼可能不是在 NPM 或 Cargo 的包管理器中引入的,而是來(lái)自 Apache 或其他許可證的,如果出了問(wèn)題或者上游進(jìn)行了修復(fù),開(kāi)發(fā)者可能并不知道,這種情況下就需要更深層次的代碼檢查器。 在 AIGC 中,這種代碼檢查器也特別有用,其實(shí)就是用同一個(gè)工具解決可以兩個(gè)問(wèn)題:一個(gè)是解決代碼來(lái)源和許可證不兼容的問(wèn)題;另一個(gè)是,如果上游代碼出了問(wèn)題,有工具可以跟蹤并通知開(kāi)發(fā)者,然后對(duì)下游代碼進(jìn)行相應(yīng)的更改。 當(dāng)然在編寫代碼后的測(cè)試是必不可少的。我們?cè)谟玫?Rust 有很多工具選擇,如快速測(cè)試(fast testing)。實(shí)際上,快速測(cè)試也是一種機(jī)器學(xué)習(xí)方法,它不斷測(cè)試輸入和輸出邊界,然后看代碼是否出錯(cuò)。在這方面,我認(rèn)為大型開(kāi)源項(xiàng)目會(huì)提供這種專門的服務(wù)。我們的項(xiàng)目為什么加入 CNCF,主要是因?yàn)?CNCF 與 Google 合作提供了這樣的服務(wù)。但這需要大量的機(jī)器時(shí)間不斷地進(jìn)行編譯和測(cè)試。 另外,每個(gè)項(xiàng)目的情況可能都不一樣。我們使用的是 Rust,因此我們有一套特定類型的工具。而對(duì)于使用 Python 的項(xiàng)目,可能要用其他不同的工具,因?yàn)樗鼪](méi)有內(nèi)存安全的問(wèn)題,但有其他要解決的問(wèn)題。 彭靖田: 我覺(jué)得目前最好用的工具還是 AI 輔助編程工具本身。大部分工作仍然是基于大模型進(jìn)行的,開(kāi)發(fā)框架的遷移還不夠成熟。 我認(rèn)為從安全的角度考慮是非常重要的。比如,對(duì)于我們要與 Autodesk 工業(yè)設(shè)計(jì)軟件(如 AuthCD 和 Rivet)競(jìng)爭(zhēng)開(kāi)發(fā)的 SaaS 產(chǎn)品,如果接入 AI 生成的代碼,需要如何處理呢?實(shí)際上,傳統(tǒng)的軟件工程方法仍然非常有用。軟件工程告訴我們需要進(jìn)行環(huán)境劃分、編寫良好的測(cè)試用例、采用不同的測(cè)試方法,并在各個(gè)環(huán)境中有測(cè)試人員關(guān)注一些邊界情況和使用場(chǎng)景。 舉個(gè)例子,我們有個(gè)環(huán)節(jié)是將用戶上傳的 CAD 圖紙通過(guò)計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)算法轉(zhuǎn)換為三維模型。但建筑設(shè)計(jì)師繪制的 CAD 圖紙也存在很多問(wèn)題,他們沒(méi)有編譯器,也沒(méi)有測(cè)試環(huán)境,只能依靠施工現(xiàn)場(chǎng)的人逐個(gè)解決。這其中有兩類測(cè)試問(wèn)題:一種是代碼確實(shí)存在問(wèn)題,這類問(wèn)題可以通過(guò)軟件工程的方法解決;還有一類問(wèn)題更偏向于算法和領(lǐng)域場(chǎng)景,即輸入數(shù)據(jù)本身就不夠健壯和穩(wěn)定,這種設(shè)計(jì)上的問(wèn)題需要進(jìn)行降級(jí)處理,捕捉異常。 鄧明軒: 現(xiàn)在的大語(yǔ)言模型在架構(gòu)上有多種路線,但是現(xiàn)在有一種觀點(diǎn)認(rèn)為,模型的架構(gòu)本身并不重要,只要我們有充足的連接,即非線性的連接,并提供足夠多的數(shù)據(jù)給模型進(jìn)行訓(xùn)練,它就能夠產(chǎn)生很好的效果。因?yàn)檫@些模型內(nèi)嵌了大量人類知識(shí),盡管不是全部但可以通過(guò)使用足夠大的模型將文本輸入其中,進(jìn)而實(shí)現(xiàn)預(yù)期的效果。因此我個(gè)人認(rèn)為,底層的算法結(jié)構(gòu)可能并不會(huì)對(duì)上層的應(yīng)用產(chǎn)生太大影響。 關(guān)于代碼質(zhì)量檢查工具的使用,我同意兩位老師提到的觀點(diǎn),即最好的評(píng)估方法就是運(yùn)行它。現(xiàn)在普遍使用的是解釋型語(yǔ)言和編譯型語(yǔ)言。在這種情況下,解釋型語(yǔ)言具有一定的優(yōu)勢(shì),因?yàn)榭梢灾苯訉⑸傻拇a輸入語(yǔ)言環(huán)境中進(jìn)行解釋和運(yùn)行,捕捉可能的錯(cuò)誤,然后返回給大語(yǔ)言模型。對(duì)于編譯型語(yǔ)言如 Rust,需要設(shè)置額外的運(yùn)行時(shí)環(huán)境來(lái)進(jìn)行編譯和運(yùn)行??傊?,對(duì)于代碼質(zhì)量來(lái)說(shuō),“無(wú)論是白貓還是黑貓”,只要能夠滿足需求就是好的。 此外,現(xiàn)在許多與大語(yǔ)言模型相關(guān)的接口使用的都是 Python,在神經(jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)領(lǐng)域,Python 是主流語(yǔ)言之一,具有動(dòng)態(tài)解析和良好的語(yǔ)言支持。我認(rèn)為,未來(lái)可能會(huì)進(jìn)一步推動(dòng) Python 的發(fā)展,比如在大語(yǔ)言模型中生成一段代碼后,直接在 Python 的運(yùn)行環(huán)境中進(jìn)行評(píng)估和調(diào)試,然后返回結(jié)果給大語(yǔ)言模型。 現(xiàn)在有許多與語(yǔ)言相關(guān)的 LangChain 或其他外圍框架,這可能是未來(lái)的發(fā)展方向之一。通過(guò)額外的框架配合,可以在語(yǔ)言的運(yùn)行環(huán)境中進(jìn)行多輪對(duì)話,自動(dòng)檢查代碼質(zhì)量,無(wú)需人工干預(yù),我們只需要描述要完成的任務(wù),然后讓系統(tǒng)開(kāi)始運(yùn)行即可。如果出現(xiàn)錯(cuò)誤,系統(tǒng)會(huì)自動(dòng)進(jìn)行修改,并再次運(yùn)行。 關(guān)于代碼安全性,實(shí)際上在我了解 CodeWhisper 時(shí),也思考過(guò)版權(quán)問(wèn)題。我們使用大語(yǔ)言模型生成的代碼,但對(duì)于它的版權(quán)關(guān)系并不確定,比如它使用了什么開(kāi)源許可證,如果你的代碼在結(jié)構(gòu)上與某個(gè)開(kāi)源許可證中的代碼完全一致,那根據(jù)過(guò)去的案例,你可能會(huì)被訴訟。這對(duì)于使用這些工具的程序員來(lái)說(shuō)是一個(gè)挑戰(zhàn)。 鄧明軒: 如果是零基礎(chǔ),那么了解一些編程概念是有必要的。如果有一些基礎(chǔ),只是不夠深的話,那與大語(yǔ)言模型進(jìn)行互動(dòng)是一個(gè)不錯(cuò)的方法。 可以從簡(jiǎn)單的例子開(kāi)始,比如我們之前寫代碼時(shí)常用的“Hello World”?,F(xiàn)在你可以要求模型給你一個(gè) Rust 版本的“Hello World”,雖然可能一開(kāi)始看不懂,但可以直接運(yùn)行這段代碼,如果出現(xiàn)錯(cuò)誤了就把錯(cuò)誤信息反饋給模型,詢問(wèn)出了什么問(wèn)題,這樣的交互循環(huán)可以讓你快速學(xué)習(xí)新技術(shù)。另外,還可以選擇一段代碼并要求模型解釋它是做什么的。然后進(jìn)一步問(wèn),比如要在其中添加一個(gè)循環(huán)或者一個(gè)條件分支該如何實(shí)現(xiàn)?總之,你可以慢慢學(xué)習(xí),逐漸形成對(duì)編程的基本理解,關(guān)注在代碼的運(yùn)行邏輯上,而不是語(yǔ)法結(jié)構(gòu)。 每種語(yǔ)言都不同,你并不需要詳細(xì)研究每種語(yǔ)言的具體細(xì)節(jié),只需要理解基本的概念,例如循環(huán)、分支,包括遞歸以及更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)等。關(guān)鍵時(shí)通過(guò)交互的方式逐步構(gòu)建這些概念。我認(rèn)為,有了這些工具之后,學(xué)習(xí)編程會(huì)更快速,而不是有些人擔(dān)心的那樣“程序員會(huì)失業(yè),不需要學(xué)習(xí)了”,這實(shí)際上降低了編程和與計(jì)算機(jī)對(duì)話的門檻。 Michael Yuan: “有了更好的工具后,程序員就要失業(yè)了?!边@種話我聽(tīng)了二十多年了。我還記得過(guò)去有種說(shuō)法,“大家都不要學(xué)計(jì)算機(jī)了,因?yàn)槎家《热巳プ隽耍銈儧](méi)有機(jī)會(huì)了。”但事實(shí)證明并非如此。我對(duì)大語(yǔ)言模型的理解是,它是程序員的工具,程序員會(huì)用它來(lái)輔助其他人工作,這就是我不同意 OpenAI 那篇報(bào)告的原因。 OpenAI 的報(bào)告聲稱洗碗和刷房子不會(huì)失業(yè),但實(shí)際上洗碗也會(huì)失業(yè),因?yàn)槌绦騿T會(huì)有更多的時(shí)間開(kāi)發(fā)出洗碗機(jī)器人,取代所有洗碗的人,所以程序員也是可以卷走其他人工作的。大模型可以大幅提高程序員的能力,有了大模型后可以很快地學(xué)習(xí)和理解。 回到之前的問(wèn)題,之前計(jì)算機(jī)科學(xué)的書(shū)籍和教育對(duì)我們有很大的影響,我自己也寫過(guò)幾本書(shū),寫書(shū)的時(shí)候通常會(huì)從背景開(kāi)始、介紹概念開(kāi)始。有些語(yǔ)言容易有些就難,有些語(yǔ)言概念非常多,比如 Rust 概念很多,學(xué)習(xí)起來(lái)比較困難。但使用大模型后,它可以解釋很多東西,還可以完全根據(jù)你的學(xué)習(xí)需求進(jìn)行定制。 為什么很多人的編程學(xué)得不好?因?yàn)榫幊滩皇且环N立竿見(jiàn)影的事情,你需要從一些沒(méi)有意義的事情開(kāi)始做起,比如寫一個(gè)“Hello World”能有什么用?它解決不了實(shí)際問(wèn)題。但就像我之前提到的,有了大模型后,我朋友花了半天時(shí)間寫了一個(gè) Discord 機(jī)器人,你也可以輕松地寫出類似的東西。你可能并不完全理解為什么這樣寫,但你可以逐步改進(jìn),通過(guò)自己的努力學(xué)習(xí)快速掌握它的用法。 鄧明軒: 我當(dāng)年學(xué)習(xí)編程語(yǔ)言的時(shí)候,買了一本書(shū),還要去機(jī)房上課,然后我們敲了一些代碼卻出現(xiàn)了錯(cuò)誤,我們不知道什么意思,老師也不懂,甚至?xí)弦矝](méi)有解釋。我們只能自己摸索和嘗試。在那個(gè)年代,學(xué)習(xí)計(jì)算機(jī)編程是非常困難的。我不知道提問(wèn)的觀眾是多大年紀(jì),可能年齡較小。你們非常幸運(yùn),生活在這個(gè)時(shí)代,有機(jī)會(huì)接觸到不斷發(fā)展和提升的技術(shù)。我鼓勵(lì)你們充分利用這項(xiàng)技術(shù),因?yàn)槲磥?lái)可能會(huì)有各種驚人的可能性出現(xiàn)。 彭靖田: 之前,我將評(píng)估一個(gè)優(yōu)秀開(kāi)發(fā)者技能的維度分為四個(gè)部分:首先,編程和調(diào)試技能,也就是實(shí)際操作的能力,占比 40%;其次,項(xiàng)目管理和協(xié)作能力,占據(jù) 30% 的權(quán)重,這意味著作為一個(gè)獨(dú)立的開(kāi)發(fā)者,你能夠交付代碼,并且能夠與團(tuán)隊(duì)、需求方、測(cè)試方以及其他開(kāi)發(fā)團(tuán)隊(duì)成員進(jìn)行協(xié)作;接下來(lái),算法和數(shù)據(jù)結(jié)構(gòu),占據(jù) 20% 的權(quán)重。計(jì)算機(jī)科學(xué)專業(yè)的人可能對(duì)數(shù)據(jù)結(jié)構(gòu)和算法會(huì)有更深入的理解;最后的 10% 留給軟件工程經(jīng)驗(yàn),也就是在實(shí)踐中積累的最佳實(shí)踐經(jīng)驗(yàn)以及對(duì)優(yōu)秀軟件工程師的觀察和學(xué)習(xí)。 但是現(xiàn)在,我有了不同的看法。關(guān)于那 40% 的技能,我會(huì)進(jìn)一步抽象為大模型的應(yīng)用實(shí)戰(zhàn)能力。這意味著你有更多的最佳實(shí)踐,而不是僅僅學(xué)習(xí)某種編程語(yǔ)言,浪費(fèi)大量時(shí)間和精力去學(xué)習(xí)每一個(gè)知識(shí)點(diǎn)。正如這位提問(wèn)者提到,前后學(xué)了 QBasic、Basic、Java、C++、Python、Go 和 Java 的派生版本等多種編程語(yǔ)言,這些語(yǔ)言都介紹了基本的數(shù)據(jù)類型,這可能會(huì)帶來(lái)一些困擾和混亂。但實(shí)際上,數(shù)據(jù)類型并不是很重要。 一個(gè)沒(méi)有學(xué)習(xí)過(guò)編程語(yǔ)言的人應(yīng)該如何做?以前我們會(huì)從基礎(chǔ)語(yǔ)法開(kāi)始學(xué)起,但現(xiàn)在語(yǔ)法并不那么重要了,重要的是對(duì)編程語(yǔ)言的理解。比如理解編譯型語(yǔ)言和解釋型語(yǔ)言的區(qū)別,為什么自 Python 3 以來(lái)一直在強(qiáng)調(diào)類型標(biāo)注?為什么一個(gè)本來(lái)應(yīng)該非常靈活的語(yǔ)言現(xiàn)在越來(lái)越強(qiáng)調(diào)類型,并且推出了許多相關(guān)庫(kù)?事實(shí)上,這就是所謂的 Prompt 實(shí)際上變成了與英語(yǔ)一樣重要的語(yǔ)言技能。 還有 20% 我留給了人機(jī)和團(tuán)隊(duì)協(xié)作?,F(xiàn)在我們可以與人工智能和大型模型進(jìn)行協(xié)作,它們不會(huì)抱怨、不會(huì)說(shuō)我們蠢,也不會(huì)在背后說(shuō)壞話。如果你無(wú)法與這樣的一個(gè)合作伙伴進(jìn)行有效協(xié)作,那肯定是你自己的問(wèn)題。 鄧明軒: 目前工具的交互模式和發(fā)展都處于不斷演進(jìn)的過(guò)程中,還有很多空間可以探索。近一年來(lái),我們經(jīng)歷了一個(gè)技術(shù)爆炸,整個(gè)行業(yè)也在思考這些工具應(yīng)該具備怎樣的形態(tài)。因此,過(guò)多地關(guān)注當(dāng)前工具的局限性可能并不是非常有益。也許三五年后回頭來(lái)看,我們會(huì)發(fā)現(xiàn)現(xiàn)在的情況非常有意思。 不同的廠商推出了自己的工具,但他們并不是要將這些工具作為盈利手段,而是通過(guò)這些新的交互模式將用戶引入到某個(gè)平臺(tái)上。對(duì)于如何將這種能力更多地?cái)U(kuò)展到用戶手中,大家應(yīng)該有相對(duì)一致的想法。我個(gè)人的體驗(yàn)是,我真的很希望有一個(gè)像《鋼鐵俠》中的賈維斯那樣的助手,我可以用自然語(yǔ)言與他進(jìn)行溝通,他能理解并幫助我完成許多任務(wù)。這種輔助性工具確實(shí)是我非常期待的東西。 Michael Yuan:我覺(jué)得投資人可能更加焦慮,因?yàn)樗麄兛赡軙?huì)發(fā)現(xiàn)某個(gè)工具很好,但過(guò)幾天就被 OpenAI 或其他公司干掉了,甚至有些簡(jiǎn)單的工具已經(jīng)被別人復(fù)制了。目前工具方面有很多創(chuàng)新。例如 OpenAI 最近發(fā)布的 Function Core 可以直接從大模型生成數(shù)據(jù)結(jié)構(gòu),然后與核心函數(shù)結(jié)合。 工具創(chuàng)新的領(lǐng)域很多,甚至比底層大模型的創(chuàng)新和迭代速度都要快。為什么會(huì)這樣呢?因?yàn)榈讓哟竽P托枰馁M(fèi)大量資金和時(shí)間進(jìn)行訓(xùn)練,而現(xiàn)在正是一個(gè)百花齊放的時(shí)代,有大量不同的想法和方向。對(duì)我們來(lái)說(shuō),一個(gè)特別有用的工具是如何讓多輪對(duì)話生成代碼的界面更加友好,能夠吸引更多人參與。以前的研發(fā)管理工具中并沒(méi)有考慮到這一點(diǎn)。 Michael Yuan: 實(shí)際上我們有自己的數(shù)據(jù),但我認(rèn)為還不足以進(jìn)行直接比較。Twitter 上有很多比較。實(shí)際上,一些經(jīng)驗(yàn)豐富的人更不愿意使用 AIGC,因?yàn)樗麄冋J(rèn)為自己可以寫得比 AIGC 更好。而那些比較初級(jí)的或者經(jīng)驗(yàn)較少的程序員愿意使用 AIGC,他們代碼編寫速度和完成度要比那些資深程序員高得多,這不是兩倍的差距,而是幾十倍的差距。當(dāng)然,也可以說(shuō)經(jīng)驗(yàn)豐富的開(kāi)發(fā)者寫出來(lái)的代碼更容易擴(kuò)展。但是如果有了幾十倍的差距,那么下次直接重寫就好了。 鄧明軒: 我觀察到,小型初創(chuàng)公司在技術(shù)選型上會(huì)更快一些,因?yàn)樗麄兛赡芨屿`活。對(duì)于一些大型企業(yè),特別是傳統(tǒng)企業(yè),開(kāi)發(fā)部門可能比較龐大、流程也比較復(fù)雜,目前找到合適的方法將這些納入到整個(gè)軟件工程流程中仍是一個(gè)問(wèn)題,所以我認(rèn)為還需要觀察。 如果你的定位是寫一些膠水代碼或者試驗(yàn)性代碼,那可以快速適應(yīng)。另外,如果你所在的公司比較靈活,我建議大家去嘗試。如果你有一個(gè)由 5 個(gè)或 10 個(gè)人組成的團(tuán)隊(duì),并且你們的效率是巨大公司的 30~40 倍,那么你就可以與這些大型公司競(jìng)爭(zhēng)了。 當(dāng)然,對(duì)于傳統(tǒng)的大型軟件開(kāi)發(fā)公司或大型 IT 部門來(lái)說(shuō),短期內(nèi)將這些融入到開(kāi)發(fā)流程中具有挑戰(zhàn)性,大家可能還沒(méi)有完全明白該怎么做。我們可以稍微放慢一些節(jié)奏,在比如半年或一年后,再來(lái)看看如何將這些納入整個(gè)團(tuán)隊(duì)中。 彭靖田: 這是一個(gè)趨勢(shì)性的事情。拿我們團(tuán)隊(duì)來(lái)說(shuō),我們目前沒(méi)有專門的運(yùn)維人員,只有一個(gè)后端同事兼任運(yùn)維工作,如果是一個(gè)大公司就會(huì)需要一個(gè)團(tuán)隊(duì)。他需要管理華為、亞馬遜云科技以及字節(jié)的云平臺(tái),每個(gè)云平臺(tái)都有自己的 Kubernets 集群,這意味著他需要管理 7~8 個(gè)集群。一個(gè)云平臺(tái)上可能會(huì)有多個(gè)環(huán)境,而且不同環(huán)境之間的命名空間和優(yōu)先級(jí)可能也不同。七八年前剛接觸 Kubernets 時(shí),我就覺(jué)得這是一項(xiàng)非常復(fù)雜的工作,包括今天的 Kubernets 生態(tài)社區(qū)中,很多人就在做調(diào)度策略、HPA 等各種工作。 但實(shí)際上,大多數(shù)團(tuán)隊(duì)只使用了容器云的一些基礎(chǔ)功能,特別是在運(yùn)維方面,大部分工作都可以自動(dòng)化。比如 GitLab 現(xiàn)在強(qiáng)調(diào) DevSecOps。整個(gè) CI/CD 流程實(shí)際上由許多腳本組成,以前這些腳本被認(rèn)為是運(yùn)維專家的特殊技能,但實(shí)際上并沒(méi)有那么神秘,也沒(méi)有那么多技巧,大模型可以解決這些問(wèn)題。 我們那位后端同事使用了很多自動(dòng)化技術(shù),但還沒(méi)有將 GPT-4 作為日常工具,最近兩個(gè)月里他一直沒(méi)有解決一個(gè)偶發(fā)性問(wèn)題。我們一直使用較大的節(jié)點(diǎn),最小的節(jié)點(diǎn)大約都有 32 個(gè)核心和近 200GB 內(nèi)存的資源池。在這樣的一個(gè)節(jié)點(diǎn)上,我們通常部署 200-400 個(gè)應(yīng)用程序,而這些應(yīng)用程序的請(qǐng)求資源可能只占用 0.5 個(gè) CPU 核心和 2GB 內(nèi)存,但這時(shí)候,他們的請(qǐng)求已經(jīng)接近我們的資源上限。但它是一個(gè)流水線,不斷地在消耗資源,以至于有的應(yīng)用程序剛啟動(dòng),另一批應(yīng)用程序可能已經(jīng)關(guān)閉了。 這里的問(wèn)題在于,多云環(huán)境中的底層硬盤共享有一個(gè)閾值限制。當(dāng)應(yīng)用程序特別多時(shí),這個(gè)默認(rèn)閾值可能會(huì)被打破,導(dǎo)致應(yīng)用程序無(wú)法啟動(dòng)。他發(fā)現(xiàn)應(yīng)用程序無(wú)法啟動(dòng),但 CPU、內(nèi)存資源都足夠。因?yàn)槎嘣圃谔摂M化存儲(chǔ)時(shí),借用了一部分硬盤來(lái)進(jìn)行虛擬化存儲(chǔ),但實(shí)際上用不滿。他無(wú)法解決這個(gè)問(wèn)題,我獲得權(quán)限后把那個(gè)節(jié)點(diǎn)上的日志原封不動(dòng)地交給 GPT-4,它告訴我只需重啟一個(gè)命令,將閾值改為合適的值就可以了。起初,后端同事還不相信,他去 Stack Overflow 上查找,但結(jié)果各不相同。最后他按照指示執(zhí)行了命令,問(wèn)題解決了。 對(duì)我們這個(gè)同事來(lái)說(shuō),這個(gè)問(wèn)題只是一種認(rèn)知上的偏差,但提升的效率是非常顯著的。對(duì)于那些 1~3 年里都在寫 SQL 和編寫 CRUD 業(yè)務(wù)邏輯的開(kāi)發(fā)工程師來(lái)說(shuō),未來(lái)的代碼效率也會(huì)大大提升。 鄧明軒: 我認(rèn)為,現(xiàn)在互聯(lián)網(wǎng)降本增效和技術(shù)變革可能不處在同一個(gè)趨勢(shì)上。技術(shù)變革主要受疫情和國(guó)際經(jīng)濟(jì)關(guān)系等因素的影響,個(gè)體很難改變,我們只能在這種情況下盡力發(fā)揮自己的價(jià)值,比如在降本增效的壓力下如何展現(xiàn)自己的能力。 作為個(gè)體,我們應(yīng)該如何適應(yīng)這個(gè)新環(huán)境?首先,我們需要在心態(tài)上保持開(kāi)放,接受這種新事物,迅速了解并進(jìn)行實(shí)踐。正如剛才提到的,實(shí)際上事情變得更容易了,而不是更難了。 另外,要學(xué)會(huì)學(xué)習(xí)的方法,這非常重要。未來(lái),具體編程語(yǔ)言的語(yǔ)法結(jié)構(gòu)等可能并不那么重要,重要的是如何具備良好的學(xué)習(xí)能力、快速適應(yīng)新環(huán)境。我認(rèn)為這是一項(xiàng)非常重要的技能,這次的技術(shù)變革就給我們提出了新的挑戰(zhàn)。希望大家保持積極樂(lè)觀,因?yàn)楣ぞ咭矌?lái)了很多機(jī)會(huì)。 Michael Yuan: 程序員有一個(gè)優(yōu)良傳統(tǒng),就是喜歡親自動(dòng)手去做,而不是空談。在技術(shù)領(lǐng)域,那些只會(huì)談?wù)搮s無(wú)實(shí)際行動(dòng)的人會(huì)讓人感到厭煩。大型模型特別好的一點(diǎn)就是,它們可以讓人立即動(dòng)手嘗試,我其實(shí)很喜歡這一點(diǎn)。 彭老師也講他的整個(gè)項(xiàng)目都是通過(guò) AIGC 完成的,包括項(xiàng)目的推廣和市場(chǎng)營(yíng)銷都是由模型生成的。這個(gè)過(guò)程中有很多工具可以用,一旦嘗試了這些,你就會(huì)知道這個(gè)東西的大致邊界在哪里,因此也會(huì)有正確的預(yù)期。最難的一步可能是邁出第一步。 彭靖田:企業(yè)對(duì)程序員的要求會(huì)有哪些變化?實(shí)際上,我認(rèn)為這個(gè)問(wèn)題并不是從甲方的角度提出的,因?yàn)榧追綄?duì)程序員的要求一直都是一樣的:快速、高質(zhì)量、低成本,就是要多快好省。從這個(gè)角度看,無(wú)論是程序員、開(kāi)發(fā)人員還是內(nèi)容生產(chǎn)者,作為提供服務(wù)的人,我們需要解決的問(wèn)題就是如何更快、更好地完成工作。 我們和動(dòng)物的區(qū)別在于我們懂得利用工具,而且我們的工具變得越來(lái)越巧妙、易用,我們也越來(lái)越擅長(zhǎng)改造工具,使其更適合人類的需求。從這個(gè)視角來(lái)看,我們每個(gè)人都應(yīng)該迅速擁抱這些新工具。想象一下,如果你的老板讓你打車,你會(huì)站在路上等出租車嗎?不會(huì)吧,你會(huì)使用滴滴、高德地圖、美團(tuán)打車,這個(gè)邏輯很簡(jiǎn)單明了。 吳少杰(特邀主持): 我之前在 58 集團(tuán)、新浪微博負(fù)責(zé)過(guò)推薦算法相關(guān)的工作,現(xiàn)在在垂直行業(yè)做智能算法,給業(yè)務(wù)賦能。 鄧明軒: 我已經(jīng)從事編程工作 23 年了。我 2000 年畢業(yè),陸續(xù)加入了 IBM 和蘋果等公司。目前我在亞馬遜擔(dān)任首席架構(gòu)師。個(gè)人而言,我對(duì)編程非常感興趣。事實(shí)上,從我畢業(yè)至今的 20 多年間,我一直都在編寫代碼。盡管最近一兩年由于工作中的事務(wù)性任務(wù)增多,我編寫代碼的機(jī)會(huì)相對(duì)較少,但我仍然對(duì)此感興趣并愿意自己去寫代碼。在當(dāng)前通用人工智能大語(yǔ)言模型的發(fā)展中,我注意到它對(duì)整個(gè)編程技術(shù)產(chǎn)生了巨大影響。我很高興能夠在有生之年經(jīng)歷這一切。 彭靖田: 我從中學(xué)開(kāi)始接觸編程,有大約 15 年左右的編程經(jīng)驗(yàn)了,至今我一直在編程語(yǔ)言和算法一線。2015 年,我在大三時(shí)開(kāi)始接觸創(chuàng)業(yè),跟著浙大學(xué)長(zhǎng)拿到了真格徐小平老師的天使輪融資,做了一個(gè)輔助診療的 APP,是基于 NLP 和深度學(xué)習(xí)的 AI 系統(tǒng)。從加州大學(xué)訪學(xué)結(jié)束后,我加入了華為 2012 實(shí)驗(yàn)室,從零到一參與了華為深度學(xué)習(xí)平臺(tái) ModelArts 的設(shè)計(jì)和研發(fā)工作。之后我作為技術(shù)合伙人加入了才云科技(2020 年被字節(jié)跳動(dòng)收購(gòu)后,整合為了字節(jié)火山云)?,F(xiàn)在這家公司——品覽是我的第三段創(chuàng)業(yè)經(jīng)歷,我是公司的聯(lián)合創(chuàng)始人和 CTO。我們致力于用 AIGC 賦能建筑設(shè)計(jì),彎道超車 AutoDesk 的產(chǎn)品。 除了創(chuàng)業(yè)外,我也非常喜歡開(kāi)源。從上一輪深度學(xué)習(xí)的火熱時(shí)期開(kāi)始,我在很早期參與了 Tensorflow 項(xiàng)目的開(kāi)源貢獻(xiàn),2017 年與華為兩位同事一起合作出版了國(guó)內(nèi)首本深度剖析 TensorFlow 框架的熱銷書(shū)《深入理解 TensorFlow》。在才云時(shí)期,我們與谷歌云團(tuán)隊(duì)共同發(fā)起了了一個(gè) Kubeflow 的開(kāi)源項(xiàng)目,它現(xiàn)在已經(jīng)成為 MLOps 領(lǐng)域的事實(shí)標(biāo)準(zhǔn)之一?,F(xiàn)在我積極擁抱大模型,也在極客時(shí)間開(kāi)設(shè)了《AI 大模型應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)營(yíng)》課程,歡迎訂閱和交流。 Michael Yuan: 相比大家,我的編程起步比較晚,因?yàn)槲沂窃诓┦慨厴I(yè)后才正式開(kāi)始編程的。當(dāng)時(shí)找不到工作,于是決定嘗試尋找程序員的職位。我發(fā)現(xiàn)大廠不愿意雇傭沒(méi)有實(shí)際編程經(jīng)驗(yàn)的人,所以我決定從開(kāi)源項(xiàng)目入手。那是很多年前,當(dāng)時(shí) Java 剛剛在服務(wù)端起步,所以我早期參與了 JBoss 這個(gè)開(kāi)源項(xiàng)目,我們開(kāi)發(fā)了當(dāng)時(shí)也是現(xiàn)在最流行的 Java application server。后來(lái)我們將公司賣給了紅帽軟件公司。之后,我一直在開(kāi)源社區(qū)中進(jìn)行項(xiàng)目開(kāi)發(fā),也在公司工作過(guò),還做過(guò)投資人,一直與開(kāi)源社區(qū)和開(kāi)發(fā)人員保持密切聯(lián)系。期間,我出版了 5 本書(shū)。 我目前有一個(gè)開(kāi)源項(xiàng)目叫做 WasmEdge,它是 CNCF 的一個(gè)項(xiàng)目。我們主要開(kāi)發(fā) Rust 和 WebAssembly (Wasm) 在云原生與 AI 的應(yīng)用框架與運(yùn)行環(huán)境,大家可能會(huì)覺(jué)得 Rust 語(yǔ)言很受歡迎,但也有很多人認(rèn)為它很難學(xué)。我們現(xiàn)在認(rèn)為,使用大型語(yǔ)言模型來(lái)教授人們學(xué)習(xí) Rust 是一件非常有趣的事情。另外,因?yàn)槲覐氖卵邪l(fā)管理工作已經(jīng)很多年了,我發(fā)現(xiàn)使用大型語(yǔ)言模型,確實(shí)可以提高開(kāi)發(fā)效率。
6 月 16 日,WasmEdge 創(chuàng)始人和核心開(kāi)發(fā)者、 Second State 聯(lián)合創(chuàng)始人 Michael Yuan 博士,品覽聯(lián)合創(chuàng)始人 &CTO、極客時(shí)間《AI 大模型應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)營(yíng)》講師彭靖田,亞馬遜云科技大中華區(qū)首席架構(gòu)師鄧明軒做客《極客有約》,一起聊了聊 AIGC 與程序員的那些事兒。本文根據(jù)直播內(nèi)容整理,大家可以點(diǎn)擊查看完整視頻(https://www.infoq.cn/video/D8fRLD8POS4Nq0PGHVrH)。 import os
import re
import subprocess
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 郵件相關(guān)配置
SMTP_SERVER = 'smtp.example.com'
SMTP_PORT = 587
SMTP_USERNAME = 'your_username'
SMTP_PASSWORD = 'your_password'
SENDER_EMAIL = 'your_email@example.com'
SUBJECT = '不規(guī)范的代碼文件信息'
# 檢查數(shù)據(jù)庫(kù)密碼
def check_database_password(file_path):
with open(file_path, 'r') as file:
content = file.read()
if re.search(r'\bpassword\b', content, re.IGNORECASE):
return True
return False
# 使用 PyLint 檢查代碼是否符合規(guī)范
def check_code_conformance(file_path):
command = f'pylint {file_path}'
result = subprocess.run(command, shell=True, capture_output=True, text=True)
output = result.stdout
return output
# 發(fā)送郵件通知
def send_email(file_path, recipient, cc):
msg = MIMEMultipart()
msg['From'] = SENDER_EMAIL
msg['To'] = recipient
msg['Cc'] = cc
msg['Subject'] = SUBJECT
body = f'不規(guī)范的代碼文件:{file_path}'
msg.attach(MIMEText(body, 'plain'))
try:
smtp_server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
smtp_server.starttls()
smtp_server.login(SMTP_USERNAME, SMTP_PASSWORD)
smtp_server.sendmail(SENDER_EMAIL, [recipient, cc], msg.as_string())
smtp_server.quit()
print('郵件通知已發(fā)送')
except Exception as e:
print(f'發(fā)送郵件時(shí)發(fā)生錯(cuò)誤:{str(e)}')
# 主函數(shù)
def main():
repo_path = '/path/to/your/git/repository'
for root, dirs, files in os.walk(repo_path):
for file in files:
file_path = os.path.join(root, file)
# 檢查數(shù)據(jù)庫(kù)密碼
if check_database_password(file_path):
send_email(file_path, RECIPIENT_EMAIL, CC_EMAIL)
# 使用 PyLint 檢查代碼是否符合規(guī)范
pylint_output = check_code_conformance(file_path)
if 'Your code has been rated at' not in pylint_output:
send_email(file_path, RECIPIENT_EMAIL, CC_EMAIL)
if __name__ == '__main__':
main()
聯(lián)系客服