提示工程:更好地釋放LLM的能力
提示工程,正如其名,主要聚焦于探究如何創(chuàng)作提示詞。
存在提示工程的一個(gè)關(guān)鍵緣由在于,大模型在不同人群的視角下所發(fā)揮的作用差異顯著。普通使用者往往僅將大模型視作聊天機(jī)器人,他們著重關(guān)注的是大模型能否迅速且精準(zhǔn)地予以反饋。就像我們之前提及的提示詞公式,其足以應(yīng)對(duì)絕大多數(shù)日常使用情境。
然而在開(kāi)發(fā)者的視野里,他們期望大模型具備處理復(fù)雜任務(wù)場(chǎng)景的能力。例如當(dāng)下眾多 Agent 背后所依托的技術(shù),便是借助大模型的推理能力推斷出下一步行動(dòng),而這一過(guò)程高度依賴(lài)提示詞的精心編寫(xiě)。
多數(shù)人是先知曉 ChatGPT,而后才了解提示詞,進(jìn)而認(rèn)識(shí)提示工程。實(shí)際上,提示工程并非在 GPT 風(fēng)靡之后才出現(xiàn)的新技術(shù)。它最早源自自然語(yǔ)言處理(Natural Language Processing,簡(jiǎn)稱(chēng)為 NLP)領(lǐng)域。當(dāng)時(shí)人們就察覺(jué)到,在任務(wù)執(zhí)行進(jìn)程中,若能給予 AI 適宜的引導(dǎo),AI 便能更為精準(zhǔn)地領(lǐng)會(huì)我們的意圖,并遵循指令作出響應(yīng)。于是,怎樣對(duì) AI 進(jìn)行有效引導(dǎo)便成為眾多研究者的探索方向,提示工程也就此應(yīng)運(yùn)而生。
在 GPT 廣泛流行之后,人們驚喜地發(fā)現(xiàn)相同的技術(shù)對(duì)大模型同樣行之有效,所以越來(lái)越多的人開(kāi)始將目光投向提示工程。
從技術(shù)本質(zhì)來(lái)講,為大模型提供的背景信息越豐富,就越有利于大模型理解我們的意圖,而我們向大模型傳遞信息的主要途徑便是借助提示詞。從某種程度而言,之前所闡述的提示詞公式可被視為提示詞工程的一個(gè)典型示例,依據(jù)此公式,我們能夠?yàn)榇竽P吞峁┢渫评硭匦璧母黝?lèi)信息。
至此,大家應(yīng)該已經(jīng)對(duì)提示工程有了一個(gè)初步的認(rèn)知。接下來(lái),就讓我們一同來(lái)了解幾個(gè)提示工程中的典型技術(shù)。
零樣本提示(Zero-Shot Prompting)
前面我們說(shuō)過(guò),大模型的一個(gè)特點(diǎn)是知識(shí)豐富,所以,大模型本身是知道很多東西的。我們就可以利用這個(gè)特點(diǎn),讓它幫我們做一些通用的事情。在這種情況下,我們不需要給大模型過(guò)多的信息提示,這種提示詞的寫(xiě)法稱(chēng)為零樣本提示(Zero-Shot Prompting)。
我們來(lái)看一個(gè)例子:
圖片
在當(dāng)前這個(gè)實(shí)例當(dāng)中,我們期望大模型執(zhí)行一項(xiàng)文本分類(lèi)的任務(wù),即判定文本內(nèi)容究竟屬于中性、負(fù)面還是正面類(lèi)別??梢悦黠@看出,大模型自身已然知曉分類(lèi)的概念,并且清楚應(yīng)當(dāng)如何依據(jù)文本內(nèi)容來(lái)評(píng)判其情感傾向。因此,在這個(gè)特定的例子里,即便我們未額外提供更多的提示信息,大模型也能夠出色地完成分類(lèi)任務(wù)。
零樣本提示在提示工程領(lǐng)域?qū)儆谙鄬?duì)易于理解的一項(xiàng)技術(shù),它尤其適用于較為簡(jiǎn)單的任務(wù)場(chǎng)景。舉例來(lái)說(shuō),某些簡(jiǎn)單的查詢操作便能夠運(yùn)用零樣本提示來(lái)達(dá)成。在此過(guò)程中,我們所需做的僅僅是對(duì)提示詞加以適當(dāng)調(diào)整,從而使大模型能夠更為精準(zhǔn)地返回我們所期望的內(nèi)容。
不過(guò),在某些情況下,我們所面臨的任務(wù)并非具有普遍通用性,此時(shí)零樣本提示便難以發(fā)揮作用。于是,我們可以向大模型提供一些具體的例子,以此助力大模型更好地理解任務(wù)要求,而這便是我們接下來(lái)即將探討的另一項(xiàng)提示技術(shù) —— 少樣本提示。
少樣本提示(Few-Shot Prompting)
雖然大模型知識(shí)豐富,但它并不是無(wú)所不知的,尤其是它對(duì)我們要完成的工作甚至是一無(wú)所知的。這時(shí),我們只要給它一些例子,幫助它理解我們的工作內(nèi)容,它就能很好地進(jìn)行推理。下面是一個(gè)例子:
圖片
在該示例中,老師需要依據(jù)學(xué)習(xí)成績(jī)來(lái)規(guī)劃學(xué)生的假期活動(dòng),而活動(dòng)的詳細(xì)內(nèi)容大模型預(yù)先無(wú)從知曉。在此情形下,我們運(yùn)用了少樣本提示方法,即提供了若干具體實(shí)例:對(duì)于成績(jī)?cè)?85 分及以上的學(xué)生,安排預(yù)習(xí)下學(xué)期課程;成績(jī)處于 60 至 85 分區(qū)間的,要求完成假期作業(yè);成績(jī)低于 60 分的,則需復(fù)習(xí)本學(xué)期課程內(nèi)容。
有了這些示例后,我們便可向大模型提出具體問(wèn)題:小剛的期末成績(jī)?yōu)?74 分,那么他的假期活動(dòng)應(yīng)當(dāng)是什么?大模型參照我們給出的實(shí)例進(jìn)行推理,進(jìn)而得出結(jié)論:小剛的期末成績(jī)是 74 分,其假期活動(dòng)應(yīng)為完成假期作業(yè)。
或許看到此例,你會(huì)心生疑惑,我們?yōu)楹螘?huì)以這樣的方式與大模型交流呢?實(shí)際上,這并非我們?nèi)粘5牧奶炷J?,而是一種應(yīng)用的構(gòu)建方式。我們會(huì)將前面的示例作為提示詞的固定組成部分,而后面的問(wèn)題則依據(jù)用戶的實(shí)際提問(wèn)進(jìn)行拼接。在后續(xù)講解 LangChain 時(shí),會(huì)涉及一個(gè)名為提示詞模板(PromptTemplate)的概念,其用途便是用于拼接提示詞。此刻,你應(yīng)該能夠明白為何我們強(qiáng)調(diào)本講所涉及的提示工程內(nèi)容均屬于技術(shù)范疇了。
少樣本學(xué)習(xí)在簡(jiǎn)單分類(lèi)場(chǎng)景中頗為有效,但它也存在顯著的局限性。例如,在一些復(fù)雜的推理任務(wù)里,它就難以應(yīng)對(duì)。于是,便有了下一項(xiàng)提示詞技術(shù) —— 思維鏈。
思維鏈提示(Chain-of-Thought Prompting)
大模型本質(zhì)上屬于語(yǔ)言模型,其優(yōu)勢(shì)顯著體現(xiàn)在語(yǔ)言處理能力方面。然而,換個(gè)視角審視,大模型在數(shù)學(xué)與推理等領(lǐng)域確實(shí)存在短板。我們常常會(huì)察覺(jué)到,大模型在面對(duì)一些簡(jiǎn)易數(shù)學(xué)問(wèn)題時(shí)容易出錯(cuò),就像判斷 3.8 和 3.11 的大小這種基礎(chǔ)問(wèn)題(值得一提的是,各個(gè)大模型都在持續(xù)努力修正已發(fā)現(xiàn)的此類(lèi)問(wèn)題)。
依我之見(jiàn),大模型的表現(xiàn)往往是言語(yǔ)反應(yīng)快于思考過(guò)程,常常未經(jīng)深思熟慮就給出回應(yīng)。為促使大模型更出色地履行任務(wù),我們有必要引導(dǎo)它放緩回應(yīng)速度,避免僅憑直覺(jué)作答,而是要激發(fā)其理性思維,使其能夠更加嚴(yán)謹(jǐn)、準(zhǔn)確地處理問(wèn)題并提供答案。
圖片
在這一實(shí)例中,左右兩側(cè)均旨在獲取數(shù)學(xué)題的答案,并且所采用的樣例題目相同。二者的區(qū)別在于,標(biāo)準(zhǔn)提示的樣例回答是徑直給出答案,而運(yùn)用思維鏈提示的樣例回答則呈現(xiàn)出完整的推導(dǎo)流程。由此可見(jiàn),由于樣例的差異,模型的回答也產(chǎn)生了不同結(jié)果。標(biāo)準(zhǔn)提示因直接給出答案,屬于 “未加思索” 的回應(yīng),最終答案錯(cuò)誤;而思維鏈提示給出的答案伴有完整的思考進(jìn)程,是一種 “深思熟慮”“慢下來(lái)” 的答案,所以得出了正確答案。
至此,大家應(yīng)該能夠明白,所謂思維鏈,實(shí)際上就是這樣的思考步驟。此例中的思維鏈因列舉了示例,故而可被視作一種少樣本提示?;蛟S有人會(huì)思考,既然存在少樣本思維鏈,那么是否存在零樣本思維鏈呢?答案是肯定的。只需在提示詞里添加 “Let’s think step by step” 即可,其目的顯而易見(jiàn),是告知大模型要放慢節(jié)奏,逐步思考。
無(wú)論是上述實(shí)例,還是零樣本思維鏈,若自行測(cè)試,效果極有可能存在差異。原因在于大模型的推理能力處于持續(xù)提升的狀態(tài),可能前一天表現(xiàn)欠佳,后一天便有所進(jìn)步。所以,在實(shí)際開(kāi)發(fā)大模型應(yīng)用時(shí),務(wù)必基于特定模型展開(kāi)測(cè)試,以此確保提示詞的有效性。
就在撰寫(xiě)這段文字后不久,OpenAI 推出了 o1,其核心原理便是將思維鏈融入大模型的處理流程之中,從而極大地增強(qiáng)了模型的推理能力。倘若能夠領(lǐng)會(huì)思維鏈的內(nèi)涵,即便我們使用的是推理能力稍弱一些的大模型,依然能夠收獲較為理想的推理成效。
ReAct 框架
前面提到的這些提示技術(shù)都是在說(shuō)大模型自身的推理過(guò)程,不過(guò),很多人對(duì)大模型的預(yù)期可不僅僅局限于“文字游戲”。那如果大模型能夠跳脫自說(shuō)自話,和周邊做更多結(jié)合,是不是就可以做更多的事情了呢?
ReAct 框架就是在這個(gè)想法下誕生的。ReAct 實(shí)際上是兩個(gè)單詞的縮寫(xiě):Reasoning + Acting,也就是推理 + 行動(dòng)。下面是這個(gè)例子來(lái)自引入 ReAct 框架的論文,其原始問(wèn)題是:
除了蘋(píng)果遙控器,還有哪些設(shè)備可以控制蘋(píng)果遙控器最初設(shè)計(jì)用來(lái)交互的程序?Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?
下面就是回答這個(gè)問(wèn)題涉及到的不同的步驟:
圖片
于該實(shí)例當(dāng)中,大模型若要達(dá)成一個(gè)宏大目標(biāo),便需持續(xù)執(zhí)行一系列任務(wù)。每個(gè)任務(wù)都會(huì)歷經(jīng)思考(Thought)、行動(dòng)(Action)、觀察(Observation)這三個(gè)關(guān)鍵階段。思考環(huán)節(jié)能夠確定下一步的行動(dòng)方向;行動(dòng)則意味著切實(shí)完成某一具體動(dòng)作;而觀察,是對(duì)行動(dòng)所產(chǎn)生的結(jié)果予以評(píng)估,進(jìn)而判定是否終止這一處理流程。
雖說(shuō)推理部分大模型自身便可完成,然而行動(dòng)所涉及之事,大模型恐難以獨(dú)自應(yīng)對(duì)。例如搜索蘋(píng)果遙控器,這顯然需要借助其他手段,來(lái)輔助大模型完成此搜索行為。實(shí)際上,這便是 ReAct 技術(shù)被稱(chēng)作框架的根源所在,因其在執(zhí)行過(guò)程中需要融入一些其他的動(dòng)作才能順利推進(jìn)。
如果單看這個(gè)例子,你還可能會(huì)有些困惑,那下面的例子可以幫助你更好地理解 ReAct 是一個(gè)框架。這是來(lái)自 LangChain 社區(qū)的一個(gè)提示詞模板,后面我們會(huì)講到 LangChain,這里我們先把注意力放到提示詞本身:
Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format:Question: the input question you must answerThought: you should always think about what to doAction: the action to take, should be one of [{tool_names}]Action Input: the input to the actionObservation: the result of the action… (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answerFinal Answer: the final answer to the original input question Begin! Question: {input}Thought:{agent_scratchpad}
此提示詞模板的核心用途在于借助特定工具來(lái)達(dá)成具體任務(wù)。在此處能夠看到與之前相似的思考(Thought)、行動(dòng)(Action)、觀察(Obsuation)等階段。關(guān)鍵之處在于行動(dòng)階段,在此階段我們能夠運(yùn)用不同的工具,而這些工具正是可以被整合進(jìn)執(zhí)行流程的關(guān)鍵要素。大模型會(huì)依據(jù)問(wèn)題以及工具的特性來(lái)抉擇下一步的行動(dòng)策略,例如告知我們應(yīng)選用何種工具來(lái)完成任務(wù),隨后便能夠執(zhí)行對(duì)應(yīng)的工具代碼。需要注意的是,這里的工具代碼屬于本地代碼,其所能實(shí)現(xiàn)的功能更為豐富多樣,能夠突破大模型自身能力的局限。倘若你能夠透徹理解這個(gè)提示詞模板,那么便意味著你已經(jīng)初步具備了構(gòu)建一個(gè) Agent 的基礎(chǔ)條件。