ChatGPT代碼生成飆升10%!北大華人一作:細(xì)化prompt,大幅改進(jìn)大模型代碼能力
在大模型時(shí)代,高質(zhì)量的代碼生成已經(jīng)強(qiáng)大到,讓人驚嘆。
從通過HumEval中67%測(cè)試的GPT-4,到近來各種開源大模型,比如CodeLlama,有望成為碼農(nóng)編碼利器。
然而,現(xiàn)實(shí)中,程序員們不會(huì)精煉表達(dá)需求,因此誤導(dǎo)、限制了LLM生成優(yōu)秀代碼的能力。
說白了,大模型代碼能力行不行,取決于你的提示妙不妙。
對(duì)此,來自北大實(shí)驗(yàn)室的研究團(tuán)隊(duì)提出了,通過與LLM聊天來細(xì)化需求的方法——ChatCoder。
論文地址:https://arxiv.org/pdf/2311.00272.pdf
具體來說,他們?cè)O(shè)計(jì)了一種聊天方案,大模型引導(dǎo)用戶細(xì)化需求表達(dá),進(jìn)而比以前更精確、更完整,同時(shí)提高了大模型的性能。
大模型是「碼農(nóng)」,你就是「產(chǎn)品經(jīng)理」
這里先舉個(gè)例子,如下圖,用戶提出了需求:
數(shù)據(jù)集#MBPP/443,要求ChatGPT編寫一個(gè)python函數(shù)從給定的列表中找到「最大的負(fù)數(shù)」。
基于原始需求,ChatGPT生成一個(gè)程序,該程序可以正確提取實(shí)際值最大的負(fù)數(shù)。
然而,sanitized-MBPP的作者認(rèn)為「最大負(fù)數(shù)」應(yīng)該是指「絕對(duì)值最大的數(shù)」。
因此由于「最大」這個(gè)表達(dá)不明確,導(dǎo)致LLM生成了錯(cuò)誤的代碼。
而這里,可以通過需求細(xì)化(requirements refinement)來解決這個(gè)問題。
需求細(xì)化就是揭示需求中的隱含依賴和隱藏結(jié)構(gòu)的過程。通過提供更多細(xì)節(jié),在需求細(xì)化的過程中可以補(bǔ)充不完整的信息,消除模糊不清的地方。
在前面舉的例子中,我們可以簡(jiǎn)單地向大語言模型說明「最大的」在這里特指「絕對(duì)值最大的」,揭示了「最大」這個(gè)詞的隱藏結(jié)構(gòu)。
有了這一改進(jìn)后的需求,大模型就可以生成符合MBPP作者期望的代碼。
不得不提的是,需求細(xì)化,需要人類用戶和大模型的協(xié)作。
一般來說,在需求工程的背景下,需求細(xì)化是通過軟件供應(yīng)商(編碼人員)和軟件客戶(用戶)之間的一系列交互來執(zhí)行的。
軟件供應(yīng)商分析客戶需求的初始表達(dá),并提出細(xì)化點(diǎn)。軟件客戶則需要根據(jù)這些點(diǎn)來作出響應(yīng),供應(yīng)商才能完成一輪需求細(xì)化。
無論是軟件客戶還是軟件供應(yīng)商,任何一方都不具備單獨(dú)進(jìn)行需求細(xì)化的資格。
這樣的劣勢(shì)在于,客戶通常不夠了解軟件設(shè)計(jì)和開發(fā)過程,無法撰寫可用的需求說明;而供應(yīng)商通常也不夠了解客戶的問題和業(yè)務(wù)領(lǐng)域,無法為滿意的系統(tǒng)制定需求。
而現(xiàn)在,在大模型時(shí)代,人類用戶是客戶,LLM是「供應(yīng)商」。
為了通過需求細(xì)化讓大模型生成更好地滿足用戶需求的代碼,就需要研發(fā)人類和LLM協(xié)作的方法。
ChatCoder:聊天細(xì)化,生成代碼
北大提出了ChatCoder,這是通過聊天進(jìn)行需求細(xì)化的大模型代碼生成的新方法。
整體框架如下圖,非常簡(jiǎn)潔,通過聊天來輔助LLM和人類在需求細(xì)化方面的協(xié)作。
關(guān)鍵是,如何與大型語言模型聊天。
ChatCoder便提供了一個(gè)全新的聊天模式,其設(shè)計(jì)靈感來自IEEE SRS。
接下來,我們具體看下ChatCoder這個(gè)框架。
其整體結(jié)構(gòu)是一個(gè)兩輪的對(duì)話。
第一階段:Paraphrase和Exend
由于人類用戶表達(dá)需求可能語意模糊、不完整,ChatCoder使用提示要求LLM從幾個(gè)角度解釋用戶的原始需求,即完整的需求規(guī)范必須清晰。
對(duì)于需要改進(jìn)的遺漏或有野心的論點(diǎn),ChatCoder讓大語言模型基于它從訓(xùn)練數(shù)據(jù)中獲得的假設(shè)來擴(kuò)展它們。
人類用戶需要查看細(xì)化的規(guī)范并糾正其中的錯(cuò)誤。
第二階段:Going-deep和Loop-back
在這一輪中,ChatCoder要求LLM詢問人類用戶,關(guān)于第一輪Paraphrase和Exend中信息損失,以及需要進(jìn)一步改進(jìn)的規(guī)范方面的困惑。
人類用戶需要回答這些問題,并回環(huán)糾正細(xì)化后的規(guī)范。
經(jīng)過兩輪細(xì)化后,得到細(xì)化后的需求,然后發(fā)送給大型語言模型,得到用戶想要的程序。
ChatGPT代碼能力10%
實(shí)驗(yàn)設(shè)置
數(shù)據(jù)集:Sanitized-MBPP、HumanEval。
基準(zhǔn):gpt-3.5-turbo、gpt-4。
研究問題
為了評(píng)估ChatCoder,研究人員提出并測(cè)試了以下研究問題:
1)與現(xiàn)有代碼生成模型相比,ChatCoder的表現(xiàn)如何?
2)ChatCoder是LLM和人類用戶交流以進(jìn)行需求細(xì)化的有效方法嗎?
3)人類參與ChatCoder帶來了多少改進(jìn)?
ChatCoder性能表現(xiàn)
首先我們來看第一個(gè)問題,主要是為了評(píng)估ChatCoder與基線相比的整體代碼生成性能。
如表1所示,ChatCoder通過大幅細(xì)化的需求,成功幫助LLM提高了其生成程序的執(zhí)行精度。
例如,對(duì)于gpt-3.5-turbo,其在Saniticed-MBPP上的pass@1從57.04%提高到71.25%,提升了14%。
橫向比較,對(duì)于gpt-3.5-turbo和gpt-4,Saniticed-MBPP上的性能改進(jìn)比HumEval上的更突出。
溝通效率的表現(xiàn)
第二個(gè)問題是,評(píng)估ChatCoder是否是大模型和人類進(jìn)行需求細(xì)化交流的有效方式。
根據(jù)表2,所有3種與LLM進(jìn)行需求細(xì)化的通信方法都有助于LLM改進(jìn)其代碼生成結(jié)果。
這一發(fā)現(xiàn)指出,任何形式的需求細(xì)化在應(yīng)用LLM生成代碼時(shí)都是有用和重要的。
與ChatCoder相比,F(xiàn)ree Paraphrase和Free QA不會(huì)指示LLM執(zhí)行某些類型的細(xì)化,從而導(dǎo)致較低的改進(jìn)。
人工干預(yù)評(píng)估
如下評(píng)估了人工干預(yù)對(duì)ChatCoder的重要性,結(jié)果見表3。
由于ChatCoder利用需求細(xì)化來提高大語言模型的代碼生成性能,因此人工干預(yù)是必要的,也是不可忽視的。
ChatCoder的過程是從給定的角度揭示需求的內(nèi)部結(jié)構(gòu),這些角度沒有明確表達(dá),即使有歧義。解決歧義的答案只有人類用戶知道。
案例研究
如下,作者提出了幾個(gè)真實(shí)的測(cè)試用例,說明ChatCoder如何幫助LLM生成具有細(xì)化需求的代碼。
由于頁面限制,研究人員從MBPP中選擇了3個(gè)案例,涵蓋了關(guān)于輸入、輸出和目的的細(xì)化,因?yàn)樗鼈冎苯佑绊懝δ苄枨蟆?/span>