技術(shù)不是萬能的,但沒有技術(shù)卻可能是萬萬不能的,對(duì)于大模型可能也是如此。基于大模型的應(yīng)用設(shè)計(jì)需要聚焦于所解決的問題,在自然語言處理領(lǐng)域,大模型本身在一定程度上只是將各種NLP任務(wù)統(tǒng)一成了sequence 到 sequence 的模型。利用大模型, 我們是在解決具體的生產(chǎn)和生活中的問題,產(chǎn)品和技術(shù)上的設(shè)計(jì)仍然不可或缺。
那么,如果大模型正在重新構(gòu)建軟件工程的未來,我們是否應(yīng)該遵循一些基本原則呢?
1. 模型優(yōu)先,持續(xù)迭代
如果模型能做到的是事情,就不要寫代碼;模型會(huì)變得更好,但代碼不會(huì)。
在當(dāng)今的時(shí)代,模型的價(jià)值日益凸顯。與傳統(tǒng)的編程方法不同,現(xiàn)在的開發(fā)思路更傾向于“模型優(yōu)先”。這意味著,當(dāng)我們面臨一個(gè)問題或任務(wù)時(shí),我們首先應(yīng)思考是否可以利用現(xiàn)有的模型來解決它,而不是立刻著手編寫代碼。因?yàn)榇a是固定的,而模型有著巨大的發(fā)展空間。隨著時(shí)間的推移,模型強(qiáng)大的學(xué)習(xí)和適應(yīng)能力能夠在不斷的迭代中自我優(yōu)化和進(jìn)步。因此,我們的首要任務(wù)是發(fā)掘模型的潛力,讓它成為我們解決問題的利器。
對(duì)于整個(gè)系統(tǒng)而言,目標(biāo)是利用LLM的規(guī)劃和理解意圖的能力,以此來構(gòu)建高效的項(xiàng)目。在這個(gè)過程中,我們可能會(huì)受到誘惑,想要回到那種命令式的思維模式,為程序的每個(gè)細(xì)節(jié)編寫代碼。但是,我們必須抵制這種誘惑,在一定程度上,現(xiàn)在可以讓模型可靠地做一些事情,隨著模型的發(fā)展,它會(huì)變得更好、更健壯。
2 權(quán)衡精準(zhǔn)性,采用交互進(jìn)行消歧
利用權(quán)衡杠桿換取精準(zhǔn),使用交互來緩解模糊。使用LLM進(jìn)行編碼時(shí)的正確心態(tài)不是“讓我們看看我們能讓跳舞的熊做什么”,而是從系統(tǒng)中獲得盡可能多的杠桿作用。例如,可以構(gòu)建非常通用的模式,如“從數(shù)據(jù)庫構(gòu)建報(bào)告”或“教授一年的科目”,這些模式可以通過純文本提示進(jìn)行參數(shù)化,從而輕松產(chǎn)生非常有價(jià)值和差異化的結(jié)果。
在追求高精準(zhǔn)度的同時(shí),我們必須權(quán)衡其與其他因素之間的關(guān)系。為了達(dá)到這種平衡,我們可以引入交互的方式,來消除可能出現(xiàn)的歧義和誤解。這種策略不僅提高了精準(zhǔn)性,還增加了操作的靈活性和效率。
在使用LLM進(jìn)行編碼的過程中,關(guān)鍵的心態(tài)不應(yīng)該是“試試看能做什么”,而應(yīng)該思考如何從系統(tǒng)中獲得最大的杠桿效應(yīng)。這意味著,我們不應(yīng)僅僅滿足于簡單的功能實(shí)現(xiàn),而是要深入挖掘系統(tǒng)的潛力,讓其為我們創(chuàng)造更大的價(jià)值。
實(shí)際應(yīng)用中,我們可以構(gòu)建一些通用的模式。比如,“從數(shù)據(jù)庫生成報(bào)告”這樣的模式,它具有很強(qiáng)的適應(yīng)性,可以通過簡單的文本提示進(jìn)行參數(shù)調(diào)整,從而應(yīng)對(duì)各種需求。再例如,“教一年的深度學(xué)習(xí)課程”這樣的模式,它整合了豐富的教育資源,同樣可以通過交互方式輕松調(diào)整,滿足個(gè)性化的教學(xué)需求。
通過這些通用模式的應(yīng)用,不僅提高了工作效率,還能輕松產(chǎn)生有價(jià)值、與眾不同的結(jié)果。這種權(quán)衡精準(zhǔn)性與交互消歧的策略,無疑是基于大模型應(yīng)用設(shè)計(jì)中的重要思維方式。
3 代碼用于語法和過程,模型用于語義和意圖
在現(xiàn)代編程領(lǐng)域,代碼和模型之間的分工變得越來越明確。簡而言之,代碼主要負(fù)責(zé)語法和過程的實(shí)現(xiàn),而模型則專注于語義和意圖的生成與解讀。這種分工在實(shí)際應(yīng)用中有多種表達(dá)方式,但核心思想是一致的:代碼是用來執(zhí)行特定指令和流程的工具,而模型則用來解讀、生成和推理語言的深層含義和目標(biāo)。
從根本上說,模型在推理語言的意義和目標(biāo)時(shí)表現(xiàn)出色,相形之下,當(dāng)它們被要求執(zhí)行特定的計(jì)算和過程時(shí),往往表現(xiàn)得不如代碼。例如,一個(gè)高級(jí)模型可能很容易為求解數(shù)獨(dú)編寫代碼,但如果讓它自己親自去解數(shù)獨(dú),可能就會(huì)變得相對(duì)困難。
每種代碼都有其獨(dú)特的優(yōu)勢,關(guān)鍵在于針對(duì)特定的問題選擇最適合的工具。語法和語義之間的界限,正是大模型應(yīng)用設(shè)計(jì)的主要挑戰(zhàn)。在這個(gè)背景下,我們需要更深入地理解代碼與模型各自的優(yōu)缺點(diǎn),以便更為有效地利用它們解決問題。
4 避免脆弱性,摒棄硬編碼
在構(gòu)建任何系統(tǒng)時(shí),一個(gè)不可忽視的事實(shí)是,系統(tǒng)的整體強(qiáng)度往往由其最脆弱的部分決定。這一觀點(diǎn)不僅適用于傳統(tǒng)的軟件系統(tǒng),對(duì)基于大模型的應(yīng)用同樣適用。
在追求系統(tǒng)靈活性和高效性的過程中,特別要避免硬編碼。硬編碼指的是將特定的值或邏輯直接寫入代碼,而不考慮未來的變化或擴(kuò)展。這種做法在短期內(nèi)可能帶來便利,但長期來看,會(huì)導(dǎo)致代碼僵化,難以維護(hù)。因此,我們應(yīng)該在代碼和算法中加入更多的推理和靈活性。
當(dāng)設(shè)計(jì)提示語和交互時(shí),應(yīng)該盡量讓其包含足夠的信息和邏輯,以便系統(tǒng)能夠自主地進(jìn)行決策和推理,而不是簡單地執(zhí)行預(yù)定義的命令。通過這種方式,不僅可以減少硬編碼的使用,還能更好地利用LLM的能力,讓系統(tǒng)更加智能、更加靈活。
5 數(shù)據(jù)質(zhì)量至上,LLM的應(yīng)用與高質(zhì)量數(shù)據(jù)息息相關(guān)
大模型確實(shí)展現(xiàn)出了非凡的能力,如同“受過良好教育的”個(gè)體,但在實(shí)際應(yīng)用中,它們?nèi)匀蝗狈δ承┍尘昂椭鲃?dòng)性。
簡單來說,如果你向這些模型提出一個(gè)簡單或開放式的問題,它們會(huì)給你一個(gè)簡單或通用的答案。這種答案可能缺乏深度或細(xì)節(jié),無法滿足所有需求。如果希望得到更為詳盡和深入的答案,那么提問的方式和策略就需要更為明智。
這其實(shí)是“Garbage in,Garbage out”原則在人工智能時(shí)代的一種體現(xiàn)。無論技術(shù)有多么先進(jìn),輸入的數(shù)據(jù)質(zhì)量仍然至關(guān)重要。如果輸入的數(shù)據(jù)是模糊、不準(zhǔn)確或不完整的,那么模型輸出的答案也可能同樣如此。
因此,為了確保LLM模型能夠給出高質(zhì)量、有深度的答案,需要確保輸入的數(shù)據(jù)是準(zhǔn)確、詳盡且上下文豐富的。這也意味著,數(shù)據(jù)質(zhì)量仍然至上。只有重視并確保數(shù)據(jù)的質(zhì)量,才能期望從這些先進(jìn)的模型中獲得真正有價(jià)值、有深度的信息。
6 把不確定性視為異常
每當(dāng)模型遇到不確定的情況,我們不能簡單地忽略它或給出一個(gè)模糊的答案。相反,我們應(yīng)該依賴于與用戶的互動(dòng)意圖來澄清這種不確定性。
在程序設(shè)計(jì)中,當(dāng)一組嵌套的提示中存在不確定性時(shí)——比如一個(gè)提示的結(jié)果可能有多種解讀,我們應(yīng)采取一種類似于“異常拋出”的策略。這意味著,應(yīng)該將這種不確定性傳遞到堆棧中的更高級(jí)別,直到到達(dá)一個(gè)可以與用戶交互或澄清不確定性的層級(jí)。
這樣的設(shè)計(jì)策略可以確保了程序在面對(duì)不確定性時(shí)能夠做出適當(dāng)?shù)幕貞?yīng),從而提供更為準(zhǔn)確和可靠的結(jié)果。
7 文本作為通用協(xié)議
文本已然成為了一種通用協(xié)議,這主要?dú)w功于LLM對(duì)于自然語言、意圖和語義的出色解析能力。因此,文本成為了在提示語、模塊以及基于LLM的服務(wù)之間傳遞指令的首選格式。
盡管自然語言在某些應(yīng)用場景下可能略顯不精確,但相較于其他結(jié)構(gòu)化語言(如XML),其優(yōu)點(diǎn)在于簡潔、直觀且易于人類理解。當(dāng)然,對(duì)于那些需要高度精確和結(jié)構(gòu)化的任務(wù),仍然可以少量地采用結(jié)構(gòu)化語言進(jìn)行輔助。但多數(shù)場景下,自然語言在傳遞指令和意圖方面表現(xiàn)得相當(dāng)出色。
更為值得一提的是,隨著這些基于LLM的普及和進(jìn)步,文本作為一種“未來證明”的自然交互方式,將進(jìn)一步促進(jìn)不同系統(tǒng)、不同提示之間的互通與理解。如果兩個(gè)完全不同的LLM服務(wù)都能夠理解和響應(yīng)相同的文本指令,那么它們之間的協(xié)作和交互將變得如同人類之間的溝通一樣自然、流暢。
將文本視為通用協(xié)議,不僅有助于我們更好地利用LLM的能力,也為構(gòu)建一個(gè)更加智能、更加互通的應(yīng)用程序打下了堅(jiān)實(shí)的基礎(chǔ)。
8 復(fù)雜問題,分解操作
當(dāng)面對(duì)一個(gè)復(fù)雜問題時(shí),不僅對(duì)人來說是一個(gè)挑戰(zhàn),對(duì)大模型而言也同樣如此。在實(shí)際應(yīng)用中,如果我們直接將復(fù)雜問題的提示語作為程序的一部分,可能會(huì)遇到問題,因?yàn)槲覀冋嬲枰闹皇峭评淼慕Y(jié)果。
為了解決這個(gè)問題,一種有效的方法是使用“元”提示。這種提示不僅可以給出問題,還能提供詳細(xì)的答案,然后要求模型從中提取關(guān)鍵信息。這種方法的效果會(huì)很好,因?yàn)樗鼘?shí)際上是將一個(gè)復(fù)雜的認(rèn)知任務(wù)轉(zhuǎn)化為了一個(gè)相對(duì)簡單的任務(wù)。想象一下,如果給一個(gè)人一個(gè)“閱讀這篇文章并找出答案”的任務(wù),即使該用戶沒有相關(guān)領(lǐng)域的專業(yè)知識(shí),他也很有可能完成這個(gè)任務(wù),因?yàn)樽匀徽Z言的力量是巨大的。
因此,在設(shè)計(jì)基于大模型的應(yīng)用時(shí),需要注意:對(duì)一個(gè)普通人來說很難的事情,對(duì)模型來說也可能同樣困難。面對(duì)這種情況,最好的策略往往是將復(fù)雜的問題或任務(wù)分解為更簡單的步驟。這樣不僅可以降低處理的難度,還能提高答案的穩(wěn)定性和準(zhǔn)確性。
9.凡有控制,皆有模型
模型不僅是一種工具,它也可以成為我們對(duì)抗自身錯(cuò)誤的利器。很多時(shí)候,我們?nèi)菀讓LM(大語言模型)的運(yùn)作想象成一個(gè)“頭腦”的內(nèi)部過程。然而,必須認(rèn)識(shí)到,盡管模型與人類思維在某些方面有相似之處,但二者之間仍存在許多有意義的差異。
這其中有一個(gè)特點(diǎn)尤為重要:模型在短時(shí)間的交互中往往缺乏持久記憶。這意味著,模型在從一分鐘到下一分鐘的交互中,不太可能記住所有的細(xì)節(jié)。這一特點(diǎn)為我們提供了某種控制的可能性。
這種控制不僅限于代碼審查。事實(shí)上,模型還可以作為代碼的安全監(jiān)視器,確保代碼的運(yùn)行安全;它也可以作為測試策略的一個(gè)組件,幫助我們制定更為有效的測試方案;甚至可以作為內(nèi)容過濾器,協(xié)助我們生成高質(zhì)量的內(nèi)容。
因此,只要我們對(duì)模型進(jìn)行適當(dāng)?shù)目刂坪鸵龑?dǎo),它就能成為我們工作中得力的“助手”。而這種控制的基礎(chǔ),就是我們對(duì)模型內(nèi)部機(jī)制和特點(diǎn)的深入了解和掌握。
10. 識(shí)別邊界,不要認(rèn)為大模型無所不能
大語言模型的能力確實(shí)令人驚嘆,它們可以處理和解析大量的文本數(shù)據(jù),生成有邏輯和連貫性的文本,甚至在某些任務(wù)上超越了人類的表現(xiàn)。然而,這并不意味著我們應(yīng)該盲目崇拜這些大模型,認(rèn)為它們無所不能。
事實(shí)上,大模型仍然存在著許多局限性和邊界。盡管它們可以處理大量的文本數(shù)據(jù),但它們并不能像人類一樣真正理解語言和語境的細(xì)微差別。此外,它們的表現(xiàn)也受到訓(xùn)練數(shù)據(jù)和算法選擇的限制,可能會(huì)出現(xiàn)一些偏見和錯(cuò)誤。
因此,我們在使用大模型時(shí),應(yīng)該保持理性和謹(jǐn)慎的態(tài)度,既要欣賞它們所帶來的便利和進(jìn)步,也要警惕它們的局限性和潛在風(fēng)險(xiǎn)。這樣,才能更好地利用這些模型,推動(dòng)基于大模型應(yīng)用的健康發(fā)展。