大模型提示詞技術(shù)詳解(1)——Prompt結(jié)構(gòu)&少樣本學(xué)習(xí)
本文將深入探討提示詞的概念、組成和調(diào)優(yōu)技巧,以及樣本自動(dòng)構(gòu)建技術(shù)等方面的知識。通過引用相關(guān)論文和實(shí)踐案例,我們將揭示如何通過合理的提示詞設(shè)計(jì)提升大模型的回答質(zhì)量,并分享一些實(shí)用的設(shè)計(jì)技巧。無論你是AI產(chǎn)品經(jīng)理還是對提示詞感興趣的普通人,都可以在這篇文章中找到有價(jià)值的信息。
提示詞(Prompt)是指它通過向模型輸入特定的指令或問題,來增強(qiáng)模型的表現(xiàn),而無需對模型結(jié)構(gòu)本身進(jìn)行調(diào)整。這一概念隨著大型語言模型的發(fā)展而流行,并催生了一個(gè)新興的領(lǐng)域——提示詞工程(Prompt Engineering)。這一領(lǐng)域目前還處于早期探索階段,依賴于實(shí)踐和試錯(cuò)來發(fā)現(xiàn)有效的提示詞策略,屬于經(jīng)驗(yàn)科學(xué)的一種。
經(jīng)驗(yàn)科學(xué):在研究方法上,以歸納法為主,帶有較多盲目性的觀測和實(shí)驗(yàn)。一般科學(xué)的早期階段屬經(jīng)驗(yàn)科學(xué),化學(xué)尤甚。在恩格斯《自然辯證法》中,專指十八世紀(jì)以前搜集材料階段的科學(xué)。(百度百科)
一、我對提示詞的看法
- 提示詞的確有用
- 提示詞本質(zhì)上是一種“引導(dǎo)”,引導(dǎo)大模型說出他本來會的內(nèi)容。因?yàn)樗旧聿粫δP托阅苓M(jìn)行任何修改。所以本質(zhì)上來講不應(yīng)該叫“性能提升”,而是提升其“回答質(zhì)量”。
- Prompt調(diào)優(yōu)的效果因模型而異(甚至因版本而異),需要大量的實(shí)驗(yàn)。意味著同一套Prompt在遷移到其他模型的時(shí)候并不能保證它的效果。
- 提示詞的脆弱性:由于自然語言的復(fù)雜性,提示詞往往是離散的,難以精確優(yōu)化。這種脆弱性意味著很難為提示詞找到一個(gè)明確的最佳結(jié)構(gòu),通常需要通過大量實(shí)驗(yàn)和迭代來探索。
- 不要指望一個(gè)方法一勞永逸。網(wǎng)上的各種Prompt教程/大模型使用教程魚龍混雜,很多都缺乏基本的科學(xué)素質(zhì),即“開局一張嘴,內(nèi)容全靠編?!?,缺乏科學(xué)得證明“A方法就是比B方法好”。適合他的不代表適合你,他的最優(yōu)解更不可能是你的最優(yōu)解。理性看待,多做嘗試。適合自己的才是好的。
- 推薦一下DSPy。這是我覺得為數(shù)不多“科學(xué)”的Prompt調(diào)優(yōu)方式,還有xAI的PromptIDE看著也不錯(cuò)。
二、為什么要寫這個(gè)系列?
作為一個(gè)一直在關(guān)注工程實(shí)現(xiàn)而沒有深入研究提示詞的產(chǎn)品經(jīng)理,前一段時(shí)間的產(chǎn)品空窗期我重新研究了一下提示詞。
然后深感提示詞領(lǐng)域的混亂。我意識到提示詞領(lǐng)域存在許多混亂,各種術(shù)語和框架層出不窮,我相信許多人可能也有同樣的困惑。因此,我希望通過一系列文章來整理和分享我的知識體系,希望能對大家有所幫助。
這個(gè)系列會引用很多論文,主要是兩個(gè)原因,首先,部分章節(jié)會介紹一些專業(yè)知識(例如聚類算法),引用原論文可以提供權(quán)威參考;其次,許多結(jié)論源自論文,引用論文既是對原作者工作的尊重,也為我的論點(diǎn)提供了依據(jù)。我將努力確保每個(gè)觀點(diǎn)都有充分的論據(jù)支持。
曾經(jīng)有一個(gè)問題是AI產(chǎn)品經(jīng)理到底要不要看論文,我的看法是不用看,但了解總是有益的。學(xué)術(shù)論文的方法相比網(wǎng)上的文章往往具備以下特征:
- 專業(yè)性(論文由科研工作者撰寫,其研究方法和結(jié)論通常在相關(guān)數(shù)據(jù)集上經(jīng)過驗(yàn)證
- 嚴(yán)謹(jǐn)性(相比網(wǎng)上的文章,學(xué)術(shù)論文的研究和論證過程更為嚴(yán)謹(jǐn)。)
但是它對普通人不易讀,所以做出一些解讀還是很有必要的,提取一些關(guān)鍵點(diǎn)進(jìn)行分析。
整個(gè)系列的行文結(jié)構(gòu)參考今年6月份出的技術(shù)報(bào)告(Schulhoff, Sander, et al., 2024)。做了一些補(bǔ)充并加入了一些自己的理解。這篇論文很好,它對很多混亂概念進(jìn)行了梳理并重新定義。比如說Few Shot,在深度學(xué)習(xí)中通常是指少樣本學(xué)習(xí)(Few-Shot Learning)。Prompt工程中是指Few-Shot Prompting。兩者最大的差別就在于前者是會對模型進(jìn)行永久性修改(比如模型的參數(shù))而后者僅限于在一次對話中,重啟上下文后即會失效,對模型本身不會造成任何影響。
文章內(nèi)容還會參考網(wǎng)上的一些資料,由于參考過多無法一一引用。在此向所有研究Prompt領(lǐng)域的工作者致敬??,你們是大模型時(shí)代的先驅(qū)者。
三、適用讀者范圍
下面幾種人都可以在文章中各取所需
- AI產(chǎn)品經(jīng)理
- 對提示詞感興趣的普通人,希望能夠提升大模型的回答質(zhì)量?;蛘邩?gòu)建屬于自己的大模型。會講解一些普通人通用的簡單的設(shè)計(jì)技巧。
四、提示詞的組成
一個(gè)完整的提示詞通常可以由指令、示例、輸出格式、風(fēng)格、角色約定幾部分組成,它們并不需要同時(shí)存在,也并非所有場景都必須使用它們。
1. 指令
指令即用戶直接下達(dá)給大模型的命令。通常分為顯式指令以及隱式指令兩種。
顯式指令:直接提出問題
告訴我歷史上是誰統(tǒng)一了六國?
模型回答:
秦始皇。
隱式指令:給大模型一些示例,讓其自動(dòng)判斷該輸出什么。隱式指令更像“找規(guī)律”,讓模型來自動(dòng)判斷如何輸出。例如下面是一個(gè)將英語翻譯成西班牙語的場景
用戶輸入:
Night:Noche Morning:
模型回答:
Morning:Ma?ana
2. 示例
通常會使用*-Shot來表示,即提供給大模型的完成任務(wù)的示例,幫助其更好理解你的任務(wù)。上面的示例就屬于一個(gè)One-Shot場景(即提供一個(gè)事例)。當(dāng)場景足夠簡單、事例充分的情況下,大模型不需要你為他提供明確的指令,就可以得到你想要的答案。(參考上面的隱式指令場景)。*-Shot通常分為如下幾種情況:
1)Many-Shot
多實(shí)例上下文學(xué)習(xí),指提供多個(gè)(沒有具體的標(biāo)準(zhǔn))示例來輔助大模型理解
2)Few-Shot
提供少量示例,比如1-3個(gè)輔助大模型理解。
3)Zero-Shot
不提供示例,讓模型直接回答問題。
這一部分也通常稱為ICL(In-Context Learning)上下文學(xué)習(xí)。通常來講Zero-Shot場景是對模型性能要求最高的,也是各家大模型的優(yōu)化重點(diǎn)。GPT4相比GPT3.5很明顯的能力提升就在于它在Zero-Shot場景下的性能,這往往也代表著其語義理解能力更強(qiáng)。
五、輸出格式約定
這一部分通常是指定模型的輸出格式,例如
…,請以MarkDown的形式輸出回答。
這么想的話你倒是可以拿大模型做為一個(gè)格式刷:)
六、風(fēng)格約定
風(fēng)格即指定大模型的輸出風(fēng)格,是一種非常常用的模型輸出優(yōu)化方式。
請以通俗易懂,略帶風(fēng)趣的方式來解釋地球?yàn)槭裁磭@太陽旋轉(zhuǎn)。
模型回答:
讓我們來聊聊太陽和地球這對宇宙中的好基友。想象一下,你手里拿著一個(gè)網(wǎng)球,然后你用繩子把它系住,開始旋轉(zhuǎn)。網(wǎng)球因?yàn)槔K子的牽引,不得不跟著你轉(zhuǎn)圈圈。這其實(shí)和地球圍繞太陽轉(zhuǎn)是一個(gè)道理。
七、角色約定
為大模型設(shè)置一個(gè)角色,這點(diǎn)與上一部分的風(fēng)格約定通常都被用來改善模型輸出的風(fēng)格。
你是一個(gè)經(jīng)驗(yàn)豐富的家庭教師,正在教一個(gè)二年級的小學(xué)生。請解釋一下地球?yàn)槭裁磭@太陽旋轉(zhuǎn)。
模型回答:
好的,想象一下你在公園里玩陀螺。你用繩子把陀螺繞起來,然后快速一拉,陀螺就會在地面上旋轉(zhuǎn)起來,對吧?地球圍繞太陽轉(zhuǎn)的原理和這個(gè)有點(diǎn)像。首先,地球和太陽都非常非常重,太陽比地球重好多好多。很久以前,當(dāng)太陽系形成的時(shí)候,地球和其他行星都是圍繞著太陽旋轉(zhuǎn)的。這就像你把陀螺的繩子一拉,它就開始轉(zhuǎn)起來一樣…..
八、少樣本提示(Few-Shot Prompting)
大模型的記憶是有限的,它的記憶容量被稱為上下文窗口(Context Window),決定了模型能夠捕捉信息的范圍。例如,GPT-4 Turbo擁有128k個(gè)Token的上下文窗口,相當(dāng)于超過300頁的文本,這使得它能夠生成更符合對話語境的回復(fù)。而上下文學(xué)習(xí)(In-Context Learning,ICL)是指一種不需要對模型進(jìn)行訓(xùn)練,在Prompt中通過給予示例以及說明來讓模型提高模型的預(yù)測性能。但是這種性能提升其實(shí)并非“學(xué)習(xí)到的”,更像是一種激活。激活模型原有的記憶。
少樣本提示(Few-Shot Prompting)參考上面的*-Shot介紹。尤其需要注意這里和深度學(xué)習(xí)中的Few-Shot Learning存在本質(zhì)區(qū)別,F(xiàn)SP并不會對模型參數(shù)進(jìn)行調(diào)整,它的提升僅限于當(dāng)前的上下文窗口中。
1. 通用的示例設(shè)計(jì)/選取原則
為大模型提供或構(gòu)建示例的方式對其性能有顯著影響。不當(dāng)?shù)氖纠赡軙?dǎo)致模型產(chǎn)生嚴(yán)重的誤解。以下是六個(gè)關(guān)鍵因素。
2. 示例數(shù)量
通常我們直覺上認(rèn)為給大模型更多的示例,可以讓其性能更好。但是考慮到客觀條件,一方面大模型受到上下文長度限制。另一方面,不好的示例會成為噪音,從而將會降低大模型的性能。此外,在部分場景下過多的示例對性能提升并無幫助(Zhao et al., 2024)。
3. 示例順序
事例的順序可能會影響模型的表現(xiàn),在某些極端場景下,不同的順序甚至?xí)鼓P突卮饻?zhǔn)確率從低于50%到90%+不等(Lu et al. , 2024)。這個(gè)地方可以使用人工排列組合,也可以采用下一小節(jié)樣本自動(dòng)構(gòu)建技術(shù)中的一些方法。注意:該順序也可能是不具有泛用能力的,遷移到另一個(gè)大模型可能會導(dǎo)致性能下降。
4. 標(biāo)簽的分布
標(biāo)簽(label)類似于傳統(tǒng)的機(jī)器學(xué)習(xí)中的概念。當(dāng)我們訓(xùn)練機(jī)器學(xué)習(xí)模型時(shí),我們通常會給模型提供很多示例,每個(gè)示例都有一個(gè)標(biāo)簽,告訴模型這個(gè)示例屬于哪個(gè)類別。如果我們提供給大模型的示例中,某個(gè)類別的樣本數(shù)量很多,而另一個(gè)類別的樣本數(shù)量很少,那么大模型的回答將會更偏向于第一個(gè)類別。所以在進(jìn)行示例采樣時(shí)應(yīng)該綜合考慮。
5. 標(biāo)簽的準(zhǔn)確性
這點(diǎn)的影響目前還不確定,但是可以確定的點(diǎn)在于較大的模型通常更擅長處理不正確或不相關(guān)的標(biāo)簽。能不錯(cuò)還是不要錯(cuò)。
6. 示例格式
示例的格式會對模型的回答質(zhì)量造成影響,常用的格式例如“Q:{input},A:{label}”并沒有所謂的“最佳格式”,需要去根據(jù)具體場景進(jìn)行實(shí)驗(yàn)。
7. 示例相似性
提供的示例的相似性也會對模型回答質(zhì)量造成影響,但是具體的影響目前也不確定。有的場景下選擇更多相似的示例可能會提升回答質(zhì)量,而有的場景下多樣化的示例則表現(xiàn)更好。一般來講認(rèn)為多樣化的示例會使得模型表現(xiàn)更好。
九、樣本自動(dòng)構(gòu)建技術(shù)
目前,手動(dòng)構(gòu)建樣本的方法還處于相對原始的階段,類似于“刀耕火種”,主要依賴于人的主觀判斷。為了提高樣本的質(zhì)量,可以參考前面提到的幾個(gè)關(guān)鍵因素,并進(jìn)行多次測試以優(yōu)化樣本。此外,目前也有一些研究致力于開發(fā)自動(dòng)化構(gòu)建Few-Shot樣本的技術(shù)。
如果我們有一個(gè)示例庫,并希望從中動(dòng)態(tài)構(gòu)建有效的提示詞(Prompt),這是一個(gè)非常實(shí)際且常見的應(yīng)用場景。例如,在法律文書編寫領(lǐng)域,我們需要為大模型提供與當(dāng)前案件相似的文書示例,以輔助模型進(jìn)行更準(zhǔn)確的分析。這要求我們能夠從示例庫中智能地選擇和構(gòu)建相關(guān)的樣本,以提高模型的理解和預(yù)測能力。
這里介紹幾個(gè)常用的樣本自動(dòng)構(gòu)建技術(shù)。
1. K-NN(K-近鄰算法)
非常經(jīng)典的聚類算法,每次在特征空間中選取k個(gè)與輸入樣本最接近的訓(xùn)練樣本。但其對計(jì)算資源的消耗以及時(shí)間需求都很高,如果在提升生成階段使用將會一定程度影響使用體驗(yàn)。
2. Vote-K(Su et al., 2022)
在第一階段通過嵌入模型(SBert)來構(gòu)建一個(gè)有向圖。其中每個(gè)節(jié)點(diǎn)都指向其k最近鄰。然后從一組選定的樣本開始計(jì)算評分。在第二階段對第一階段對結(jié)果進(jìn)行人工標(biāo)注,在進(jìn)行Prompt Retrieval時(shí)計(jì)算所有標(biāo)注樣本和測試樣本的余弦相似度即可。
3. SG-ICL(Kim et al., 2022)
自生成上下文學(xué)習(xí) (Self-Generated In-Context Learning,SG-ICL)利用大模型本身來自動(dòng)生成示例,效果嘛….不好說??紤]到大模型對指令的理解偏差,可能會進(jìn)一步放大誤差。讓我想到了前段時(shí)間Nature發(fā)的那篇論文,利用AI生成的數(shù)據(jù)繼續(xù)訓(xùn)練大模型會導(dǎo)致模型的迅速退化(Shumailov et al., 2024)。
其他還有基于Q-Learning、基于對比學(xué)習(xí)以及基于主動(dòng)學(xué)習(xí)的樣本構(gòu)建技術(shù)。這些方法目前研究性仍然不足,暫不列舉出來。
簡單總結(jié)一下,F(xiàn)ew-Shot是一種常見的提示詞調(diào)優(yōu)技術(shù)。一般來說,示例選取最好保持多樣化,同時(shí)應(yīng)該具有較強(qiáng)的隨機(jī)性(順序,內(nèi)容…)以避免大模型發(fā)現(xiàn)了“規(guī)律”從而影響回答質(zhì)量。
參考文獻(xiàn)
[1]Schulhoff, Sander, et al. “The Prompt Report: A Systematic Survey of Prompting Techniques.” arXiv preprint arXiv:2406.06608 (2024).
https://arxiv.org/abs/2406.06608
[2]Zhao, Hao, et al. “Is In-Context Learning Sufficient for Instruction Following in LLMs?.” arXiv preprint arXiv:2405.19874 (2024).
https://arxiv.org/abs/2405.19874
[3]Lu, Yao, et al. “Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity.” arXiv preprint arXiv:2104.08786 (2021).
https://arxiv.org/abs/2104.08786
[4]Su, Hongjin, et al. “Selective annotation makes language models better few-shot learners.” arXiv preprint arXiv:2209.01975 (2022).
https://arxiv.org/abs/2209.01975
[5]Kim, Hyuhng Joon, et al. “Self-generated in-context learning: Leveraging auto-regressive language models as a demonstration generator.” arXiv preprint arXiv:2206.08082 (2022).
https://arxiv.org/abs/2206.08082
[6]Shumailov, Ilia, et al. “AI models collapse when trained on recursively generated data.” Nature 631.8022 (2024): 755-759.
https://www.nature.com/articles/s41586-024-07566-y
本文由@阿茶的AI之路 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自 Unsplash,基于CC0協(xié)議。
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)。
- 目前還沒評論,等你發(fā)揮!