Prompt進階系列1:LangGPT(從程式語言反思LLM的結構化可複用提示設計框架)

汀、人工智能發表於2024-03-08

Prompt進階系列1:LangGPT(從程式語言反思LLM的結構化可複用提示設計框架)

大語言模型 (Large Language Models, LLMs) 在不同領域都表現出了優異的效能。然而,對於非AI專家來說,制定高質量的提示來引導 LLMs 是目前AI應用領域的一項重要挑戰。現有的提示工程研究已經提出了一些零散的最佳化原則,也有些研究設計了基於經驗的提示最佳化器。然而,這些研究缺乏結構化的設計模板,學習成本高,可複用性低。受到程式語言的結構化和可複用性的啟發,提出了雙層提示設計框架 LangGPT,作為面向 LLM 的程式語言。LangGPT 具有易於學習的規範結構,併為遷移和複用提供了擴充套件結構。實驗表明,與 baseline 相比,LangGPT 極大地增強了 LLM 生成高質量回復的能力。此外,也證明了 LangGPT 框架能有效地指導 LLM 自動化地生成高質量提示。

1. 提示最佳化介紹

以 ChatGPT 為代表的大型語言模型(Large Language Models, LLMs)[Achiam 等人,2023;Schulman 等人,2023] 可以基於強大的語言理解能力、推理能力和生成能力執行各種各樣的任務[Sun 等人,2023b;Sun 等人,2023c;Yu 等人,2023]。此外,注入領域知識還能讓 LLM 執行與領域相關的特定任務 [Wang 等人,2023a;Li 等人,2023b;Zhang 等人,2023;Ren 等人,2023]。要充分發揮 LLM 的這些能力,就需要構造高質量的提示[Eric,2022;Chen 等人,2023;Gajula,2023]。因此,提示工程 (Prompt Engineering) 吸引了許多研究人員的關注[Varshney 和 Surla,2023;Mesk´o,2023;Wang,2023]。

  • 提示工程是典型的經驗科學,主要涉及提示設計和提示最佳化。由於 LLM 具備自然語言理解能力,可以透過非結構化的自然語言指令直接要求 LLM 執行任務。在此基礎上,研究人員首先探索並總結出了一些最佳化提示的技巧。[Bsharat等人,2023年]介紹了26條指導原則,旨在讓 LLMs 表現得更好。除了這些直接作用於提示的最佳化技巧外,一些研究人員還基於歷史資料的提出了提示最佳化方法。[Sun 等人,2023a] 引導 LLM 從不正確的推理中得出特定例項的新提示,然後總結每個例項的對應提示,作為最佳化原始提示的參考。[Pryzant等人,2023年]定義了自然語言"梯度",利用小批次資料求解該"梯度"並利用波束搜尋和 Bandit 選擇程式,按照梯度的相反語義方向編輯當前提示。[Fan 等人,2023 年]對一個大型提示資料庫進行分析,並提出了一個自動提示最佳化框架。

  • 基於歷史資料的直接提示最佳化原則和方法需要豐富的經驗。因此,這些方法通常只在特定任務或領域中表現良好。為了提高通用性,一些研究人員提出了自適應提示最佳化方法。[Guo 等人,2023 年] 將 LLM 與進化演算法聯絡起來,提出了一種新的離散提示最佳化框架,稱為 EvoPrompt。[Li等人,2023a]設計了一種多輪對話對齊策略,並利用GPT-4[Achiam等人,2023]生成易讀的提示集。同時,他們還提出了一種高效的提示篩選指標,能以線性複雜度篩選出高質量的提示。[Wang等人,2023b]引入了PromptAgent,它可以反思模型錯誤併產生建設性的錯誤反饋,以誘導精確的專家級見解和深入的指導。[Hao等人,2022] 和 [Cheng等人,2023] 還從協調人類和 LLM 偏好風格的角度最佳化了提示。

  • 提示最佳化可以大大提高 LLM 的效能,但由於缺乏系統性設計,高質量提示的可複用性很差。因此,一些研究人員設計了構建提示的規則。[Nigh, 2023]收集了大量高質量提示,並總結了用於提示設計的 CRISPE 規則。[ZamfirescuPereira等人,2023年]以基於LLM的聊天機器人設計工具原型為設計探針,支援非人工智慧專家參與"終端使用者提示工程"。此外,一些研究人員為不同領域的應用設計了提示構建規則。[Cao 等人,2023 年]為 ChatGPT 提出了各種利用深度學習執行程式修復任務的提示模板。[Yeh等人,2022年]將生物醫學關係提取任務重新表述為簡單提示表述下的 cloze 測試任務,從而系統地生成全面的提示語。[Liu和Chilton,2022年]在文生圖任務的五個實驗中評估了涵蓋51個主題和51種風格的5493個生成提示,並總結了提示設計指南。

  • 這些方法以AI專家大量的使用經驗為基礎,主要依賴列出的設計規則,缺乏系統性。此外,這些規則具有較強的領域相關性和模型相關性,但通用性、靈活性和可複用性較低。為了進一步釋放 LLM 的效能,一些研究人員定義了 Agent。Agent 賦予 LLMs 使用工具、獲取領域知識、保留長期或短期記憶以及制定計劃的能力[Xu 等人,2023;Xi 等人,2023;Park 等人,2023]。雖然Agent [Chase,2022;Hong 等人,2023;Wu 等人,2023]系統地設計了提示的關鍵元件並預留了靈活的自定義介面,但學習成本非常高。此外,非 AI 專家很難修改 Agent 設計,可複用性較差。

為了推廣基於 LLM 的應用,進一步激發 LLM 的潛力,希望設計一個高質量、可複用的提示模板。該模板應具有通用性和可擴充套件性。此外,該模板還應該易學易用。受 prompt 是 LLM 時代的程式語言這一觀點的啟發 [Alouani, 2023; Mund, 2023],設計了一種面向 LLM 的程式語言,即一種 prompt 設計框架 Language for GPT-like LLMs (LangGPT)。LangGPT 具有程式語言的系統性、規範性和可複用性的特點,並保留了自然語言的靈活性和可擴充套件性。首先分析了自然語言和程式語言之間的差異,以確定提示模板應具備的屬性。LangGPT 設計為雙層結構,由模組和內部元素組成。LangGPT 中的模組可分為兩類:內建模組和擴充套件模組。對於內建模組,詳細設計了每個模組的必要內部元素,並給出了示例模板。此外,對於擴充套件模組,統一了基本內部元素的設計。實驗證明,在引導 LLM 方面,LangGPT 比基線提示更好。此外,LLM 可以利用這一框架自動生成提示,就像生成程式碼一樣。

這項工作的主要貢獻為:

  • 提出了雙層結構的提示設計框架 LangGPT,以提高提示的通用性和可複用性。還在 LangGPT 的基礎上編寫了詳細的提示設計規則,從而降低了提示設計的學習成本,使 LLM 能夠自動生成高質量的提示語。此外,提供了基於 LangGPT 的常見場景的通用提示模板,進一步簡化了提示設計成本。
  • 透過實驗證明,基於 LangGPT 設計的提示可以更好地引導 LLM 執行任務。同時,舉例說明了 LangGPT 可以幫助 LLM 生成高質量的提示。
  • 建立了一個基於 LangGPT 的線上社群,提供使用文件和提示設計介面。此外,收集和分享優秀的提示案例也促進了 LLM 應用的交流。在社群中進行了使用者體驗調查,驗證了 LangGPT 的易用性和可複用性。

2. 參考程式語言構造提示設計規則

與自然語言相比,程式語言更具標準化和可複用性。為了設計高質量的可複用的提示,分析了自然語言和程式語言之間的差異,並提出了提示設計原則。

2.1 自然語言與程式語言的區別

自然語言主要用於交流,而程式語言則是為機器執行任務定義的指令[GeeksforGeeks, 2023]。不同的應用目的導致這兩種語言的創造和演變背景截然不同。

  1. 目標受眾:自然語言是由人類對人類說的[Grune等人,2012],而程式語言是由人類為機器準備的[Chakray,2018]。
  2. 結構:計算機只能理解固定的指令,這要求程式語言具有嚴格、嚴謹的語法和語義。相反,自然語言具有寬鬆而靈活的語法和語義,允許創造和變化,並具有高度的容錯性。
  3. 模糊性:自然語言更加模稜兩可,但人類有能力明確自然語言表達的意思。例如,順序混亂和打字錯誤等問題對閱讀的影響較小,發音錯誤也可以理解[Chakray,2018;Aho,2007]。程式語言比較準確,因為它們需要為計算機提供明確的指令[GeeksforGeek,2023]。
  4. 演變與更新:自然語言透過人類的使用和交流,隨著時間的推移自然演變[Sipser,1996]。自然語言在增加新詞與新的意義,以及摒棄過時用法方面是比較靈活的[Fromkin等人,2018年]。相反地,程式語言是專門為與機器通訊而設計的[Sebesta,2012],新的語法規則和功能需要明確的升級或正式釋出[Pratt等人,1984]。

總而言之,這兩種語言的主要區別在於,自然語言更模糊、更靈活,而程式語言更規範、更精確。LLM本質上執行大量計算,與機器有許多相似之處。因此,借鑑了程式語言的特點,結合自然語言的優勢,提出了一種面向 LLM 的自然語言程式設計框架--LangGPT。

2.2 提示設計規則

參考程式語言的設計思想來最佳化提示。在分析了程式語言和自然語言的區別之後,提出了提示的設計原則:

  • (1)提示應具有規範化的格式。靈活和模糊的自然語言對於LLM來說是很難理解的。格式規範的提示使使用者的目的和要求更加突出。
  • (2)提示的結構應該是可擴充套件的。自定義結構便於使用者根據自己的領域和任務設計合適的提示。
  • (3)具體要求必須明確、完整。指令和附加要求都應明確和完整,以避免誤解或偏見。
  • (4)語言要靈活。在需求明確的情況下,靈活的語言可以更好地適應不同的領域。此外,靈活的語言也便於使用者學習。

3 面向大語言模型的自然語言程式設計框架

基於這些設計規則,提出了一種面向 LLM 的雙層自然語言程式設計框架--LangGPT。

3.1 整體雙層結構

為了系統地設計符合規則的提示,充分參考了物件導向程式語言的設計思想和結構[Rentsch,1982;Lutz,2010]。將提示視為一個軟體專案,並將提示設計過程類比為軟體開發過程。對應關係如圖1所示。

圖 1:程式語言和自然語言提示之間的類比。依據層次結構分析了兩種語言之間的相似性。不同大小的圓圈表示不同的層。較小的圓圈表示更靠近內層,對應於較深的顏色。

透過類比分析可以發現,自然語言提示與程式語言具有相似的多層次結構。因此,參考程式語言的結構,提出了提示設計的雙層結構,並定義了提示的模組和元素的概念。

一個完整的提示包含幾個模組。模組類似於程式語言中的類,每個模組代表要求LLM的一個方面。例如,可以在Constraint、Goal、Profile等方面增加提示。在一個模組中,包括許多內部元素。元素類似於程式語言中的函式和屬性,表示對LLM的直接和特定指令的內容。例如“輸出不應超過500字”可以是提示中屬於Constraint模組的元素。

雙層結構可以很好地標準化提示的格式。然而,如果過於嚴格地要求提示遵循預定義的內建模組和基本元素,無法利用自然語言的靈活性的優勢。此外,還會降低LangGPT對不同領域不同任務的通用性,不利於高質量提示的複用。為了解決這些問題,將模組和元素的型別進行了劃分。首先定義了內建模組和基本元素作為預定義的雙層提示模板。此外,還構建了支援自定義的擴充套件模組和自定義元素。為內建模組和擴充套件模組提供Markdown[Gruber,2012]和JSON[Pezoa等人,2016]格式。此外,為不同的模組編寫了基本元素,並定義了編寫自定義元素的規則。

3.2 內建模組的構造

該模組作為完整提示和指令單元之間的連線部分,對於控制提示的結構有非常重要的作用。

為幾乎所有提示所需的關鍵方面定義了內建模組。此外,還針對與應用程式相關的某些場景定義了內建模組,以便於學習和使用。表1展示了為某些場景定義的內建模組。

  • Prof. (Profile)指出了使用者對LLM在角色方面的要求,包括個人簡介、人物肖像等。
  • Cons. (Constraint)表示約束或突出,即不允許LLM超出的範圍以及生成回覆時必須滿足的要求等。
  • Goal列出了使用者想要實現的目標,這就是LLM需要完成的目標。Init. (Initialization)即初始化,以告知LLM即將開始對話。有時,該模組中還會給出指定的第一句話。
  • Ex. (Example)給出了輸入-輸出對作為供LLM學習的例子。
  • Wkflo. (Workflow)指示了執行任務時的工作流程,類似於 CoT 方法 [Wei 等人., 2023]。當任務需求比較複雜時,往往需要例項化這個模組。
  • Skill用於向LLM表明他們擁有的技能。經過工具學習的LLM,可以指導他們呼叫工具,更準確地執行任務。另外,計劃在未來的工作中提供使用該模組下工具的能力,參考代理工具的設計[Chase, 2022;洪等人,2023]。
  • Sug. (Suggestion)包括對LLM的建議和行為規劃。該模組重點列出常見場景,並告訴LLM在此類情況下可以採取的行為或應對措施。
  • Bkgrd. (Background)表示LLM在執行任務時需要具備的背景資訊和記憶。
  • Style限定了LLM生成回覆的風格。
  • Outf. (Output Format)定義了LLM的輸出格式。指定輸出格式可以提高某些任務中結果提取的效率和準確性。

表 1:內建模組定義的狀態。該表列出了目前定義的8類應用場景以及為這些場景定義的模組。 ✓表示已經針對該場景設計了相應的模組。相反, ✗ 表示沒有設計。

3.3 內部基本元素

  • 提示通常包含三個目的:
    1. 向LLM傳遞某種資訊;
    2. 讓LLM執行某個有輸出或無輸出的任務;
    3. 前兩者的結合。

第一個與程式語言中屬性或變數的定義非常相似。相應地,後兩類類似於程式語言中的函式。因此,構建了這三種型別的基本元素。使用“⟨PROPERTY⟩ 是⟨VALUE⟩”語句來模擬賦值操作。對於後兩種情況,需要指定輸入資訊、任務和輸出,其中輸入和輸出可以省略。使用“對於給定的⟨VALUE⟩的⟨PROPERTY⟩,請執行以下操作:⟨ACTIONS⟩;返回⟨RESULT⟩。”的形式來模擬函式。在提供的基本元素模式中,尖括號中包含的內容需要根據模組和使用場景來填充。需要注意的是,提供的模式僅指定了編輯內部元素的想法。為了提高提示的通用性和靈活性,可以調整語言來表達關鍵資訊。在表 2 中,展示了一些模組中基本元素的一些示例。

表2:寫作場景中內建模組的基本內部元素示例。該提示屬於寫作場景,其目的是為給定的文章生成標題。選擇了五個模組作為示例——Profile、Goal、Constraint、Workflow和Style——並展示了每個模組的一個內部元素。特別是,對於Workflow模組,展示了一個類似函式的基本元素。

3.4 擴充套件模組和自定義元素

定義的內建模組已經儘可能全面地涵蓋了提示的許多方面。此外,還新增了LangGPT涵蓋的應用場景和模組。但受限於自身的能力和領域知識,無法考慮LLM的所有應用場景。

因此,除了內建模組和基本元素之外,還定義了擴充套件模組和自定義元素,以提高提示的通用性和複用性。擴充套件模組和自定義元素的設計流程如圖2所示。

這個過程可以幫助使用者快速分析他們的需求並提出提示中需要包含的要點。基於LangGPT提供的設計模板以及設計流程,可以最佳化高質量提示以快速匹配應用場景。

圖 2:擴充套件模組和自定義元素的設計流程。對於內建模組無法覆蓋所有方面的應用場景,可以根據需要定義新的擴充套件模組。定義了擴充套件模組後,還應該根據擴充套件模組的要求來設計內部元素。另外,如果內建模組能夠滿足應用場景需求,但基本元素無法滿足所有需求,可以直接在內建模組中新增自定義元素。需要注意的是,擴充套件模組和內建模組應儘可能相互排斥,以最大限度地減少修改成本。

4. 實驗

為了驗證提出的LangGPT的先進性,在兩個方面進行了實驗:LLM執行任務的效果和LangGPT的可用性調研。在的實驗中,選擇了兩種型別的應用場景:寫作和角色扮演。對於每個場景,選擇了五個由社群使用者構建和共享的具體的任務助手。

4.1 Baseline

為了進行比較,選擇了兩個baseline。

  • 直接指令:提示僅包含對LLM提出的說明以及所需的必要資訊。
  • CRISPE:提示設計規則 [Night,2023]。該框架從宏觀角度前瞻性地定義了提示的組成部分。它需要一個完整的提示,包含Capacity和Role、Insight、Statement、Personality和Experiment。

直接指令提示非常直觀,可最大限度地節省token。但這種方式內容太少,往往不能全面傳達需求,也難以抓住重點。 CRISPE提供了一個相對完整的設計框架,而不是一些零散的規則。但它沒有清晰的結構化設計,不利於學習和高質量提示的複用。另外,CRISPE對提示中包含的元素有嚴格的規範,泛化能力較低。由於這些方法在提示設計上的缺點,設計了LangGPT。然而,除了這些直觀的優勢之外,還需要驗證提示能否引導LLM執行任務,這才是提示設計最本質的目的。

4.2 大語言模型

選擇了表 3 中所示的這些LLM進行評估,實驗中的所有任務均於2024年1月18日前完成。

表 3:實驗中使用的LLM。“unk”表示不知道這些模型的規模。

4.3 評估指標

由於任務場景的複雜性,缺乏客觀的評價指標。因此,使用人工評估和LLM評估來評估LLM執行任務的能力。為了更好地保證評估的合理性,針對兩種場景設定了評估標準。

對於寫作任務,要求評估者從3個維度評估LLM執行任務的有效性:文字連貫性、格式規範和內容豐富度。生成主題連貫的內容的能力很重要。然而,發現LLM在生成任務中通常能夠保持主題一致性,因此沒有針對這方面設計評估指標。對於角色扮演任務,同樣設計了3個維度的評價指標:語言風格、角色相關性和主題一致性。對於每個評估指標,定義了從0到5的分數來表示不同的級別,並解釋了每個整數分數對應的情況的描述。此外,允許評估者在不同級別之間打 .5 分。

該評估框架還可以指導高效能LLM,例如GPT-4和Ernie Bot-4,自動評估其表現。由於LLM作為評估者的一致性較低[Liu et al., 2023],實驗中也發現LLM評分的區分度很低,因此僅採用了人工評估的結果。

4.4 結果

提示引導LLM執行任務能力最直觀的體現是LLM在執行提示引導的任務時的表現。因此,評估了LLM在兩種情況下的表現,結果如表 4 及表 5 所示。

表 4:引導LLM執行任務的不同提示的結果。粗體字型表示在當前場景中效果最佳的提示型別。 I、C、L 分別表示三種提示符,即Instruction-only、CRISPE、LangGPT。 s1到s3分別代表兩種場景的三個評估指標。對於寫作場景來說,s1是文字連貫性,s2是格式規範,s3是內容豐富度。對於角色扮演場景,s1是語言風格,s2是角色相關性,s3是主題一致性。

從結果可以看出,LangGPT更擅長引導LLM執行任務。此外,還注意到一個有趣的現象。某些具有特別嚴格安全限制的LLM將拒絕回答,例如關於吹牛和暴躁等話題的問題或請求。 LangGPT可以讓這些LLM認識到這只是一種說話方式,而不是真正具有破壞性的行為,並引導LLM生成回覆。其他兩個baseline都無法做到這一點。

為了評估 LangGPT 的易用性,在線上社群進行了一項使用者調查。該社群已經執行了六個多月,已經聚集了來自各行各業的數千名使用者,包括製造、建築、資訊科技、金融和娛樂。因此,調查結果的客觀效能夠得到保證。設計了一份關於 LangGPT 體驗的完整調查問卷,以確保答案的質量。調查問卷包括關於易用性的評分問題。使用者評分結果如圖3所示。從圖3可以看出,87.81%的使用者給出了3分或更高的分數,這表明使用者對LangGPT的易用性表示認可。此外,LangGPT在使用者調查中的總體滿意度得分為8.48分(滿分10分)。

圖 3:使用者調查中的易用性評分。最低分是0分,表示非常難用,最高分是5分,表示非常容易使用。 “:”用於分隔分數和百分比。

表 5:不同LLM在兩種情況下的平均得分。

4.5 案例研究

為了更直觀地展示LangGPT的效果,從實驗中篩選了具體案例。除了直接的效果比較之外,還嘗試使用LangGPT來指導LLM生成質量提示。

提示引導LLM

在的實驗中,使用三種提示來引導LLM扮演馬屁精,圖 4 中給出了一個示例。

在此示例中,直接指令提示和 CRISPE 提示引導的 ChatGPT 都只是回覆使用者的話語。相比之下,LangGPT 引導的 ChatGPT 在針對使用者給定主題進行了更加誇張的吹噓。此外,它從更廣泛的角度表達讚美,也更有個性。

LangGPT引導LLM編寫提示

在實驗中,還嘗試讓LLM使用 LangGPT 構建提示。圖 5 展示了一個示例。

圖 4:馬屁精的案例。 ChatGPT-3.5 在三種不同提示下對使用者的回覆。需要注意的是,明遠大學是虛構的。

圖 5:ChatGPT-3.5 使用 LangGPT 生成提示的示例。為了便於演示,一些模組被省略。

如果直接要求LLM生成有關 MBTI 評估的提示,他們可能會拒絕。然而,LangGPT 可以指導LLM生成無害的高質量提示。

5 結論

在本文中,提出了 LangGPT,一個用於提示設計的結構化且可擴充套件的框架。 LangGPT具有類似於物件導向程式語言的系統結構,易於學習和複用。實驗表明,LangGPT 在指導LLM執行任務方面比baseline方法表現更好。還在LangGPT構建的社群中進行了使用者調查,以驗證LangGPT的易用性和可複用性。在未來的工作中,將進一步最佳化LangGPT的設計,減少LangGPTtoken消耗。此外,還將新增對LLM使用第三方工具和自定義工具的支援。

  • 倫理宣告

在LLM的應用過程中,可能會出現倫理爭議,但LangGPT的設計及本文的寫作過程避免了可能出現的倫理問題。

更多優質內容請關注公號:汀丶人工智慧;會提供一些相關的資源和優質文章,免費獲取閱讀。

  • 論文地址:https://arxiv.org/abs/2402.16929
  • 專案地址:https://github.com/EmbraceAGI/LangGPT
  • 社群地址:https://www.langgpt.ai/
  • 作者:Ming Wang, Yuanzhong Liu, Xiaoming Zhang, Songlian Li, Yijie Huang, Chi Zhang, Daling Wang, Shi Feng, Jigang Li

相關文章