如上圖所示,自 2017 年 Transformer 誕生以來(lái),在這個(gè)架構(gòu)的基礎(chǔ)上,以 BERT 為代表的模型和以 GPT 為代表的模型便以極快的速度向前發(fā)展。在 2018 年 BERT 誕生后,語(yǔ)言模型便開始重塑 NLP 領(lǐng)域,快速在市場(chǎng)中得到廣泛應(yīng)用,時(shí)至今日這些語(yǔ)言模型依然是 NLP 領(lǐng)域中最被廣泛應(yīng)用的模型,我們今天看到以 GPT 為代表的各類大模型也是其中之一。

從 GPT 的發(fā)展來(lái)看,我們可以大致劃分為4個(gè)階段,” GPT1 – GPT2 – GPT3 – ChatGPT “,我們可以從這個(gè)發(fā)展過(guò)程中了解到 Prompt 是如何誕生的,以此更好的了解 Prompt。

階段1:GPT-1 誕生在 Transformer 初期,是最早期基于 Transformer 架構(gòu)打造的模型之一,其采用了和 BERT 相同的范式,通過(guò) “pretrain + finetune” 的方式,首先讓模型在大量未標(biāo)注的數(shù)據(jù)上自監(jiān)督的進(jìn)行學(xué)習(xí),完成預(yù)訓(xùn)練,隨后在應(yīng)用時(shí)再使用有監(jiān)督數(shù)據(jù)進(jìn)行微調(diào),以此讓模型可以適用于各種任務(wù)。在這種范式下 BERT 作為雙向模型,可以充分的獲取上下文信息,這讓他在各類任務(wù)中都展現(xiàn)出了更精準(zhǔn)更穩(wěn)定的效果,而 GPT 作為單向模型,更擅長(zhǎng)生成任務(wù),而由于在這個(gè)階段還處于大模型發(fā)展的早期,模型規(guī)模和效果還沒(méi)有成長(zhǎng)起來(lái),因此生成的不穩(wěn)定性使得 GPT 并沒(méi)有被大規(guī)模應(yīng)用。時(shí)至今日,即便 GPT 已經(jīng)展現(xiàn)出了令人驚艷的效果,但目前 BERT 類的模型依然是各個(gè)業(yè)務(wù)使用更多的模型。

階段2:相比 GPT-1,GPT-2 第一次提出了全新的范式,當(dāng)我們擴(kuò)大模型規(guī)模增加訓(xùn)練數(shù)據(jù),讓模型在一個(gè)稱為 WebText 的由數(shù)百萬(wàn)個(gè)網(wǎng)頁(yè)組成的數(shù)據(jù)集上完成預(yù)訓(xùn)練后,模型不再需要任何監(jiān)督數(shù)據(jù),就可以完成各類任務(wù)。在 OpenAI 的 Blog 中我們可以看到,團(tuán)隊(duì)在研究過(guò)程中發(fā)現(xiàn),提升模型規(guī)模及訓(xùn)練數(shù)據(jù)的體量,可以讓模型在 zero-shot 任務(wù)中的效果明顯提升,這也在今天被認(rèn)為是對(duì) scaling law 的第一次發(fā)現(xiàn),雖然當(dāng)時(shí)還沒(méi)有誕生智能涌現(xiàn)的現(xiàn)象。也有人解讀,由于 BERT 在各個(gè)領(lǐng)域展現(xiàn)出的優(yōu)異效果,GPT 被迫找到了新的發(fā)展方向,也為如今的智能涌現(xiàn)奠定了基礎(chǔ)。由此,GPT 開啟了與 BERT 截然不同的范式,并在新的范式下進(jìn)行研發(fā),專注模型在 zero-shot 中的效果。

階段3:沿著 GPT-2 增大模型體量和訓(xùn)練數(shù)據(jù)規(guī)模的思路,GPT-3 使用了 570G 的訓(xùn)練數(shù)據(jù),達(dá)到了 GPT-2 的15倍,參數(shù)量更是達(dá)到了驚人的 1750B,是 GPT-2 的 116 倍。參數(shù)量的提升讓 scaling law 大顯神威,讓模型在各個(gè)領(lǐng)域中都展現(xiàn)出了令人驚艷的效果,尤其是在 zero-shot 方面,發(fā)布會(huì)上通過(guò)手繪 UI 圖生成前端代碼的例子至今讓人印象深刻。GPT-3 在 2020 年底發(fā)布,當(dāng)時(shí) Transformer 已經(jīng)經(jīng)過(guò)了4年的發(fā)展,BERT 類模型已經(jīng)在各類應(yīng)用中被廣泛使用,成為了絕對(duì)的主流。然而在這種情況下,GPT-3 的發(fā)布也依然成為了領(lǐng)域中最矚目的事件,即便還是有很多問(wèn)題,但其遠(yuǎn)超預(yù)期的效果依然令人震撼。

階段4:之后的故事大家都非常熟悉了,OpenAI 在 GPT-3 的基礎(chǔ)上針對(duì)不同場(chǎng)景進(jìn)行了優(yōu)化,在“多輪對(duì)話”的優(yōu)化中誕生了“ChatGPT”,隨后成為了世界上最火熱的話題,也被認(rèn)為是 AI 市場(chǎng)化的起點(diǎn)。GPT-3 后的模型不再開源,也沒(méi)有論文公開發(fā)表,我們只能在 Blog 中獲取一些信息,此處不再進(jìn)行展開。

最后我們來(lái)做個(gè)總結(jié),從領(lǐng)域發(fā)展的角度我們可以看到 3 種不同的研發(fā)范式:

  1. Transformer 之前:有監(jiān)督訓(xùn)練(train)
  2. GPT1 & BERT:無(wú)監(jiān)督預(yù)訓(xùn)練(pre-train) + 有監(jiān)督微調(diào)(finetune)
  3. GPT2 & GPT3:無(wú)監(jiān)督預(yù)訓(xùn)練(pre-train) + 提示詞(Prompt)

我們可以清晰的看到其中的不同,模型能力的研發(fā)越來(lái)越不依賴 “訓(xùn)練” 的過(guò)程,而是更大程度的依賴 “預(yù)訓(xùn)練”,依賴 “模型” 本身的能力。在 BERT 所代表的范式下,我們還可以通過(guò) “微調(diào)” 在參數(shù)層面影響模型。而到了以 “GPT3” 為代表的范式下,也就是我們現(xiàn)在用的大模型,我們不再借助 “微調(diào)” 的方式調(diào)試模型,而是通過(guò) “輸入” 直接影響 “輸出” 的質(zhì)量,而如何在應(yīng)用中得到一個(gè)好的 “輸入” 就是 “Prompt 工程” 需要做的事。

以上,我從發(fā)展的角度談?wù)摿?Prompt 的前世今生,Prompt 是從何而來(lái),為什么我們需要 “Prompt 工程”,希望可以更好的幫助大家了解 Prompt,下面我就來(lái)具體談?wù)?Prompt 是什么。

1.2 Prompt 到底是什么?

Prompt 譯為 “提示”,與 “zero-shot” 的概念相輔相成,“zero-shot”  就是不通過(guò)訓(xùn)練直接向模型提問(wèn)的應(yīng)用方式,而 Prompt 就是指提問(wèn)的方式。從這個(gè)概念上看 “模版” 可能是更合適的稱呼,為什么要用 “提示” 這個(gè)單詞呢?

實(shí)際上,在剛剛出現(xiàn)這個(gè)概念時(shí)并沒(méi)有 “Prompt” 這樣的稱呼,在早期的論文中其往往會(huì)被稱為 “輸入形式(format)” 或 “輸入模版(template)”,但隨著領(lǐng)域的發(fā)展,尤其是在 GPT-3 之后,Prompt 的叫法才被逐步確定,大家認(rèn)同 “提示” 的概念與其作用更加貼切,尤其是在大語(yǔ)言模型的語(yǔ)境下尤為合適,因此逐漸成為了公認(rèn)的稱呼。

那 Prompt 到底在提示什么呢?從前文中對(duì)范式的解讀來(lái)看,模型能力的應(yīng)用越來(lái)越向 “預(yù)訓(xùn)練” 的部分傾斜,絕大多數(shù)能力應(yīng)當(dāng)是在 “預(yù)訓(xùn)練” 階段就構(gòu)成的,而非通過(guò)進(jìn)一步的訓(xùn)練構(gòu)建。而在這種思想的基礎(chǔ)上,Prompt 則像一把解鎖模型能力的鑰匙,讓這些 “預(yù)訓(xùn)練” 階段構(gòu)成的能力唯我所用。因此,Prompt 就是在提示模型回憶起自己在預(yù)訓(xùn)練時(shí)學(xué)習(xí)到的能力。

我們可以把 “知識(shí)” 和 “能力” 進(jìn)行更進(jìn)一步的分解,我們更多的是希望使用大模型的能力(理解,總結(jié),生成,推理,e.t.c.),而非知識(shí)。與現(xiàn)在越來(lái)越火熱的 RAG 技術(shù)一樣,我們更傾向于將知識(shí)通過(guò)外部注入的方式讓模型試用,而能力則完全需要依賴預(yù)訓(xùn)練階段。我們要做的是通過(guò) Prompt 調(diào)用大模型的能力去解決問(wèn)題,讓這些能力表現(xiàn)的更精準(zhǔn),而并非把他當(dāng)成一個(gè)知識(shí)庫(kù)。如果與人做對(duì)比也一樣能得到這個(gè)結(jié)論,人可以從外部收集信息,并利用自身的智能進(jìn)行決策,而不是把知識(shí)都裝到自己腦子里。Sam Altman 在早期采訪中也提到,把大模型當(dāng)成搜索引擎的應(yīng)用方式是錯(cuò)誤的,智能的體現(xiàn)才是大模型的關(guān)鍵。

總結(jié)而言,Prompt 就是在提示大模型 “回憶” 起自己的某些能力,在合適的場(chǎng)景下為我們解決問(wèn)題,這也是 Prompt 工程最核心的理念之一。

1.3 為什么不能依賴訓(xùn)練?微調(diào)有什么問(wèn)題?

除了閉源大模型外,現(xiàn)在小型的開源模型也是應(yīng)用的主流,也隨之誕生了 LoRa 這樣的訓(xùn)練技術(shù),可以在較小的成本下完成訓(xùn)練,那是否就意味著我們可以不再依賴 Prompt,而是像以前一樣通過(guò) “微調(diào)” 的范式調(diào)試模型呢?

首先是成本問(wèn)題,Prompt 這種新范式的誕生是由于大模型超大的體量,導(dǎo)致我們無(wú)法在較小的成本下對(duì)參數(shù)產(chǎn)生足夠的影響,即便是開源的較小的模型我們也大多采用 LoRa 這類 “附加參數(shù)” 的方式進(jìn)行微調(diào)。因此,對(duì)于大模型應(yīng)用而言,考慮到成本,我們實(shí)際上根本無(wú)法完成 “訓(xùn)練” 的過(guò)程。

其次是效果問(wèn)題,如果我們利用 LoRa 這樣的技術(shù)進(jìn)行微調(diào),對(duì)于模型參數(shù)的影響是很有限的,目前更傾向認(rèn)為這是一種“對(duì)齊”的過(guò)程,且還很有可能引發(fā)“遺忘”的問(wèn)題。而如果你希望通過(guò)微調(diào)讓模型掌握 “知識(shí)”,這也不是一個(gè)好的思路,這意味著你需要不斷的通過(guò)訓(xùn)練來(lái)保持知識(shí)的更新,且需要針對(duì)不同領(lǐng)域訓(xùn)練多個(gè)不同的模型,同時(shí)訓(xùn)練也并不是一個(gè)可靠的過(guò)程,相比之下現(xiàn)在“超長(zhǎng)上下文的模型” 加 “RAG” 被認(rèn)為是更可靠的方式。

最后,這也不是一個(gè)長(zhǎng)期可靠的研發(fā)思路,大模型現(xiàn)在驚艷的效果是基于 “scaling law” 的智能涌現(xiàn),本質(zhì)還是在應(yīng)用大模型預(yù)訓(xùn)練階段的能力。無(wú)論是“開源”還是“閉源”模型,一定是通過(guò)參數(shù)量的增加或其他方式,讓模型本身的能力不斷提升,且目前看依然保持指數(shù)級(jí)的增長(zhǎng)。在這種情況下,過(guò)于依賴基于任務(wù)的訓(xùn)練是不長(zhǎng)久的,因?yàn)榇竽P偷谋举|(zhì)不是通過(guò)訓(xùn)練構(gòu)建能力,而是通過(guò)輸入調(diào)度能力,并在任務(wù)維度進(jìn)行對(duì)齊。即便是開源模型的應(yīng)用,長(zhǎng)期來(lái)看也不會(huì)是以任務(wù)維度進(jìn)行訓(xùn)練。

因此,訓(xùn)練與微調(diào)并不能取代 Prompt 的作用,且這種范式在眾多方面都展現(xiàn)出了弊端,這也證明了 Prompt 工程的重要性,Prompt 是新范式下應(yīng)用模型能力的關(guān)鍵。

1.4 為什么要寫這篇文章?

自大模型橫空出世依賴變成為了世界最大的熱點(diǎn),而 “Prompt 工程” 一直是其中最為火熱的方向之一,早在大模型發(fā)展之初很多人便開始呼吁設(shè)立 “Prompt 工程師” 的職位,似乎在新的時(shí)代下寫好 Prompt,用好大模型,是各個(gè)領(lǐng)域最重要的事情之一。在這樣的背景下,Prompt 相關(guān)的研究已經(jīng)積累的十分充足,無(wú)論是公司內(nèi)外都積累了眾多的文章和課程,其中最火的 《Prompt Engineering Guide》,和吳恩達(dá)老師的《ChatGPT Prompt Engineering for Developers》,都對(duì) “Prompt 工程” 作出了詳細(xì)的介紹,是非常重要的學(xué)習(xí)資料。那為什么我還要寫這篇文章呢?


這些文章和教程都有一個(gè)共通的問(wèn)題,他們大多是對(duì)技巧的羅列,例如《Prompt Engineering Guide》中就羅列了大量技巧,告訴你可以在 Prompt 中 “增加示例”,“增加角色” 等等。但并沒(méi)有一個(gè)體系化的結(jié)構(gòu),一個(gè)標(biāo)準(zhǔn)化的工作流,告訴大家如何一步步的完成一個(gè) “Prompt”,如何從0開始完成 “Prompt 工程” 的工作。

因此本文嘗試結(jié)合我們的研發(fā)經(jīng)驗(yàn),體系化的對(duì) “Prompt 工程” 的工作進(jìn)行總結(jié),得到一些標(biāo)準(zhǔn)化的工作流程,并通過(guò)這樣結(jié)構(gòu)化的整理,可以更好的對(duì) “Prompt” 進(jìn)行管理,讓“Prompt”作為大模型應(yīng)用的基石,更加可靠有效可擴(kuò)展。具體而言,我們把從0到1完成一個(gè) Prompt 的過(guò)程拆分為了5個(gè)步驟。我們利用一套統(tǒng)一的模版,解決最困難的初始 Prompt 書寫的問(wèn)題,并結(jié)合實(shí)際應(yīng)用一步步的進(jìn)行優(yōu)化,從而體系化的完成 “Prompt 工程” 的工作。


我們希望通過(guò)我們的方法,可以提升 Prompt 工程的工作效率,降低 Prompt 技術(shù)的應(yīng)用成本,并解決 Prompt 難以管理的問(wèn)題。讓大家都可以從0到1的完成大模型的調(diào)試,并讓大模型在各個(gè)領(lǐng)域中被更好的應(yīng)用。

02 Prompt 萬(wàn)能框架


在編寫 Prompt 時(shí),從0到1的編寫出第一版 Prompt 往往是最難的,而基于已有 Prompt 利用各種技巧進(jìn)行優(yōu)化則相對(duì)簡(jiǎn)單。善于解決 “數(shù)理問(wèn)題” 的我們?cè)诿鎸?duì)這樣一個(gè)偏 “文理問(wèn)題” 的任務(wù)時(shí),就像小時(shí)候?qū)懽魑囊粯与y以提筆。如上圖所示,為了解決這個(gè)問(wèn)題,我們使用了一套 “萬(wàn)能模版”,把一個(gè) Prompt 拆分成了 “立角色 + 述問(wèn)題 + 定目標(biāo) + 補(bǔ)要求” 這四個(gè)部分,希望通過(guò)結(jié)構(gòu)化的拆分完成這最困難的一步,無(wú)論面對(duì)什么任務(wù),利用這個(gè)模版都可以得到一個(gè)“及格”的 Prompt。下面我就具體和大家闡述一下這個(gè)模版是如何得到的,為什么他是有效的。

對(duì)與 Prompt 的作用和定位已經(jīng)在第一章中進(jìn)行了詳細(xì)的討論,Prompt 的作用就是根據(jù)我們的問(wèn)題調(diào)用模型的能力,我們要通過(guò)提問(wèn)的方式,明確的讓模型知道我們想要什么,我們的目標(biāo)是什么,從這個(gè)基本思想出發(fā),Prompt 應(yīng)該包含以下幾點(diǎn):

  1. 問(wèn)題是什么:首先你要告訴模型你的問(wèn)題是什么,你的任務(wù)是什么,要盡量描述清楚你的需求。
  2. 你要做什么:下面你需要告訴大模型具體要做什么,比如做一份攻略,寫一段代碼,對(duì)文章進(jìn)行優(yōu)化,等等。
  3. 有什么要求:最后我們往往還需求對(duì)任務(wù)補(bǔ)充一些要求,比如按特定格式輸出,規(guī)定長(zhǎng)度限制,只輸出某些內(nèi)容,等等。

通這 3 部分的描述我們就把 “要大模型做什么” 描述清楚了,這個(gè)想法十分自然,即便不是大模型,而是希望其他人為你完成某項(xiàng)任務(wù),往往也需要通過(guò)這 3 部分把問(wèn)題描述清楚。由于這僅僅是第一版 Prompt,你不需要描述的過(guò)于詳細(xì),也不需要使用技巧,只需要用簡(jiǎn)練的語(yǔ)言把這幾部分描述清晰即可。以下是幾個(gè)示例:

例1:生成產(chǎn)品摘要

問(wèn)題是什么:你的任務(wù)是幫我生成一個(gè)產(chǎn)品的簡(jiǎn)短摘要。

你要做什么:我會(huì)給你產(chǎn)品的需求文檔,及用戶對(duì)產(chǎn)品的評(píng)價(jià),請(qǐng)結(jié)合這些信息概括產(chǎn)品的功能及現(xiàn)狀,為我生成一份產(chǎn)品摘要。

有什么要求:請(qǐng)盡量概括產(chǎn)品的特點(diǎn),并用輕松幽默的語(yǔ)言風(fēng)格進(jìn)行編寫,摘要的字?jǐn)?shù)不要超過(guò)50個(gè)字。

例2:生成代碼注釋

問(wèn)題是什么:你的任務(wù)是幫我的代碼生成注釋。

你要做什么:我有一段 python 代碼,需要你對(duì)代碼的內(nèi)容進(jìn)行分析,并為代碼添加注釋。

有什么要求:請(qǐng)結(jié)合代碼內(nèi)容,盡量詳細(xì)的補(bǔ)充注釋,不要遺漏,每條注釋請(qǐng)以 “comment:” 作為前綴。

例3:生成測(cè)試用例

問(wèn)題是什么:你的任務(wù)是幫我設(shè)計(jì)一款產(chǎn)品的測(cè)試用例。
你要做什么:我會(huì)提供給你產(chǎn)品的需求文檔,需要你結(jié)合需求的功能描述進(jìn)行測(cè)試用例的編寫。
有什么要求:請(qǐng)結(jié)合需求中功能的結(jié)構(gòu),對(duì)測(cè)試點(diǎn)進(jìn)行梳理,并有層級(jí)的輸出測(cè)試用例,請(qǐng)保證每一個(gè)功能的測(cè)試點(diǎn)沒(méi)有遺漏。
以上是3個(gè)簡(jiǎn)單的示例,讓大家更直觀的感受這 3 部分的含義,在實(shí)際應(yīng)用中這 3 部分的內(nèi)容會(huì)比例子中復(fù)雜的多,此處僅僅為了說(shuō)明框架的結(jié)構(gòu),實(shí)際內(nèi)容沒(méi)有參考價(jià)值,各部分內(nèi)容的細(xì)化會(huì)在第三章中詳細(xì)展開。

在描述清楚任務(wù)后,我們就需要調(diào)度模型的能力去完成我們的任務(wù),不同的任務(wù)需要用到不同的能力,這往往依賴認(rèn)為的拆分。我們可以想像,當(dāng)我們讓一個(gè)小白幫我們完成一項(xiàng)任務(wù)時(shí),我們需要對(duì)任務(wù)進(jìn)行分解,并告訴他每一步需要怎么做,以此來(lái)讓他完成一項(xiàng)復(fù)雜的任務(wù)。對(duì)于大模型而言,這當(dāng)然也是試用的,甚至十分好用,這在第5章的 “CoT” 中還會(huì)再次提到。

你當(dāng)然可以人為的完成這種拆分,再一條條的解釋給大模型,但這種做法并不通用,每個(gè)領(lǐng)域都有自己獨(dú)特的專項(xiàng)能力,每個(gè)任務(wù)都有自己的工作流程,因此這種方案并不適合放到一個(gè)通用的框架當(dāng)中。好在大模型能力的調(diào)用還存在一條捷徑,那就是“角色”,他就像大模型里自帶一個(gè)“能力包”,可以很容易的對(duì)模型能力進(jìn)行調(diào)用。每一個(gè)角色,都對(duì)應(yīng)著該角色包含的若干能力,我們可以通過(guò)設(shè)定角色,“提示”大模型使用該角色對(duì)應(yīng)的能力,這與前文“Prompt 到底是什么” 中介紹的想法極其匹配,充分說(shuō)明是“Prompt” 提示的作用,通過(guò)簡(jiǎn)單的“提示”調(diào)用出大模型預(yù)先訓(xùn)練的能力,這也就是“角色”如此有用的原因。

由此我們就最終得到了我們的 “Prompt 模版”,通過(guò)這個(gè)統(tǒng)一的框架我們可以完成絕大多數(shù) Prompt 初版的編寫,讓大家在面對(duì)各類任務(wù)時(shí)可以高效的完成從0到1的嘗試,而不必陷入無(wú)從下筆的困境。

除了效果之外,對(duì) Prompt 結(jié)構(gòu)化的拆分也對(duì) Prompt 管理提供了很大幫助,我們的 Prompt 庫(kù)不再是大段的文本,而是拆分成了4張表“角色表”,“問(wèn)題表”,“目標(biāo)表”,“要求表”。通過(guò)這種方式我們可以很大的提升 Prompt 的靈活性,并通過(guò)動(dòng)態(tài)組合4個(gè)元素的方式完成各類任務(wù),這在面對(duì)復(fù)雜任務(wù),或通過(guò)多模型解決問(wèn)題時(shí),會(huì)提供穩(wěn)定有效的支撐。

03 框架的細(xì)化

在第二章中我們已經(jīng)明確了 “Prompt 工程” 的第一步,通過(guò)我們的框架,在任何任務(wù)中我們都可以完成 Prompt 從 0 到 1 的編寫,而這個(gè)初版的 Prompt 還只是一個(gè)雛形,由于各部分信息還不完整,往往不能達(dá)到我們的預(yù)期,框架提供了 Prompt 的骨架,還需要我們進(jìn)一步補(bǔ)充血肉,下面我會(huì)對(duì)框架的每一部分進(jìn)行更詳細(xì)的分解,通過(guò)內(nèi)容的補(bǔ)全一步步的提升模型的效果。

3.1 立角色

與第二章中對(duì) “角色” 的理解一致,“角色” 可以被當(dāng)作大模型的“能力包”或“語(yǔ)法糖”,我們不再需要對(duì)每一項(xiàng)能力進(jìn)行詳細(xì)的描述,對(duì)任務(wù)進(jìn)行更細(xì)節(jié)的分解,而是可以通過(guò) import “角色” 的方式,使用這個(gè) “角色” 背后對(duì)應(yīng)的各項(xiàng)能力。那我們?cè)撊绾卧O(shè)立角色,才是這個(gè)“能力包”的正確使用方式呢?

大家都有招聘的經(jīng)歷,我們可以想象,大模型就是我們要招的人,我們需要設(shè)定一個(gè)能力模型,來(lái)完成我們指定的工作。我們?cè)谡衅笗r(shí)通常都會(huì)有明確的要求,在JD中要有清晰的描述,這樣才能找到最合適的人選。這與大模型的角色設(shè)置一樣,我們要清晰明確的描述這個(gè)角色,才能充分 “提示” 大模型,讓大模型知道該調(diào)用哪些能力。

我們不妨試想一下在招聘 JD 中,我們會(huì)要求哪些內(nèi)容。通常會(huì)包含:工作年份,教育水平,項(xiàng)目經(jīng)歷,工作技能,榮譽(yù)獎(jiǎng)項(xiàng)等等。我們完全可以按照這個(gè)思路,創(chuàng)建一個(gè)語(yǔ)言模版,幫助我們創(chuàng)立角色。

以下是我在使用的角色模版,當(dāng)然 Prompt 的構(gòu)造十分靈活,展示的示例僅供參考:

角色模版:

現(xiàn)在你是一位優(yōu)秀的{{你想要的身份}},擁有{{你想要的教育水平}},并且具備{{你想要的工作年份及工作經(jīng)歷}},你的工作內(nèi)容是{{與問(wèn)題相關(guān)的工作內(nèi)容}},同時(shí)你具備以下能力{{你需要的能力}}

例:心理咨詢師

現(xiàn)在你是一位優(yōu)秀的 {{心理咨詢師}},擁有 {{心理咨詢、臨床心理學(xué)等專業(yè)的碩士或博士學(xué)位}},并且具備 {{多年的心理咨詢工作經(jīng)驗(yàn),在不同類型的心理咨詢機(jī)構(gòu)、診所或醫(yī)院積累了豐富的臨床實(shí)踐經(jīng)驗(yàn)}},你的工作內(nèi)容是 {{為咨詢者處理各種心理問(wèn)題,并幫助你的咨詢者找到合適的解決方案}},同時(shí)你具備以下能力:{{

  1. 專業(yè)知識(shí):你應(yīng)該擁有心理學(xué)領(lǐng)域的扎實(shí)知識(shí),包括理論體系、治療方法、心理測(cè)量等,可以為你的咨詢者提供專業(yè)、有針對(duì)性的建議。
  2. 溝通技巧:你應(yīng)該具備出色的溝通技巧,能夠傾聽(tīng)、理解、把握咨詢者的需求,同時(shí)能夠用恰當(dāng)?shù)姆绞奖磉_(dá)自己的想法,使咨詢者能夠接受并采納你的建議。
  3. 同理心:你應(yīng)該具備強(qiáng)烈的同理心,能夠站在咨詢者的角度去理解他們的痛苦和困惑,從而給予他們真誠(chéng)的關(guān)懷和支持。
  4. 持續(xù)學(xué)習(xí):你應(yīng)該有持續(xù)學(xué)習(xí)的意愿,跟進(jìn)心理學(xué)領(lǐng)域的最新研究和發(fā)展,不斷更新自己的知識(shí)和技能,以便更好地服務(wù)于你的咨詢者。
  5. 良好的職業(yè)道德:你應(yīng)該具備良好的職業(yè)道德,尊重咨詢者的隱私,遵循專業(yè)規(guī)范,確保咨詢過(guò)程的安全和有效性。

}}
以上是一個(gè)簡(jiǎn)單的示例,角色的設(shè)置往往需要編寫者對(duì)角色有一定的了解,這可以更好的幫助你補(bǔ)全你的模版,但如果你不了解你要設(shè)置的角色,不知道這些信息該如何填寫,我們?nèi)绾慰梢垣@取到這部分信息呢?

其實(shí),我們可以沿著 “招聘 JD” 的思路,通過(guò)招聘網(wǎng)站上的招聘信息補(bǔ)全我們的數(shù)據(jù)。例如,我要讓大模型幫我完成一個(gè) “財(cái)務(wù)分析” 相關(guān)的任務(wù),而我此前對(duì)這個(gè)領(lǐng)域毫無(wú)了解,此時(shí)就可以通過(guò)招聘網(wǎng)站的職位信息,完成角色的設(shè)置:


例:財(cái)務(wù)分析

現(xiàn)在你是一位優(yōu)秀的{{財(cái)務(wù)分析顧問(wèn)}},擁有{{財(cái)務(wù)學(xué)、經(jīng)濟(jì)學(xué)等專業(yè)的碩士或博士學(xué)位}},并且具備{{八年以上的財(cái)務(wù)分析工作經(jīng)驗(yàn),在不同類型的公司進(jìn)行過(guò)一線基金財(cái)務(wù)分析,財(cái)務(wù)報(bào)告產(chǎn)出等工作,積累了豐富的實(shí)踐經(jīng)驗(yàn)}},你的工作內(nèi)容是{{對(duì)投融資數(shù)據(jù)進(jìn)行分析,從管理層的視角設(shè)計(jì)數(shù)據(jù)分析框架和匯報(bào)體系}},同時(shí)你具備以下能力:{{

  1. 專業(yè)知識(shí):你擁有較強(qiáng)的數(shù)據(jù)分析能力和豐富的財(cái)務(wù)分析與報(bào)告能力。
  2. 較強(qiáng)的分析問(wèn)題解決問(wèn)題能力和框架性思維能力。
  3. 具有很強(qiáng)的學(xué)習(xí)能力,以及很強(qiáng)的自我驅(qū)動(dòng)力。
  4. 有好奇心,愿意挑戰(zhàn)自己,不斷開拓新的領(lǐng)域。
  5. 中英文流利,優(yōu)秀的中英文書寫能力,良好的溝通能力。

}}
以上,就是借助 “招聘 JD” 完成一個(gè)完全陌生領(lǐng)域角色的示例,而通常而言角色與任務(wù)的關(guān)聯(lián)性很大,我們對(duì)角色的了解越深入,就越能設(shè)定出符合預(yù)期的角色,即便我們可以采用這種方案進(jìn)行兜底,但在 “Prompt 工程” 中人的先驗(yàn)經(jīng)驗(yàn)依然十分重要。

3.2 述問(wèn)題 & 定目標(biāo)

對(duì)問(wèn)題的描述由 “述問(wèn)題” 和 “定目標(biāo)” 兩部分組成,是 Prompt 中信息含量最大的部分,也是和任務(wù)最相關(guān)的部分,我們要明確的描述我們希望大模型做的工作,才能讓大模型輸出最符合預(yù)期的結(jié)果。

除了要描述的清晰明確外,此部分值得強(qiáng)調(diào)的就是對(duì)任務(wù)的分解,這在復(fù)雜任務(wù)上尤為重要。如果我們需要大模型完成的任務(wù)過(guò)于復(fù)雜,我們則需要先人工對(duì)任務(wù)進(jìn)行拆分,并盡量詳細(xì)的描述任務(wù)中包含的各個(gè)部分,這與常用的  “CoT” 的優(yōu)化方式類似,通過(guò)把復(fù)雜任務(wù)拆分成若干個(gè)子部分的方式提升模型的效果。

我們也可以把這種拆分當(dāng)作一個(gè)任務(wù)維度的對(duì)齊,當(dāng)我們用概括的語(yǔ)言描述一項(xiàng)任務(wù)時(shí),隱含了大量的背景知識(shí)和預(yù)期。例如,當(dāng)我們希望大模型幫我們 “制作一份旅游攻略” 時(shí),我們希望他能幫我們 “規(guī)劃行程”,“收集信息”,“預(yù)定酒店” 等等,而這些信息往往都被包含在 “旅游攻略” 當(dāng)中。如果我們不明確的對(duì)任務(wù)進(jìn)行拆分,大模型就不知道我們的任務(wù)具體需要包含哪些部分,因此這個(gè)任務(wù)維度的對(duì)齊十分重要。下面我舉幾個(gè)例子:

例1:請(qǐng)幫我制作一份深圳的旅游攻略

請(qǐng)幫我制作一份深圳的旅游攻略,以下是一些基本步驟和思考方式:

  1. 研究和收集信息:查找關(guān)于深圳的旅游信息,包括主要的旅游景點(diǎn),當(dāng)?shù)氐奈幕蜌v史,美食,交通,住宿等。
  2. 規(guī)劃行程:根據(jù)你收集的信息,規(guī)劃你的行程。考慮你想要去的地方,你有多少時(shí)間,你的預(yù)算等。確保你的行程是實(shí)際和可行的。
  3. 預(yù)訂交通和住宿:一旦你確定了你的行程,你可以開始預(yù)訂你的交通和住宿。比較不同的選項(xiàng),找到最適合你的。
  4. 準(zhǔn)備必要的物品:根據(jù)你的行程和新疆的天氣,準(zhǔn)備你需要的物品,比如衣服,鞋子,相機(jī),地圖等。

例2:請(qǐng)根據(jù)需求幫我設(shè)計(jì)測(cè)試用例

請(qǐng)根據(jù)需求幫助我設(shè)計(jì)測(cè)試用例,測(cè)試用例的設(shè)計(jì)是一個(gè)系統(tǒng)化的過(guò)程,以下是一些基本步驟和思考方式:

  1. 理解需求:首先,你需要深入理解軟件的需求和功能。這包括閱讀需求文檔,理解用戶故事,或者與項(xiàng)目經(jīng)理和開發(fā)人員進(jìn)行討論。
  2. 確定測(cè)試范圍:確定你需要測(cè)試哪些功能和特性。這可能包括正常操作,邊緣情況,錯(cuò)誤處理等。
  3. 設(shè)計(jì)測(cè)試策略:確定你將如何測(cè)試這些功能。這可能包括單元測(cè)試,集成測(cè)試,系統(tǒng)測(cè)試,性能測(cè)試等。
  4. 編寫測(cè)試用例:對(duì)于每個(gè)測(cè)試,編寫一個(gè)詳細(xì)的測(cè)試用例。這應(yīng)該包括預(yù)期的輸入,預(yù)期的輸出,以及如何執(zhí)行測(cè)試。
  5. 評(píng)審測(cè)試用例:對(duì)測(cè)試用例進(jìn)行評(píng)審,以確保它們完整,準(zhǔn)確,并且易于理解。

復(fù)雜任務(wù)的拆解往往十分有效,不僅可以提升大模型的推理能力,也可以讓大模型的輸出更加貼合你的要求(對(duì)齊),但這需要你對(duì)當(dāng)前任務(wù)有一定的理解,才可以完成這樣的拆分。但如果你并不熟悉你要處理的任務(wù),如何完成這一步呢。正如前文中表達(dá)的觀念,我們希望得出一套通用的方法,讓每個(gè)人在面對(duì)每個(gè)任務(wù)時(shí)都可以完成 Prompt 的編寫,因此一定需要找到更加通用的方法。

其實(shí),這個(gè)步驟你完全可以讓大模型幫助你完成,這類似 Agent 中的 Planning 的思想,讓大模型幫助你拆分一項(xiàng)復(fù)雜任務(wù)。你可以使用這樣簡(jiǎn)單的 Prompt 完成這個(gè)任務(wù):

任務(wù)拆分 Prompt:

{{你要做的任務(wù)}},需要哪些步驟,該如何思考?
例:希望大模型幫我寫一份基金財(cái)務(wù)分析報(bào)告

輸入:

制作一份基金財(cái)務(wù)分析報(bào)告,需要哪些步驟,該如何思考?

輸出:

制作一份基金財(cái)務(wù)分析報(bào)告是一個(gè)涉及多個(gè)步驟的過(guò)程,需要對(duì)基金的財(cái)務(wù)狀況、投資策略、市場(chǎng)環(huán)境等進(jìn)行深入的研究和理解。以下是一些主要步驟和思考方式:

  1. 收集數(shù)據(jù):首先,你需要收集基金的財(cái)務(wù)數(shù)據(jù),包括但不限于基金的凈值、收益率、投資組合、費(fèi)用比率等。這些數(shù)據(jù)通常可以從基金公司的年度報(bào)告或季度報(bào)告中獲取。
  2. 數(shù)據(jù)分析:對(duì)收集到的數(shù)據(jù)進(jìn)行分析,包括對(duì)基金的收益率、風(fēng)險(xiǎn)、投資組合分布等進(jìn)行計(jì)算和比較。你可以使用一些財(cái)務(wù)分析工具,如 Excel,或者專門的財(cái)務(wù)分析軟件來(lái)進(jìn)行這些計(jì)算。
  3. 基金比較:將基金的表現(xiàn)與其同類基金或者基準(zhǔn)指數(shù)進(jìn)行比較,看看基金的表現(xiàn)是否超過(guò)市場(chǎng)平均水平。這可以幫助你理解基金的相對(duì)表現(xiàn)。
  4. 市場(chǎng)環(huán)境分析:考慮基金的投資環(huán)境,包括經(jīng)濟(jì)狀況、行業(yè)趨勢(shì)、政策變化等。這些因素可能會(huì)影響基金的表現(xiàn)。
  5. 基金經(jīng)理分析:研究基金經(jīng)理的投資策略和歷史表現(xiàn),看看他們是否有能力在不同的市場(chǎng)環(huán)境下取得良好的回報(bào)。
  6. 撰寫報(bào)告:將你的分析結(jié)果整理成一份報(bào)告,包括你的主要發(fā)現(xiàn)、基金的優(yōu)點(diǎn)和缺點(diǎn)、以及你對(duì)基金未來(lái)表現(xiàn)的預(yù)測(cè)。

在進(jìn)行這些步驟時(shí),你需要保持客觀和批判性的思考。不要只看基金的過(guò)去表現(xiàn),而要嘗試?yán)斫饣鸬谋憩F(xiàn)背后的原因。此外,你還需要考慮到市場(chǎng)的不確定性,因此在做出預(yù)測(cè)時(shí)要謹(jǐn)慎。

3.3 補(bǔ)要求

以上我們已經(jīng)通過(guò) “述問(wèn)題&定目標(biāo)” 描述清楚了我們的任務(wù),下面我們往往還需要對(duì)我們的任務(wù)提出一些要求,告訴大模型希望他做什么以及不做什么,這往往與模型在應(yīng)用中的準(zhǔn)確率息息相關(guān)。我們常用的要求可能有如下幾種:

  1. 字?jǐn)?shù)限制。
  2. 輸出結(jié)構(gòu)(結(jié)構(gòu)化輸出,Json 輸出)。
  3. 在輸出中排除 xxx。
  4. 在輸出中僅包含 xxx。

讓大模型遵循我們的要求,尤其是在“格式”層面讓大模型的輸出符合我們的規(guī)定,對(duì)大模型的工業(yè)應(yīng)用十分重要。如何讓大模型更聽(tīng)話,讓其遵循我們的要求呢?

首先,我們可以把要求放在 Prompt 的最后。大語(yǔ)言模型的本質(zhì)是在做文本補(bǔ)全,后文的輸出會(huì)更傾向于依據(jù)距離更近的語(yǔ)境,如果利用 “LIME” 這樣的模型解釋算法分析,距離更近的文本間權(quán)重往往更大,這在 Transofrmer 中的 Attention 權(quán)重 上也可以清晰的看到。同時(shí),這與大模型在預(yù)訓(xùn)練階段中完成的任務(wù)也更加匹配,雖然現(xiàn)在的大模型在 SFT 階段會(huì)進(jìn)行多種任務(wù)的訓(xùn)練,但其本質(zhì)上還是建立在自監(jiān)督“文本補(bǔ)全”任務(wù)上被訓(xùn)練出來(lái)的,因此其天然的更加遵從離得更近的文本。因此,把要求放在 Prompt 的最后可以很有效的幫助大模型變得更“聽(tīng)話”。

其次,我們還可以利用大模型的“編程”能力巧妙的讓他更“聽(tīng)話”。在“立角色”的部分中,我們說(shuō)“角色”時(shí)大模型的能力包,我們可以通過(guò)設(shè)定角色調(diào)用大模型的能力,那有什么能力可以讓大模型更“聽(tīng)話”呢?我們都知道“大模型”在“編程”方面也展現(xiàn)出了驚人的能力,而這個(gè)能力恰好可以將“模糊的文理問(wèn)題”變成“準(zhǔn)確的數(shù)理問(wèn)題”,以此讓大模型更加遵守我們的要求。

具體而言,就是把我們的要求轉(zhuǎn)換為一個(gè) “編碼” 任務(wù),例如:

請(qǐng)列出10個(gè)國(guó)家,并以列表形式返回
請(qǐng)列出10個(gè)國(guó)家,并以列表形式返回。我需要將這個(gè)列表引入到 python 代碼中,請(qǐng)嚴(yán)格遵守 python 列表的格式進(jìn)行輸出。

例2:請(qǐng)輸出10個(gè)國(guó)家,并包含這10個(gè)國(guó)家的“名稱”,“人口”,“位置”。
請(qǐng)列出10個(gè)國(guó)家,并包含這10個(gè)國(guó)家的“名稱”,“人口”,“位置”。我需要將這份數(shù)據(jù)引入到 python 代碼中,因此請(qǐng)以 Json 格式進(jìn)行輸出,Json 格式如下:”'{“name”: 名稱, “population”: 人口, “position”: 位置, }”’

例3:請(qǐng)為我輸出一份產(chǎn)品摘要,字?jǐn)?shù)不要超過(guò)50個(gè)字。
請(qǐng)為我輸出一份產(chǎn)品摘要。我需要將這個(gè)摘要引入到 python 代碼中,該變量的大小為50,因此摘要內(nèi)容不要超過(guò)50個(gè)字符通過(guò)這樣引入大模型“編程”能力的方式,我們可以對(duì)模型提出更加精準(zhǔn)的要求,并通過(guò)將我們的任務(wù)轉(zhuǎn)換為更加準(zhǔn)確的編程問(wèn)題的方式,讓大模型更 “聽(tīng)話”。

3.4 (補(bǔ)充)格式很重要

除了輸入的內(nèi)容外,輸入的格式也很重要,清晰的結(jié)構(gòu)對(duì)大模型的效果有很大的影響。除了增加合適的 “空行” 讓結(jié)構(gòu)變的清晰外,我們還可以增加一些“標(biāo)識(shí)符”來(lái)區(qū)分各個(gè)部分,例如:#,<>,```,[],-。同時(shí)大模型也具備 MarkDown 解析的能力,我們也可以借助 MarkDown 語(yǔ)法進(jìn)行 Prompt 結(jié)構(gòu)的整理。

由于“格式”對(duì)模型效果的影響,越來(lái)越多研究聚焦在了這個(gè)方向上,其中 “LangGPT” 得到了廣泛的應(yīng)用。LangGPT 提出了一種結(jié)構(gòu)化的 Prompt 模式,可以通過(guò)一套結(jié)構(gòu)化的模版構(gòu)造出格式清晰的 Prompt。

例:LangGPT 示例

# Role: 設(shè)置角色名稱,一級(jí)標(biāo)題,作用范圍為全局
## Profile: 設(shè)置角色簡(jiǎn)介,二級(jí)標(biāo)題,作用范圍為段落
– Author: yzfly 設(shè)置 Prompt 作者名,保護(hù) Prompt 原作權(quán)益 – Version: 1.0 設(shè)置 Prompt 版本號(hào),記錄迭代版本 – Language: 中文 設(shè)置語(yǔ)言,中文還是 English – Description: 一兩句話簡(jiǎn)要描述角色設(shè)定,背景,技能等
### Skill: 設(shè)置技能,下面分點(diǎn)仔細(xì)描述1. xxx 2. xxx
## Rules 設(shè)置規(guī)則,下面分點(diǎn)描述細(xì)節(jié)1. xxx 2. xxx
##Workflow 設(shè)置工作流程,如何和用戶交流,交互1. 讓用戶以 “形式:[], 主題:[]” 的方式指定詩(shī)歌形式,主題。 2. 針對(duì)用戶給定的主題,創(chuàng)作詩(shī)歌,包括題目和詩(shī)句。
##Initialization 設(shè)置初始化步驟,強(qiáng)調(diào) prompt 各內(nèi)容之間的作用和聯(lián)系,定義初始化行為。 作為角色 <Role>, 嚴(yán)格遵守 <Rules>, 使用默認(rèn) <Language> 與用戶對(duì)話。然后介紹自己,并告訴用戶 <Workflow>。

我們從 “LangGPT” 的示例中可以看到,他用各種分隔符對(duì) Prompt 內(nèi)容進(jìn)行了整理,可以很清晰的看到每部分的作用與區(qū)分。我們可以借鑒 “LangGPT” 對(duì)分隔符的使用,通過(guò)對(duì)格式的整理讓同樣的 Prompt 展現(xiàn)出更好的效果。

3.5 總結(jié)(框架)

我們把 “框架細(xì)化” 分成了4步,并在每一步中都提出了通用的實(shí)踐方法:

  1. 角色:通過(guò)角色模版和招聘 JD 補(bǔ)全角色。
  2. 問(wèn)題&目標(biāo):在大模型的輔助下拆分任務(wù)。
  3. 要求:借助編碼能力,讓大模型更好的遵守要求。
  4. 格式整理:結(jié)合 LangGPT 的思想合理應(yīng)用分隔符,讓 Prompt 結(jié)構(gòu)清晰。

至此,我們已經(jīng)完成了 Prompt 主體部分的編寫,面對(duì)任何一個(gè)任務(wù)都可以通過(guò)這套統(tǒng)一的方法完成一個(gè)還不錯(cuò)的 Prompt,并且通過(guò)我們對(duì) Prompt 結(jié)構(gòu)化的拆分,我們現(xiàn)在也可以更好的管理我們的 Prompt,并為上層應(yīng)用提供更好的支撐。

04 在框架上增加更多信息(RAG)


上文中我們已經(jīng)通過(guò) “Prompt 框架” 和 “框架的細(xì)化” 完成了 Prompt 主體部分的編寫,如果我們要在這基礎(chǔ)上進(jìn)一步優(yōu)化我們的 Prompt,我們還能怎么做呢?

大模型的推理,根本上還是基于用戶輸入的信息進(jìn)行推理,我們提供的信息越充分,大模型就能越好的完成推進(jìn)。因此,要想讓模型的效果更好,我們就需要提供更多的輸入信息。前兩章介紹的“框架”,僅僅包含了 Prompt 中“靜態(tài)”的信息,再進(jìn)一步擴(kuò)充這部分信息的同時(shí),我們還需要增加因任務(wù)而異的“動(dòng)態(tài)”信息,這兩部分信息的補(bǔ)充就是進(jìn)一步優(yōu)化 Prompt 的核心思想。

“增加更多信息,讓效果變得更好” 這個(gè)想法十分自然,但我們要增加什么信息?如何增加這些信息呢?

為了能在合適的場(chǎng)景下增加合適的信息,勢(shì)必要包含 “檢索” 的工作,來(lái)根據(jù)需要找到合適的信息,而說(shuō)到 “檢索” 就不得不提名聲大噪的 “RAG” 了。

4.1 RAG

RAG 技術(shù)在近期得到了大量的關(guān)注,也漸漸的在各種實(shí)際場(chǎng)景中得到了應(yīng)用。早在 ChatGPT 爆發(fā)之初,RAG 就已經(jīng)得到了不少的關(guān)注,大家很早就意識(shí)到,想要依賴模型參數(shù)注入知識(shí)不是可行的做法,要讓模型擁有動(dòng)態(tài)獲取知識(shí)的能力,不光對(duì)大模型在專業(yè)領(lǐng)域中的應(yīng)用十分重要,對(duì)知識(shí)的擴(kuò)展性和時(shí)效性在通用領(lǐng)域中也同樣重要。

與人類智能類比,人腦也并不需要把所有知識(shí)都放在大腦中,而是可以通過(guò)檢索的方式獲取知識(shí),再利用自身的智能進(jìn)行推理,最終得到結(jié)論。當(dāng)你使用各大廠商的大模型時(shí),你都會(huì)發(fā)現(xiàn)其包含檢索的步驟,通過(guò)檢索獲取的知識(shí)對(duì)大模型效果十分重要。


而這個(gè)檢索背后的技術(shù)就是 “RAG”,他可以利用大模型能力通過(guò)語(yǔ)義相似度的方式,高效的在文本數(shù)據(jù)上完成檢索,并把其增加到大模型的輸入當(dāng)中。


從技術(shù)角度看,上圖是 RAG 最原始的結(jié)構(gòu),也是 RAG 最核心的部分,通過(guò) “Embedding+向量數(shù)據(jù)庫(kù)” 的方式,RAG 可以無(wú)監(jiān)督的對(duì)文本數(shù)據(jù)進(jìn)行語(yǔ)義維度的匹配,這個(gè)思想早在 Word2Vec 時(shí)代就已經(jīng)得到了應(yīng)用,詞向量就已經(jīng)可以進(jìn)行“詞”維度的匹配,而如今大模型則是把這個(gè)維度提升到了所有文本數(shù)據(jù)。

現(xiàn)在已經(jīng)有了許多可以直接使用的RAG框架,如:LangChain, Milvus, LlamaIndex, Pincone 都提供了開箱即用的方案。而真的要讓 RAG 變得準(zhǔn)確好用,還是有很多值得優(yōu)化的地方,RAG 框架也已經(jīng)有了多種優(yōu)化版本。


如今的 RAG 技術(shù)已經(jīng)得到了充分的發(fā)展,已經(jīng)不僅僅局限于語(yǔ)義匹配本身,而誕生出了多種優(yōu)化版本,也增加了例如 “Rewrite”,  “Memory” 這樣的模塊,對(duì)于 RAG 技術(shù)感興趣的同學(xué)可以閱讀此篇survey:https://arxiv.org/pdf/2312.10997

如果我們從應(yīng)用角度重新看看 RAG ,不難發(fā)現(xiàn)其本質(zhì)就是檢索技術(shù),只是 RAG 利用大模型能力實(shí)現(xiàn)了更強(qiáng)的語(yǔ)義維度的檢索。而如果我們不知道怎么做 Embedding,也沒(méi)有向量數(shù)據(jù)庫(kù),不會(huì)使用 RAG,我們還可以完成檢索嗎?

答案顯然是肯定的 ,檢索依然是十分成熟的技術(shù)模塊了,即便利用最傳統(tǒng)的 “關(guān)鍵詞匹配” 也可以計(jì)算文本間的相似度,實(shí)現(xiàn)檢索的效果。因此,RAG 并不是唯一的技術(shù)方案,我們不必困在此處,在條件不足的情況下,我們可以結(jié)合場(chǎng)景找到最合適的檢索模式,踐行 RAG 的思想,在輸入中增加更多信息才是最核心的思想。

以上,我結(jié)合 RAG 介紹了 “如何增加信息?”,下面我就具體展開 “我們要增加什么信息?”

4.2 示例(Few-shot)


Few-shot 是無(wú)監(jiān)督學(xué)習(xí)的一種基本范式,相較于直接提問(wèn)的方式,One-shot 會(huì)提供一條示例,F(xiàn)ew-shot 會(huì)提供多條量示例再進(jìn)行提問(wèn),以此提升模型的效果。這種提供示例的方法,在不進(jìn)行專項(xiàng)訓(xùn)練的情況下可以很好的提升模型的準(zhǔn)確性和穩(wěn)定性,在各類大模型的論文中也可以看到這樣的對(duì)比,在各類任務(wù)中均可以表現(xiàn)出更好的效果。


對(duì)于 Few-shot 而言,最為人詬病的一點(diǎn)就是,當(dāng)你提供示例后,模型會(huì)更多的參照示例回答,而在某種程度上降低了模型本身的思考能力。Few-shot中的示例很大程度提升了模型結(jié)果的確定性,而確定性會(huì)影響模型展現(xiàn)出的智能水平,特別是對(duì)于基于表征學(xué)習(xí)的大語(yǔ)言模型(Certainty or Intelligence: Pick One!,Yann Le Cun)。

我們應(yīng)該如何緩解這個(gè)弊端呢?除了通過(guò)Prompt對(duì)模型進(jìn)行引導(dǎo)外,讓示例變得 “少而有效” 也是很好的方式,通過(guò)提供更具參考性的示例,提升每條示例的價(jià)值,同時(shí)降低示例的數(shù)量,可以有效的減少大模型的確定性,并通過(guò)這種方式盡量減少示例帶來(lái)的負(fù)面影響。

為了達(dá)到 “少而有效” 的效果就需要借助 “RAG” 的方式完成。通過(guò)提升檢索的效果,我們可以更精準(zhǔn)的找到與當(dāng)前任務(wù)最相近的示例(或反例),相比靜態(tài)的示例而言,這可以很大的增強(qiáng)模型對(duì)當(dāng)前任務(wù)的理解,以此提升模型在專項(xiàng)任務(wù)中的效果。

4.3 記憶(Memory)

除了在輸入中增加 “示例” 外,我們還可以增加“歷史記錄”,為大模型增加 “記憶(memory)” 。“記憶” 可以彌補(bǔ)大模型在知識(shí)整合和長(zhǎng)期記憶方面存在的明顯短板,而這恰恰是人腦的強(qiáng)項(xiàng)。人腦能持續(xù)不斷地整合知識(shí),形成強(qiáng)大的長(zhǎng)期記憶,為我們的思考和決策提供支持。

在一次對(duì)話內(nèi)的上下為可以被稱作“短期記憶”,而對(duì)于歷史的對(duì)話內(nèi)容則可以被稱為“長(zhǎng)期記憶”,在適當(dāng)?shù)膱?chǎng)景調(diào)用這些記憶,可以為當(dāng)前的對(duì)話補(bǔ)充必要的上下文,讓模型了解更多必要的背景信息,已在當(dāng)前任務(wù)中表現(xiàn)的更好。這種打破 “上下文長(zhǎng)度限制” 的方式,不光在專項(xiàng)任務(wù)中發(fā)揮效果,在更長(zhǎng)的生命周期上,讓模型可以調(diào)度歷史的“對(duì)話內(nèi)容”也被認(rèn)為是模型不斷進(jìn)化的方式之一。


例如,在上圖的例子中,當(dāng)大模型進(jìn)行電影推薦任務(wù)時(shí),會(huì)調(diào)取歷史記憶,確定用戶傾向的電影類型和看電影的時(shí)間,這些信息會(huì)在模型推理的過(guò)程中被加入到輸入中,以此推薦出更符合預(yù)期的結(jié)果。


我們可以根據(jù)每一輪對(duì)話的輸入,利用“RAG”技術(shù),動(dòng)態(tài)的從記憶庫(kù)中獲取合適的內(nèi)容加入到輸入中,讓大模型可以跨任務(wù),跨周期的進(jìn)行歷史數(shù)據(jù)的獲取。這在通用領(lǐng)域可以進(jìn)行知識(shí)的打通,建立知識(shí)間的關(guān)聯(lián),在專業(yè)領(lǐng)域中面對(duì) “專業(yè)概念/專業(yè)詞匯” 時(shí),除了依賴人工對(duì)專業(yè)知識(shí)的整理,歷史數(shù)據(jù)中沉淀的專業(yè)知識(shí)也是十分有效的信息,通過(guò)歷史數(shù)據(jù)的引入排除對(duì)人工的依賴,在使用過(guò)程中不斷提升模型對(duì)專業(yè)知識(shí)的理解,這也是很多論文中提到的“通過(guò)長(zhǎng)期記憶讓模型自我進(jìn)化”的思想。

“記憶” 是十分重要的大模型推理模塊之一,在 Agent 建設(shè)中也扮演了重要的角色,相關(guān)的研究還在不斷發(fā)展,記憶管理框架(MemGPT)也在工業(yè)中得到了越來(lái)越廣泛的應(yīng)用,誕生了許多令人印象深刻的記憶框架。

例如,來(lái)自俄亥俄州立大學(xué)和斯坦福大學(xué)的科學(xué)家們給出了一項(xiàng)有趣的研究,希望讓人工智能擁有一個(gè)類似人類海馬體的”記憶大腦”。從神經(jīng)科學(xué)的角度出發(fā),模仿人腦海馬體在長(zhǎng)期記憶中的作用,設(shè)計(jì)出一個(gè)名為 HippoRAG 的模型,能夠像人腦一樣高效地整合和搜索知識(shí)。


他們利用大語(yǔ)言模型處理信息,并用一個(gè)知識(shí)圖譜來(lái)充當(dāng)“記憶索引”,引入了檢索模型來(lái)連接語(yǔ)言模型和知識(shí)圖譜。當(dāng)模型接收到一個(gè)新的查詢時(shí),它先從查詢中提取關(guān)鍵概念,然后在知識(shí)圖譜上應(yīng)用 “Personalized PageRank” 算法進(jìn)行概念擴(kuò)展和檢索,模擬海馬體的聯(lián)想記憶能力。最后,模型根據(jù)節(jié)點(diǎn)的重要性對(duì) passage 進(jìn)行排序和檢索,進(jìn)行“模式補(bǔ)全”。實(shí)驗(yàn)表明,這個(gè)“記憶大腦”能夠在多跳問(wèn)答等需要 “知識(shí)整合” 的任務(wù)上取得大幅提升。

4.4 應(yīng)對(duì)專業(yè)領(lǐng)域

大模型擅長(zhǎng)回答通用的知識(shí),但對(duì)于專業(yè)領(lǐng)域內(nèi)的知識(shí)就顯得沒(méi)那么擅長(zhǎng),而對(duì)于大模型的工業(yè)應(yīng)用而言,我們往往要處理某個(gè)專業(yè)領(lǐng)域內(nèi)的專項(xiàng)任務(wù),這需要大模型理解必要的專業(yè)知識(shí)和專業(yè)方法,并在合適的時(shí)候調(diào)度它們,以此在工業(yè)應(yīng)用中取得穩(wěn)定的效果,這也成為了大模型應(yīng)用最大的問(wèn)題之一。

專業(yè)領(lǐng)域知識(shí)的增加對(duì)大模型在專業(yè)領(lǐng)域上的應(yīng)用效果至關(guān)重要,以我們近一年應(yīng)用大模型在“測(cè)試領(lǐng)域”的實(shí)踐為例,我們希望大模型幫助測(cè)試同學(xué)完成測(cè)試工作,例如 “編寫/檢查” 測(cè)試用例。

要完成這樣一個(gè)相對(duì)專業(yè)的領(lǐng)域任務(wù),就需要大模型了解足夠的領(lǐng)域知識(shí),例如測(cè)試用例的檢查標(biāo)準(zhǔn),常用的測(cè)試方法,各類用例設(shè)計(jì)方法,以及必要的業(yè)務(wù)背景知識(shí)。為了能讓大模型具備這些支持,我們首先需要與領(lǐng)域?qū)<覅f(xié)作,對(duì)測(cè)試域相關(guān)的知識(shí)進(jìn)行整理,管理好這些知識(shí)是大模型應(yīng)用的基礎(chǔ)。


同時(shí),專業(yè)領(lǐng)域的知識(shí)與具體任務(wù)息息相關(guān)。例如,對(duì) “用例檢查” 任務(wù)而言,我們的目的是通過(guò)用例檢查發(fā)現(xiàn)用例中存在的問(wèn)題,以此減少用例原因?qū)е碌穆y(cè)問(wèn)題。因此,我們從目的出發(fā),對(duì)漏測(cè)問(wèn)題進(jìn)行分析,在確定檢查點(diǎn)的同時(shí),結(jié)合用例現(xiàn)狀和專業(yè)知識(shí)進(jìn)行了問(wèn)題定義的梳理,通過(guò)明確問(wèn)題定義讓大模型更好的貼合我們的專業(yè)領(lǐng)域。

除了上述這些對(duì)專業(yè)知識(shí)的整理,我們還希望動(dòng)態(tài)的增加這些信息,利用 RAG 的方法,結(jié)合具體任務(wù)動(dòng)態(tài)的從知識(shí)庫(kù)中引入必要的知識(shí)。例如,當(dāng)用戶的輸入中包含某些專業(yè)詞匯或業(yè)務(wù)概念時(shí),我們需要?jiǎng)討B(tài)的識(shí)別到他們,并對(duì)他們進(jìn)行解釋和補(bǔ)充,這可能需要利用 “插件” 完成,關(guān)于“插件”的相關(guān)內(nèi)容我會(huì)在“Agent”相關(guān)的文章中具體展開,此處不再贅。

無(wú)論是 “靜態(tài)知識(shí)” 還是 “動(dòng)態(tài)知識(shí)”,都是通過(guò)對(duì)專業(yè)知識(shí)的整理,彌補(bǔ)大模型在專業(yè)領(lǐng)域上的不足,我們要將”專業(yè)知識(shí)“翻譯成”通用知識(shí)“ 告訴模型大模型,讓大模型更好的應(yīng)對(duì)專業(yè)領(lǐng)域。這一步往往需要領(lǐng)域?qū)<业慕槿胍约皩?duì)知識(shí)的人工整理,這往往是決定大模型效果上限最重要的因素之一。

4.5 總結(jié)(增加更多信息)


本章,我們通過(guò)進(jìn)一步增加信息的方式提升模型的效果,并通過(guò)兩個(gè)問(wèn)題分析了增加信息的方式:

  1. 如何增加信息:RAG,或其他檢索方式。
  2. 增加什么信息:

我們通過(guò)框架和額外信息的增加,在輸入層面上完成了 Prompt 的調(diào)試,接下來(lái)就需要讓模型根據(jù)我們的輸入進(jìn)行推理,而推理本身的效果也是影響模型效果很重要的因此,下面就來(lái)展開談?wù)劊绾卧谳斎氲幕A(chǔ)上提升模型的推理能力。

05 讓大模型更好的思考(CoT)

5.1 什么是 CoT

2022 年,在 Google 發(fā)布的論文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中首次提出,通過(guò)讓大模型逐步推理,將一個(gè)復(fù)雜問(wèn)題分解為若干個(gè)子問(wèn)題,并一步一步的進(jìn)行推理,通過(guò)這種方式可以顯著提升大模型的性能。這種推理方法就被稱為思維鏈(Chain of Thought)。

區(qū)別于傳統(tǒng) Prompt 通過(guò)控制輸入直接端到端的得到輸出,即input ——> output 的方式,CoT 完成了從輸入到思維鏈再到輸出的映射,input——> reasoning chain ——> output

自 CoT 問(wèn)世以來(lái),CoT 的能力已經(jīng)被無(wú)數(shù)工作所驗(yàn)證,如下圖所示,可以看到,相較于直接 Prompt, CoT 對(duì)所有的推理任務(wù)都帶來(lái)了顯著的提升

5.2 CoT 的實(shí)現(xiàn)

上圖展示了幾種不同范式下對(duì)CoT的實(shí)現(xiàn)。對(duì)于 Zero-Shot 而言只需要簡(jiǎn)單的一句 “Let’s think step by step” 就可以讓模型一步步思考;對(duì)于 Few-Shot 而言,除了在提問(wèn)時(shí)引入分步的思想,還提供了逐步思考的示例,不僅可以讓大模型分步思考,還可以通過(guò)示例告訴大模型應(yīng)該如何分步;對(duì)于 Agent 而言,我們不光通過(guò)修改輸入的方式實(shí)現(xiàn) CoT,而是人為的對(duì)任務(wù)進(jìn)行拆分,并通過(guò)多輪對(duì)話的方式將 CoT 引入到建模過(guò)程當(dāng)中,實(shí)現(xiàn)整體任務(wù)維度的 CoT。

如上圖所示,CoT 的構(gòu)造主要以線性為主,對(duì)任務(wù)進(jìn)行線性拆分,并按先后順序以此執(zhí)行。而隨著 CoT 相關(guān)研究的不斷發(fā)展,思維鏈的形式不僅僅局限在線性的形式,而是衍生出了樹狀,表狀,圖狀等多種類型,其中代表工作有 PoT,Tab-CoT,ToT,GoT-Rationale 等等,下圖清晰的展示了這幾種方法的異同:

5.3 CoT 的應(yīng)用

CoT 的本質(zhì)是將一個(gè)高度不確定的復(fù)雜任務(wù),拆分成若干個(gè)確定性較高的子任務(wù),以此提升整個(gè)系統(tǒng)的效果和確定性。從 “zero-shot”  和  “few-shot” 范式中,CoT 這是一種推理技巧,而從 “Agent” 范式看,CoT 則更像一種建模思路,這也是 CoT 更核心的思想。當(dāng)我們面對(duì)一個(gè)復(fù)雜任務(wù)時(shí),僅對(duì)輸入進(jìn)行改造是不夠的,我們還需要進(jìn)行任務(wù)維度的分解,用 CoT 的方式進(jìn)行建模。

例如,如果我需要大模型幫我完成一篇文章,我有兩種做法:

  1. 輸入信息 – 輸出文章。
  2. 輸入信息 – 輸出大綱 – 完善大綱內(nèi)容 – 依據(jù)要求進(jìn)行調(diào)整 – 輸出文章。

這個(gè)例子只是一個(gè)簡(jiǎn)單的拆分,但也能在效果上得到很大提升。下面舉一個(gè)我們實(shí)際工作中的例子,我們希望大模型幫助測(cè)試同學(xué)編寫“測(cè)試用例”,對(duì)于這個(gè)任務(wù)而言,最直觀的做法就是把 “需求” 做為輸入,讓大模型根據(jù)需求進(jìn)行測(cè)試設(shè)計(jì),生成“測(cè)試用例”,而需求的復(fù)雜程度和不確定性對(duì)任務(wù)造成了極大的阻礙,因此我們引入 CoT 的思想對(duì)任務(wù)進(jìn)行了拆分。

如上圖所示,我們將這個(gè)復(fù)雜任務(wù)拆分成了3個(gè)階段(實(shí)際上每一階段又會(huì)拆分正若干個(gè)子步驟)。首先對(duì)需求進(jìn)行分析,整理需求內(nèi)容,并從需求中抽取功能點(diǎn)及測(cè)試對(duì)象;然后基于這些功能點(diǎn)進(jìn)行用例設(shè)計(jì),編寫用例集的整體結(jié)構(gòu),以及每條用例的測(cè)試點(diǎn),即用例標(biāo)題;最后對(duì)用例進(jìn)行補(bǔ)全,根據(jù)需求和用例標(biāo)題編寫用例的步驟和預(yù)期結(jié)果。我們通過(guò)這種方式,將任務(wù)分為了3個(gè)階段,無(wú)論是從“研發(fā)”還是從“應(yīng)用”角度都為我們的任務(wù)帶來(lái)了極大的幫助。

從“研發(fā)”角度看,當(dāng)我們把一個(gè)任務(wù)分解為多個(gè)階段后,我們很容易的可以找到其中 “最簡(jiǎn)單” 的階段。例如,在上圖的鏈路中,對(duì)需求的分析相對(duì)困難,而 “根據(jù)標(biāo)題生成步驟” 則相對(duì)簡(jiǎn)單,以此做為切入點(diǎn)可以在前期為我們避免最復(fù)雜的“需求”數(shù)據(jù),讓我們可以快速達(dá)到可應(yīng)用的效果。這種研發(fā)思路并非僅對(duì)這個(gè)任務(wù)有效,對(duì)于前文中提到的 “文章編寫” 的例子,“輸出大綱” 和 “依據(jù)要求進(jìn)行調(diào)整” 顯然是更簡(jiǎn)單的子任務(wù),率先在從這些點(diǎn)切入,也可以幫我們更快的取得成效。

從“應(yīng)用”角度看,即便大模型展現(xiàn)出了極為驚艷的效果,但在應(yīng)用中的短板也十分明顯,大家也逐漸看到了大模型能力的限制。基于對(duì)現(xiàn)有模型能力的判斷,“人機(jī)協(xié)同(copilot)” 被越來(lái)越多人認(rèn)為是更好的方式。而 “人機(jī)協(xié)同” 是一個(gè)共同生產(chǎn)的過(guò)程,如果大模型僅僅是端到端的完成一個(gè)任務(wù),人很難介入的,而當(dāng)我們進(jìn)行了任務(wù)維度的拆分后,每一個(gè)子任務(wù)都可以與人協(xié)同。例如,在“用例生成”中,人可以先對(duì)需求進(jìn)行分析,再讓大模型進(jìn)行用例設(shè)計(jì),通過(guò)這種人機(jī)協(xié)同的應(yīng)用模式,我們可以讓大模型在應(yīng)用中更快速的落地。

06 附加技巧

前文中,我們已經(jīng)介紹了 Prompt 調(diào)試的主要步驟,也是一條標(biāo)準(zhǔn)的工作流,可以幫助我們從 0 到 1 的完成 Prompt 的編寫和調(diào)試:“Prompt 框架” - “細(xì)化框架” - “增加更多信息” - “CoT”而正如開篇時(shí)提到的,Prompt 相關(guān)的技巧已多如牛毛,并且一直隨著模型的迭代而不斷更新,我們前文中講的是 “Prompt 工程” 的主要步驟和思想,而在其之上,還是有不少技巧可以進(jìn)行進(jìn)一步的優(yōu)化,下面我選擇其中最重要的幾點(diǎn)展開聊聊。

6.1 用參數(shù)控制模型確定性

除了調(diào)整模型的輸入外,大家一定注意到了大模型還有2個(gè)參數(shù)可以調(diào)節(jié):溫度(Temperature),Top-P這兩個(gè)參數(shù)也與大模型效果息息相關(guān),控制著大模型輸出的確定性。大模型的本質(zhì)是在 Token 的概率空間中進(jìn)行選擇,依據(jù)概率選擇接下來(lái)要輸出的 Token,而這 2 個(gè)參數(shù)就是在控制這個(gè)過(guò)程。

Temperature(溫度)是一個(gè)正實(shí)數(shù),用于控制生成文本的隨機(jī)性和多樣性。在生成過(guò)程中,模型會(huì)為每個(gè)可能的下一個(gè)詞分配一個(gè)概率,而調(diào)整溫度,則可以影響這些概率分布的形狀。當(dāng)溫度接近 0 時(shí),輸出文本會(huì)變得更加確定,模型更傾向于選擇具有較高概率的詞,這可能導(dǎo)致生成的文本質(zhì)量較高,但多樣性較低。當(dāng)溫度接近 1 時(shí),輸出文本的隨機(jī)性增加,模型會(huì)更平衡地從概率分布中選擇詞匯,這可能使生成的文本具有更高的多樣性,但質(zhì)量可能不如較低溫度時(shí)的輸出。溫度大于 1 時(shí),輸出文本的隨機(jī)性會(huì)進(jìn)一步增加,模型更可能選擇具有較低概率的詞。

Top-p 是一個(gè) 0 到 1 之間的實(shí)數(shù),表示另一種生成策略,它根據(jù)概率分布的累積概率來(lái)選擇候選詞。具體來(lái)說(shuō),模型將根據(jù)詞匯的概率對(duì)其進(jìn)行排序,然后選擇一個(gè)子集,使得這個(gè)子集的累積概率至少為 p。當(dāng) p 接近 1 時(shí),生成的文本將包含幾乎所有可能的詞匯,導(dǎo)致較高的隨機(jī)性和多樣性。當(dāng) p 較小時(shí),生成的文本將僅包含具有較高概率的詞匯,降低隨機(jī)性并提高輸出質(zhì)量。然而,過(guò)低的 p 值可能導(dǎo)致模型過(guò)于保守,生成的文本過(guò)于重復(fù)或單調(diào)。

為了了便于理解,我們可以舉一個(gè)抽象的例子,幫助大家理解。假設(shè)我們有一個(gè)語(yǔ)言模型,它正在預(yù)測(cè)句子中的下一個(gè)單詞。我們輸入的句子是我喜歡吃蘋果和____,那么模型可能會(huì)為香蕉分配 0.4 的概率,為橙子分配 0.2 的概率,為鴨梨分配 0.2 的概率,為白菜分配 0.1 的概率,為蘿卜分配 0.1 的概率。

假如我們?cè)O(shè)定Top-P = 0.8,則我們會(huì)按照概率大小選擇盡可能多的詞,并讓概率的總和小于0.8。因此我們會(huì)選擇 “香蕉”,“橙子”,“鴨梨”,而如果再加上 “白菜” 則累計(jì)概率會(huì)超過(guò)閾值 0.8。

最后模型會(huì)在 “香蕉”,“橙子”,“鴨梨” 中隨機(jī)選擇一個(gè)單詞。在這個(gè)例子中,我們有 50% 的幾率會(huì)選擇 “香蕉”,25% 的幾率選擇 “橙子”,25% 的幾率選擇 “鴨梨”。這一步中的概率還會(huì)被 “Temperature(溫度)” 所影響。

總結(jié)而言,溫度(Temperature)和 Top-p 是對(duì)模型輸出確定性的控制,我們可以根據(jù)具體的應(yīng)用場(chǎng)景進(jìn)行調(diào)試,當(dāng)我們需要模型確定穩(wěn)定的產(chǎn)出結(jié)果是,我們可以設(shè)置更高的確定性,以提升模型應(yīng)用的穩(wěn)定性。但當(dāng)我們需要模型提供多種結(jié)果,或希望讓模型更具想象力時(shí),我們則需要設(shè)置更高的多樣性。   

6.2 讓大模型幫你優(yōu)化 Prompt

我們可以使用各種技巧優(yōu)化我們的 Prompt,那大模型可不可以幫我們自動(dòng)優(yōu)化我們的 Prompt 呢?這個(gè)研究方向自 ChatGPT 以來(lái)就一直得到大量關(guān)注,且在大模型時(shí)代得到了越來(lái)越多的應(yīng)用,他不光可以對(duì)已有的 Prompt 進(jìn)行優(yōu)化,還可以自動(dòng)找到一些 Prompt 語(yǔ)句,神奇的產(chǎn)生通用的效果。例如,在 “Zero-Shot COT” 里的那句 “Let’s think step by step”,谷歌就曾通過(guò)這種方式找到了更好的一句:“Take a deep breath and work on this problem step-by-step”,讓GSM8K的結(jié)果直接從 71.8% 上升到了 80.2%。這個(gè)研究方向還在快速的發(fā)展當(dāng)中,已經(jīng)誕生了多種算法,下文將挑選其中最經(jīng)典的幾個(gè)算法,希望可以讓大家更好的了解這個(gè)領(lǐng)域。

APE 是其中最經(jīng)典的算法,核心思路是:從候選集中選出若干較好的 Prompt,再在這些 Prompt 附近進(jìn)行 “試探性搜索”。其過(guò)程為,先通過(guò)大模型生成若干 Prompt,再在訓(xùn)練集上打分,保留較好若干條的 Prompt,最后在這些高分 Prompt 附近進(jìn)行采樣,模擬 “Monte-Carlo Search” 的過(guò)程,優(yōu)化得到最理想的 Prompt。

APO 算法則是引入了 “梯度下降” 的方法,通過(guò)訓(xùn)練集得到當(dāng)前 Prompt 的梯度,在應(yīng)用“梯度下降”的方式得到新的 Prompt,最后與 APE 一樣進(jìn)行采樣,得到最終的 Prompt。

OPRO 算法則是更復(fù)雜的利用 LLMs 作為優(yōu)化器。與傳統(tǒng)的迭代優(yōu)化技術(shù)不同,OPRO 采用自然語(yǔ)言描述和指引優(yōu)化任務(wù),通過(guò) LLMs 的指導(dǎo),結(jié)合先前找到的解決方案,不斷生成更新的策略。

6.3 更多技巧

如本文開篇提到的,本文嘗試結(jié)合我們的研發(fā)經(jīng)驗(yàn),體系化的梳理 “Prompt” 相關(guān)工作,嘗試用一套通用的框架,對(duì) Prompt 工程的相關(guān)工作進(jìn)行梳理和總結(jié)。但也正如本章的用意,在統(tǒng)一的框架之外還有各種技巧,可以起到錦上添花的作用,這部分技巧無(wú)論是公司內(nèi)外都積累了很多文章,且由于技巧過(guò)多,因此在本文沒(méi)有展開討論,此處總結(jié)其中的 3 個(gè)重要方法,在我們的實(shí)踐中起到了不小的作用:

  1. 自我一致性:多讓模型輸出多個(gè)回答,然后在 LLM 的多次回答中選擇出現(xiàn)多次的答案。
  2. 反思:通過(guò)讓大模型評(píng)估自己的輸出進(jìn)行調(diào)整,得到更優(yōu)的輸出。
  3. 知識(shí)生成:讓大模型生成問(wèn)題相關(guān)的知識(shí),再提出問(wèn)題,提高大模型回答的準(zhǔn)確率。

對(duì)于這部分技巧,如果有機(jī)會(huì)將用一篇單獨(dú)的文章介紹,本篇文章不再展開,如果大家對(duì)這些方法感興趣可以學(xué)習(xí)傳播最廣的 Prompt 知識(shí)庫(kù),Prompt Engineering Guid。

07 優(yōu)化方式及常用指標(biāo)

本文一直在是希望向大家介紹 “Prompt” 調(diào)試的方法,而 “Prompt 調(diào)試” 本質(zhì)上是為了讓模型在任務(wù)中有更好的效果,而這就涉及到效果的評(píng)估,當(dāng)我們對(duì) “Prompt” 進(jìn)行了一次更新,我如何判斷模型效果是不是變好了呢?對(duì) AI 技術(shù)有所了解的同學(xué)想必對(duì)這部分十分熟悉,但對(duì)于沒(méi)有接觸過(guò) AI 技術(shù)的同學(xué),還是有必要補(bǔ)充一些和模型調(diào)試相關(guān)的基本知識(shí),輔助大家更好的完成模型調(diào)試的工作。

要判斷大模型的效果,首先需要有數(shù)據(jù)作為支撐,其次還需要確定衡量效果的指標(biāo)。計(jì)算大模型在測(cè)試數(shù)據(jù)上的指標(biāo)是判斷大模型效果的依據(jù),這里我提供一些常用的指標(biāo),用來(lái)衡量大模型在各類任務(wù)中的效果。

分類問(wèn)題

  1. 準(zhǔn)確率:分類正確的樣本占總樣本個(gè)數(shù)的比例。
  2. 精確率(Precision):又稱為查準(zhǔn)率,分類正確的正樣本占判定為正樣本個(gè)數(shù)的比例。
  3. 召回率(Recall):又稱為查全率,分類正確的正樣本占真正的正樣本個(gè)數(shù)的比例。
  4. F1 Score:是精確率和召回率的平衡,最常用的評(píng)價(jià)指標(biāo)。

生成問(wèn)題

  1. BLEU:比較生成數(shù)據(jù)和標(biāo)注數(shù)據(jù)中 n-gram 的重合程度。
  2. METEOR:與 BLEU 相比不僅考慮了精確度和召回率,還考慮了生成結(jié)果的詞序。
  3. 困惑度(Perplexity):所有測(cè)試樣本的交叉熵?fù)p失求平均后取指數(shù),用于衡量模型對(duì)測(cè)試數(shù)據(jù)的預(yù)測(cè)能力。困惑度越低,說(shuō)明模型的預(yù)測(cè)能力越好。
  4. 采納率:對(duì)于生成任務(wù)而言,往往沒(méi)有明確的預(yù)期結(jié)果,更多采用人工采納比例作為評(píng)價(jià)指標(biāo),更細(xì)的可以分為“直接可用率”和“修改后可用率”。

對(duì)于專項(xiàng)任務(wù)而言,每個(gè)任務(wù)在調(diào)試前都需要準(zhǔn)備自己獨(dú)立的數(shù)據(jù)集,包含與每一個(gè)輸入對(duì)應(yīng)的預(yù)期結(jié)果,不同的指標(biāo)代表用不同方式評(píng)估 “預(yù)期結(jié)果” 和 “實(shí)際結(jié)果” 的相似度。而對(duì)于一些通用的 NLP 能力而言,業(yè)內(nèi)也有一些開源數(shù)據(jù)集,被用于衡量模型各項(xiàng)通用能力的效果(文本摘要,語(yǔ)義理解,對(duì)話,e.t.c.),如果你正在調(diào)試一項(xiàng)通用能力,或沒(méi)有足夠的任務(wù)數(shù)據(jù),就可以利用這些數(shù)據(jù)集,我在這里也挑選其中一部分做一個(gè)簡(jiǎn)單的介紹:

英文數(shù)據(jù)集

  1. GLUE Benchmark: 一個(gè)集成了九個(gè)獨(dú)立任務(wù)的評(píng)估工具,用于測(cè)量模型對(duì)英文句子的理解能力。它包括語(yǔ)義角色標(biāo)注(SRL)、自然語(yǔ)言推理(NLI)、語(yǔ)義文本相似性(STS)等任務(wù)。
  2. SuperGLUE Benchmark: GLUE 的后繼者,SuperGLUE 包括更復(fù)雜的語(yǔ)言理解任務(wù),如多源自然語(yǔ)言推理、詞匯互推任務(wù)等。
  3. SQuAD:一個(gè)用于機(jī)器閱讀理解的數(shù)據(jù)集,包含由維基百科文章生成的問(wèn)題和答案。
  4. CoQA:一個(gè)對(duì)話型問(wèn)答數(shù)據(jù)集,用于測(cè)試模型在對(duì)話環(huán)境中的理解能力。
  5. MNLI:一個(gè)用于自然語(yǔ)言推理(NLI)任務(wù)的大規(guī)模數(shù)據(jù)集,包含在多種不同領(lǐng)域和類型的文本中進(jìn)行推理的任務(wù)。
  6. CommonsenseQA:一個(gè)問(wèn)題回答數(shù)據(jù)集,主要測(cè)試模型的常識(shí)理解能力。
  7. RACE:一個(gè)閱讀理解數(shù)據(jù)集,包含了從英語(yǔ)考試中提取的大量文章和問(wèn)題。
  8. Winograd Schema Challenge:一個(gè)用于測(cè)試模型在處理需要常識(shí)和推理能力的句子解析問(wèn)題上的表現(xiàn)。
  9. GSM8K:一個(gè)小學(xué)數(shù)學(xué)文字題的數(shù)據(jù)集。該數(shù)據(jù)集被創(chuàng)建出來(lái),是為了支持回答那些需要多步推理的基本數(shù)學(xué)問(wèn)題的任務(wù)。
  10. MAWPS:一個(gè)在線的數(shù)學(xué)詞問(wèn)題倉(cāng)庫(kù),旨在為評(píng)估不同的算法提供一個(gè)統(tǒng)一的測(cè)試平臺(tái)。它允許自動(dòng)構(gòu)建具有特定特征的數(shù)據(jù)集,提供了調(diào)整數(shù)據(jù)集的詞匯和模板重疊以及過(guò)濾來(lái)自網(wǎng)上語(yǔ)料庫(kù)的不合語(yǔ)法問(wèn)題的工具。
  11. SVAMP:一個(gè)面向小學(xué)級(jí)別的數(shù)學(xué)詞問(wèn)題(MWP)的挑戰(zhàn)集。每個(gè) MWP 都包含一個(gè)簡(jiǎn)短的自然語(yǔ)言敘述,描述了世界的狀態(tài)并提出了一些未知數(shù)量的問(wèn)題。SVAMP 中的例子在解決 MWP 的不同方面測(cè)試一個(gè)模型,比如問(wèn)題敏感性和強(qiáng)大的推理能力。

中文數(shù)據(jù)集

  1. ChineseGLUE: 一個(gè)與英文 GLUE 類似的中文 NLP 評(píng)估工具,包含了多種中文語(yǔ)言理解任務(wù)。
  2. LCQMC: 一個(gè)大規(guī)模的中文問(wèn)題匹配數(shù)據(jù)集,主要用于研究和改進(jìn)中文的問(wèn)答系統(tǒng)。
  3. DuConv: 一個(gè)中文對(duì)話系統(tǒng)數(shù)據(jù)集,用于構(gòu)建對(duì)話系統(tǒng)的中文數(shù)據(jù)集,其特點(diǎn)是能夠產(chǎn)生多輪對(duì)話。
  4. WebQA:  一個(gè)大規(guī)模的中文問(wèn)答數(shù)據(jù)集,主要包括以自然語(yǔ)言形式提出的問(wèn)題和對(duì)應(yīng)的答案。
  5. CMRC 2018: 一個(gè)大規(guī)模的中文機(jī)器閱讀理解數(shù)據(jù)集,類似于英文的SQuAD。

08 寫在最后

8.1 總結(jié)

本文嘗試結(jié)合我們的研發(fā)經(jīng)驗(yàn),體系化的對(duì) “Prompt 工程” 的相關(guān)工作進(jìn)行了梳理,得到了一個(gè)標(biāo)準(zhǔn)化的工作流,幫助大家可以從0到1的完成一個(gè) Prompt 的書寫和調(diào)試,并通過(guò)這樣結(jié)構(gòu)化的拆分,增強(qiáng)對(duì) Prompt 的管理。我們的工作流可以分為 5 步,對(duì)應(yīng)于文章 “第2節(jié)-第6節(jié)” 的 5 個(gè)章節(jié):

  1. 通過(guò) Prompt 模版寫出第一版 Prompt。
  2. 細(xì)化模版各部分內(nèi)容,整理 Prompt 格式
  3. 使用 RAG 增加更多信息(few-shot,記憶,專業(yè)知識(shí))。
  4. 利用 CoT 增強(qiáng)模型推理能力。
  5. 利用更多技巧不斷優(yōu)化。

我們認(rèn)為在一個(gè)大模型工程中,“Prompt”應(yīng)該起到基石般的作用,有效穩(wěn)定可擴(kuò)展。對(duì)于一個(gè)大模型工程師而言,“Prompt” 也是必備的基礎(chǔ)技能,希望可以通過(guò)這篇文章幫助大家更簡(jiǎn)單的上手 Prompt 的相關(guān)工作,讓每個(gè)人都能編寫 Prompt,人人都能成為 Prompt 工程師。   

8.2 后續(xù)規(guī)劃

本文通過(guò)對(duì) “Prompt” 工作的拆分和總結(jié),體系化的介紹了 “Prompt 工程” 的工作方法,提出了一套通用的框架和工作流,幫助大家完成 “Prompt” 的編寫和調(diào)試工作,這套方法也已經(jīng)在我們的實(shí)際工作中應(yīng)用落地。

從技術(shù)角度講,大模型相關(guān)的研發(fā)工作可以大體分為3部分 “輸入” – “推理” – “訓(xùn)練”,本文聚焦在單模型的 “輸入” 部分,對(duì) “Prompt 工程” 相關(guān)的技巧進(jìn)行了探討。但僅僅在輸入層面進(jìn)行調(diào)試是遠(yuǎn)遠(yuǎn)不夠的,推理部分也是影響大模型效果的關(guān)鍵一環(huán),“Agent 技術(shù)”,“多模型協(xié)作”,“模型調(diào)度”  等等話題對(duì)大模型效果有著至關(guān)重要的影響。

因此,后續(xù)我會(huì)聚焦在模型推理的部分,以 “Agent 技術(shù)”  作為重點(diǎn),展開討論“模型推理”,“模型調(diào)度” 相關(guān)的話題,對(duì)“LangChain”,“Dify” 等推理框架,以及 “Agent” 常用框架進(jìn)行探討,依然從應(yīng)用角度出發(fā),探討我對(duì)這些技術(shù)的思考,以及如何在應(yīng)用中快速落地。

以下是一些大模型API可以幫助開發(fā)者快速應(yīng)用AI功能:

作者|劉琮瑋
原文轉(zhuǎn)自 微信公眾號(hào)@騰訊云開發(fā)者

上一篇:

加速生成式AI體驗(yàn)

下一篇:

亞馬遜 RAG 新突破:REAPER 技術(shù)開啟大型智能對(duì)話助手新境界
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)