摘要:人類想要與計算機溝通就對編程語言的語法和結(jié)構(gòu)有一定的了解。隨著自然語言處理技術的發(fā)展,讓計算機聽懂人類語言不再是夢想。ChatGPT的應用催生了Prompt(提示工程),Prompt可以直接使用自然語言表達用戶的意圖,大大降低了編程的門檻。文章從編程語言發(fā)展歷程,了解Prompt原理和應用,在自然語言處理時代,編程的邊界在擴大。
關鍵詞:NLP; prompt;ChatGPT;編程語言;編程范式
中圖分類號:TP318 文獻標識碼:A
文章編號:1009-3044(2024)27-0015-04
1 早期編程語言
目前編程語言有數(shù)百種,每種語言有其獨特的特性,軟件開發(fā)使用哪種編程語言,對軟件性能、可讀性和移植性都有影響,選擇合適的語言不僅僅是個人偏好的問題。無論你在編程方面有無經(jīng)驗,選擇一種合適的語言來學習至關重要。合適的語言將幫助你快速創(chuàng)建功能強大的應用系統(tǒng)。
編程語言是人類為了方便計算機理解和執(zhí)行而創(chuàng)造的一種工具。隨著計算機技術的不斷發(fā)展,編程語言也在不斷地發(fā)展和演變,如圖1所示。
早期編程語言經(jīng)歷了“面向機器、面向過程、面向問題”三種編程范式。
1.1 面向機器的編程語言
1) 機器語言。
機器語言是第一代編程語言。所謂的機器語言,就是計算機能直接識別的語言格式,計算機屬于電子元器件,最容易識別的兩種狀態(tài)就是“1”和“0”。例如:101代表數(shù)字5,其他的內(nèi)容也是如此。
但對于程序員來講,這差不多就相當于是在看“天書”。那么有沒有辦法能夠讓程序員更容易地讀懂計算機中的數(shù)據(jù)呢?答案是肯定的!這就好比我們要和外國人交流,你聽不懂外國人在講什么,我們就可以找一個翻譯,在程序中我們所找的這位“翻譯官”,就是所謂的第二代語言。
2) 匯編語言。
第二代編程語言是匯編語言。這種語言相當于是對機器語言的封裝,畢竟1010的組合太難記了,所以就產(chǎn)生了匯編這種中間層語言。
當然,匯編語言對于程序員來講,也不是特別的友好,因為它的語法結(jié)構(gòu)還有很大的改進空間。舉個例子,用匯編語言做算數(shù)運算時,可以使用ADD代表加法運算,SUB代表減法運算,諸如此類。但如果能直接使用“+”“-”符號來進行計算,可讀性方面則會更好,第三代編程語言應運而生。
1.2 面向過程的編程語言
從程序員的編碼角度來說,去除了各種晦澀難懂的匯編語法,這就極大提高了程序員的開發(fā)效率。出現(xiàn)了大量的高級語言,主要是面向計算過程,它歷史悠久,流傳很廣,有大量的已開發(fā)的軟件庫,擁有眾多的用戶, 為人們所熟悉和接受。屬于這類語言的有 FORTRAN、COBOL、BASIC、ALGOL、C等。
這些高級語言都是屬于第三代語言,也稱為結(jié)構(gòu)化編程范式或模塊化編程范式,程序主要由三種基本程序結(jié)構(gòu)構(gòu)成:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),如圖2所示。
給大家舉個例子:如果我的錢多于100元,那么今天就打車上班。這個案例的C語言代碼可以描述成下面的樣子:
int money=500; //這是我錢包的500元
if(money>=100){ //判斷錢大于100元,則進入{}執(zhí)行語句
scanf("有錢,打車上班"); //執(zhí)行打車的語法輸出}
}
相信只要有一點C編程和英語基礎,都能看懂上面的語法,所以高級語言相比前面的機器語言和匯編語言有更強的可讀性、邏輯性。
1.3 面向問題的編程語言
什么是問題呢?需要解決的事情就是問題。一個問題可以由幾個較小的問題組成,一個較小的問題也可以由更小的問題組成,直到那個小問題可以一步解決。
傳統(tǒng)的面向過程編程要完成一項功能(大的問題)需要大量的代碼,但是許多代碼并不是直接和這項功能有關,而是用于完成細微的工作 (較小的問題)。以編寫“郵件發(fā)送程序”為例子,編程者需要檢查網(wǎng)絡情況、連接服務器;又要編寫界面,處理 用戶動作,因此需要大量的代碼。如果用面向過程的C語言編寫,至少要100行代碼,并且只有專業(yè)的人才能看懂,而用面向問題語言(如:Angela語言),只要用到一個“黑箱”:SENDEM,以及相關的參數(shù)(發(fā)件人賬戶用戶名、發(fā)件人賬戶密碼、收件人賬戶用戶名、郵件標題、郵件正文、郵件附件),用三行代碼就可以了:
Program SENDEMTEST
SENDEM:[發(fā)件人賬戶用戶名],[發(fā)件人賬戶密碼],[收件人賬戶用戶名],[郵件標題],[郵件正文],[郵件附件]
END
面向問題的編程語言包括面向?qū)ο蟆⒑瘮?shù)式、聲明式編程語言。
2 面向人工智能的編程語言
人工智能(Artificial Intelligence,AI) 旨在模擬和實現(xiàn)人類智能的理論和方法。它涉及對語言、學習、推理、問題解決和決策等人類智能的模擬和應用。在人工智能系統(tǒng)開發(fā)過程中,有幾種主要的編程語言被廣泛應用,本質(zhì)上面向人工智能的編程語言也是面向問題的。
1)Python是目前人工智能領域最受歡迎的編程語言之一。Python語言簡潔、易讀易寫,擁有豐富的第三方庫和開發(fā)工具,使得它成了人工智能開發(fā)的首選語言。Python 的庫和工具如Numpy、Pandas、Scikitlearn和TensorFlow等提供了強大的數(shù)據(jù)處理、機器學習和深度學習功能,能夠幫助開發(fā)者快速實現(xiàn)各種人工智能算法。
2)R語言是專門用于統(tǒng)計分析和數(shù)據(jù)可視化的編程語言,也被廣泛應用于人工智能領域。R語言提供了豐富的統(tǒng)計分析和機器學習的函數(shù)庫,如caret、e1071和randomForest等,使得開發(fā)者可以方便地進行數(shù)據(jù)挖掘和建模。
除了上述的主要編程語言外,還有一些其他語言也在人工智能開發(fā)中得到了應用。例如,Lisp語言是最早用于人工智能研究和開發(fā)的編程語言之一,它的函數(shù)式編程特性使其適合于符號推理和專家系統(tǒng)的開發(fā)。而Prolog語言則主要用于邏輯推理和知識表示的領域。
總結(jié)起來,Python、R以及Lisp和Prolog等編程語言都在人工智能的開發(fā)中發(fā)揮著重要的作用。開發(fā)者可以根據(jù)自己的需求和項目特點選擇合適的編程語言來實現(xiàn)人工智能算法。無論選擇哪種編程語言,都需要結(jié)合相應的庫和工具來提供強大的功能支持,以便更好地實現(xiàn)人工智能的目標。
3 面向用戶的編程語言
3.1 Prompt 編程
ChatGPT中的Prompt被稱為面向用戶的編程語言。如何通過設計和優(yōu)化Prompt來提高模型的準確性和可用性?如何通過選擇和設計恰當?shù)腜rompt來引導模型更好地理解用戶需求和任務,生成更加準確、自然、連貫的文本就變成了一門全新的編程范式。
假設讓你編寫一個Python代碼,實現(xiàn)“生成和發(fā)送通知郵件”。如果用傳統(tǒng)的編程范式(第一代、第二代、第三代),不知有多少人能徒手編寫出來,如果使用Prompt:請編寫“用于生成和發(fā)送通知郵件Python 代碼”,結(jié)果如圖3所示。
讀者會有個疑問:Prompt不但能寫代碼,還能寫詩、繪畫、回答問題,那Prompt不是編程語言。在自然語言處理時代,程序設計的邊界需要擴大,不是傳統(tǒng)意義上的邏輯問題編程,而Prompt更擅長非邏輯問題的編程。
3.2 Prompt 原理
受到ChatGPT工作的啟發(fā),很多人開始探索在訓練數(shù)據(jù)很少甚至不存在的情況下,通過將下游任務修改為語言生成任務,來獲得相對較好的模型,如圖4 所示。
圖4左側(cè)預訓練+微調(diào)范式。對于下游不同的任務A、B、C,會對11B量級參d7dd7392d2f05553d0877b78c04f6f5039cf787af98a754e285dd968d8bc2928數(shù)的預訓練模型分別進行微調(diào),得到3個微調(diào)之后不同的11B模型,核心是讓預訓練模型來適配下游任務。而圖4右側(cè)Prompt范式,針對三個不同的下游任務只使用同一個預訓練模型來構(gòu)建任務,省去了微調(diào)的步驟,核心是讓下游任務來適配預訓練模型,這樣可以充分利用已經(jīng)訓練好的預訓練模型,大大提升預訓練模型的使用效率。
3.3 Prompt 構(gòu)建方法
通用的Prompt構(gòu)建方法是:
扮演角色+具體任務+完成任務的步驟+約束條件+目標+輸出格式
例如:“我希望你能擔任一位AI寫作導師。我會提供一個需要改善寫作技巧的學生,你的任務是利用人工智能工具,如自然語言處理,為學生提供反饋,指導他如何改進他的作文。你還應該運用自己的修辭知識和寫作技巧經(jīng)驗,建議他如何更好地書寫自己的思想和觀點。我的第一個請求是‘我需要有人幫我編輯文章的第一段,并在文章后用列表的方式列出你的修改意見?!?/p>
扮演角色:可以是前端設計師、作家、評論員、詩人等各種角色,這一步的目的是使ChatGPT快速且準確地了解任務領域。具體任務:簡單清晰地描述任務。
完成任務的步驟:希望ChatGPT實現(xiàn)任務時所采取的步驟,當任務較為復雜時使用。
約束條件:不要解釋、不要評論、不要修改原始文本等約束語。
目標:希望ChatGPT完成的目標。
輸出格式:ChatGPT除了各種文字的格式,還可以輸出列表等格式。
使用主要有以下三種Prompt模式:
1) 指令模式。
在這種模式下,我們給模型提供一些明確的指令,模型需要根據(jù)這些指令生成文本。這種模式通常用于生成類似于技術說明書、操作手冊等需要明確指令的文本。指令可以是單個句子或多個段落,具體取決于任務的要求。
Prompt:給我推薦三中文的科幻小說,推薦格式:(1) 書名;(2) 作者;(3) 主要內(nèi)容;(4) 推薦理由。
2) 代理模式。
代理模式是指用戶可以要求 ChatGPT 以特定的身份、角色或者身份扮演某個特定的人、角色或?qū)ο髞砩苫卮?。這種模式通常用于模擬某個特定人物的語言風格和語境,生成特定情境下的對話、回答或其他形式的文本。如:描述秋天,小學生、大學生、老年人的不同身份,內(nèi)容是有很大的不同,AI對身份和角色的把握還是很準確的。因此,在提問前告訴你的身份很重要。下面是一些扮演的例子。
Prompt1:我希望你充當 Linux 終端。我會輸入命令,你會用終端應該顯示的內(nèi)容回復我。我希望你只回復唯一的代碼塊內(nèi)終端輸出,不要寫解釋,除非我要求你這樣做。當我需要用英語告訴你一些事情時,我會用花括號 {像這樣}。我的第一個命令是 pwd。
Prompt2: 我希望您充當英語翻譯官、拼寫糾正器和改進者。我會用任何語言與您交談,您將檢測語言,翻譯它,并在英語中回答我更正和改進后的文本。我希望您用更優(yōu)美、更優(yōu)雅、更高級的英語單詞和句子替換我的簡化 A0 級別的單詞和句子。保持意思相同,但使它們更具文學性。我希望您只回復更正和改進的內(nèi)容,不要寫解釋。我的第一個句子是“istan?bulu cok seviyom burada olmak cok guzel”。
Prompt3: 我希望您充當面試官。我將成為應聘者,您將為我提出該職位的面試問題。我希望你只回答作為面試官。不要一次性寫下所有對話。我只想和你進行面試。請如同面試官一樣一個一個地問我問題,等待我的回答。不要寫解釋。我的第一個句子是“你好”。
Prompt4:我希望您充當基于文本的 Excel。您將只向我回復基于文本的 10 行 Excel 表格,行號和列字母作為列(A 到 L)。第一列的標題應為空以引用行號。我會告訴你要寫入哪些單元格,你只會以文本形式回復 Excel 表格的結(jié)果,不要寫解釋。不要寫公式,您將執(zhí)行公式,只回復 Excel 表格的結(jié)果。首先,請回復我空表格。
3) 示例模式。
在這種模式下,我們給模型提供一些示例文本,模型需要生成與示例文本類似的文本。這種模式通常用于生成類似于給定示例的文本,例如自動生成電子郵件、產(chǎn)品描述、新聞報道等。示例文本可以是單個句子或多個段落,具體取決于任務的要求。
這個模式就是大家拿胡總開涮的那個模板,我也用這個模板寫篇文章:
Prompt:為了用好ChatGPT等AI工具,最近大家都在學習Prompt的知識,很多人廢寢忘食,請參照下面的格式寫一段話:近期互聯(lián)網(wǎng)上出現(xiàn)了__,放牛娃也看到__,知道大家很__,放牛娃忍不住啰嗦幾句,雖然確實存在部分__,但是_ ,最后放牛娃呼吁__。
答:近期互聯(lián)網(wǎng)上出現(xiàn)了對Prompt的學習熱潮,放牛娃也看到很多人為了用好ChatGPT等AI工具而廢寢忘食地學習Prompt的知識,知道大家很認真地在探索和學習這項新技術。放牛娃忍不住啰嗦幾句,雖然學習Prompt確實是使用AI工具的前提之一,但更重要的是要理解自己的需求和問題,將Prompt和AI 工具結(jié)合起來,才能發(fā)揮出AI工具的最大價值。此外,我們還需要注意數(shù)據(jù)的質(zhì)量和隱私保護,以及與AI工具交互的方式和方法等方面。最后放牛娃呼吁大家要保持學習的熱情,并在實踐中不斷總結(jié)和提高,讓AI技術更好地為我們服務。
在應用中,也可以是這幾種的變種或是組合。
4 結(jié)束語
隨著自然語言處理技術的不斷發(fā)展,使用不同Prompt所構(gòu)建的全新應用正在快速進入人們的視野。Prompt工程師的未來發(fā)展前景非常廣闊。
每種語言都有其所長。最適合你的語言取決于你的項目要求、你對該語言的熟悉程度以及所需的性能。首先確定項目的要求,然后考慮你對哪些語言比較熟悉,最后考慮每種語言提供的性能。
盡管Prompt方法在很多領域都取得了成功,但是Prompt的理論還不完善,使得人們很難了解Prompt為什么能達到好的效果,又為什么在自然語言中意義相近的Prompt有時效果卻相差很大。
參考文獻:
[1] Pre-train, Prompt.Predict: A Systematic Survey of PromptingMethods in Natural Language Processing[R/OL]. 2021.https://arxiv.org/abs/2107.13586.
[2] Sylvestre-Alvise Rebuffi, Hakan Bilen, and Andrea Vedaldi.Learning multiple visual domains with residual adapter[J]. InAdvances in Neural Information Processing systems,2023, 30:506-516.
[3] Homepage NLPedia.[EB/OL].[2023-06-24].http://pretrain.nl?pedia.ai/.[4] Ian Tenney, Patrick Xia, Berlin Chen, Alex Wang, Adam Po?liak, R. Thomas McCoy, Najoung Kim, Benjamin Van Durme,Samuel R. Bowman, Dipanjan Das, and Ellie Pavlick. What doyou learn from context? Probing for sentence structure in con?textualized word representations[C]//In 7th International Con?ference on Learning Representations, New Orleans, LA, USA,2023,5:6-9.
[5] LIU Y L,LI H L,BAI X,et al.A brief analysis of ChatGPT:histori?cal evolution,current applications,and future prospects[J].Jour?nal of Image and Graphics,2023,28(4):893-902.
【通聯(lián)編輯:朱寶貴】