大語言模型(LLM)的出現,讓提示工程成為重要的技術學科。本文從零樣本學習出發,闡述如何建構有效的提示,並逐步探討少樣本學習、提示鏈等進階技術,以及如何利用人格特質、角色扮演等技巧,引導模型產生更符合預期的輸出。同時,文章也示範如何使用 LangChain 和 LlamaIndex 等工具,將這些技術應用於實務場景,例如生成符合品牌風格的文案、建構互動式客戶服務體驗,以及透過 RAG 方法提升模型回應的可靠性。隨著模型架構的進步,提示工程的技巧也持續演進,掌握這些技術將有助於開發者更好地運用 LLM 的能力,創造更具價值的應用。
掌握提示工程的基礎
134 FLAN 背後的核心思想是,每個基準資料集(例如 ANLI)都可以轉換成直觀的指令格式,從而產生廣泛的指令資料和自然語言任務的混合。 這些進展代表了大語言模型(LLMs)能力的重大演進,從需要針對每個任務進行特定訓練的模型,轉變為能夠直觀遵循指令並透過簡單提示適應多種任務的模型。這一轉變不僅擴大了這些模型能夠執行的任務範圍,也展示了人工智慧以前所未有的精確度處理和生成人類語言的潛力。 有了這些見解,我們可以將重點轉移到提示工程。這個學科結合了技術技能、創造力和人類心理學,以最大限度地提高模型理解和回應指令的準確性和適當性。我們將學習提示技術,這些技術越來越多地影響模型的行為,使其趨向精確。
基本提示 – 指導原則、型別和結構
在第 5 章中,我們介紹了零樣本學習和少樣本學習的概念,為模型提供了直接指令,或將直接指令與特定任務的範例配對。在本文中,我們將重點關注零樣本學習,其中提示成為引導模型執行特定任務而無需事先明確訓練的關鍵工具。本文探討了提示的元素以及如何有效地為零樣本學習構建提示。然而,我們首先將建立一些關鍵的指導原則,以幫助我們瞭解預期的模型行為。
模型互動的指導原則
瞭解 LLMs 儘管在自然語言任務上具有前所未有的 SOTA 表現,但仍具有重大的固有限制、弱點和敏感性至關重要。如第 1 章所述,LLMs 無法原生建立推理或執行邏輯運算。我們與 LLMs 的互動通常由高度複雜的應用層補充,使原始模型能夠進行擴充套件的交換、與執行計算的系統整合,並檢索模型本身不固有的額外資訊和知識。除了補充整合之外,許多 LLMs 容易出現不穩定的行為。其中最常見的是通常所謂的幻覺,即模型生成看似合理但並非完全事實的輸出。因此,我們在使用 LLMs 時應牢記以下指導原則:
- 運用領域知識和主題專業知識:由於 SOTA LLMs 容易生成聽起來合理但不準確的內容,在事實性和精確性至關重要的使用案例中(例如程式碼生成、技術寫作或學術研究),使用者必須對主題有深入的瞭解,以檢測潛在的不準確性。例如,如果沒有醫學專業知識的使用者提示模型提供醫療建議,模型可能會混淆、合併或簡單地編造可能導致誤導或潛在危險建議的資訊。減少這種行為的一種方法是向模型提供來自可靠健康期刊的資訊,並指示它根據提供的段落明確生成答案。這種技術通常稱為接地(grounding),我們稍後將探討。然而,即使在用經過驗證的資訊補充模型的知識時,模型仍可能歪曲事實。沒有特定領域的專業知識,我們可能永遠無法檢測到錯誤資訊。因此,我們通常應避免在無法驗證模型輸出的情況下使用 LLMs。此外,我們應避免在錯誤輸出可能產生深遠影響的高風險場景中使用 LLMs。
- 認識偏見、代表性不足和毒性:我們已經描述了 LLMs 是如何在龐大的規模上進行訓練,通常是在未經整理的資料集上進行訓練。不可避免地,LLMs 將學習、表現和放大社會偏見。模型將傳播刻板印象、反映有偏見的假設,並生成有毒和有害內容。此外,LLMs 可能會過度代表某些群體,而嚴重代表性不足其他群體,從而導致扭曲或變形的社會學觀點。這些偏見的概念可以以多種方式表現出來。我們將在第 8 章中詳細探討這個主題以及使用 LLMs 的其他倫理影響。
- 避免模糊性和缺乏清晰度:由於 LLMs 被訓練來合成類別似人類回應的資訊,因此它們通常可以表現出創造力的跡象。在實踐中,如果提示模糊或缺乏清晰度,模型很可能會利用其龐大的上下文知識來“假設”或“推斷”給定提示或指令的含義或目標。它可能會應用其訓練中的某些上下文,而不是提出澄清問題。正如我們將在下一節中描述的那樣,在大多數情況下,透過上下文化輸入提供清晰度至關重要。 現在我們已經建立了一些指導原則來幫助導航互動並保持在適當使用的邊界內,我們可以解構提示的各個元素。
提示元素和結構
一般來說,提示充當,將模型的回應引導至所需的結果。它通常包含框架化當前任務的關鍵元素,為模型的生成能力提供清晰度和方向。下表展示了零樣本提示的基本元素。
零樣本提示的基本元素
| 元素 | 描述 |
|---|---|
| 指令 | 清晰、簡潔地描述您希望模型執行的任務陳述。這可以是直接命令、問題或暗示任務的陳述。 |
| 上下文 | 理解指令或任務所需的相關資訊或背景。這可能包括定義或澄清。 |
| 輸入 | 按照指令,模型應該處理的特定資料或內容。這可以是一段文字、問題或與任務相關的任何資訊。 |
| 輸出提示 | 對模型回應結構的指示。這可以是指令的一部分,也可以透過提示的格式隱含。 |
表 7.1:零樣本提示的基本元素
掌握提示工程的基礎
結構化提示的關鍵要素
要掌握零次學習(zero-shot)方法,就必須結構化提示的各個元素,讓模型完全依賴提示來理解和執行任務。這裡所謂的「任務」,是指特定的自然語言處理(NLP)任務,例如摘要或翻譯。不過,「任務」一詞也廣泛用於指模型應提供的輸出。
讓我們來看看幾個具體的任務範例。在這些範例中,我們將參考特定的 NLP 任務,並套用結合關鍵元素的標準結構:
範例 1:摘要任務
- 指示:用一句話總結以下文字。
- 上下文:文字概述了可再生能源的好處。
- 輸入:像太陽能和風能這樣的可再生能源來源提供了化石燃料的可持續替代方案,減少了溫室氣體排放並促進了環境保護……
- 輸出提示:可再生能源來源,例如
- 示例結果:「像太陽能和風能這樣的可再生能源來源在減少排放和保護環境方面發揮著至關重要的作用。」
範例 2:翻譯任務
- 指示:將以下句子從英文翻譯成西班牙文。
- 上下文:這句話是一句問候語。
- 輸入:「Hello, how are you?」
- 輸出提示:這翻譯成
- 示例結果:這翻譯成「Hola, ¿cómo estás?」
這些結構化的範本幫助我們有效地為模型提供各種輸入,同時保持模型已經學會識別和回應的結構。事實上,我們可以進一步要求模型以特定的格式提供輸出。使用輸出提示,我們可以指示模型提供諸如 Markdown 之類別的指定格式。
範例 3:程式碼生成任務
- 指示:生成一個計算數字平方的 Python 函式。
- 上下文:該函式應採用單一整數引數並傳回其平方。
- 輸入:「請編寫一個 Python 函式來計算數字的平方。」
內容解密:
此範例展示瞭如何使用結構化的提示來生成特定格式的輸出。在這個例子中,輸出提示指示模型使用 Markdown 格式傳回結果。
def square(number):
return number ** 2
使用 LangChain 產生 JSON 格式的輸出,我們可以利用相同的方法。具體來說,LangChain 的 PromptTemplate 提供了一種靈活的方式來動態定義提示結構並插入元素:
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
# 定義請求 JSON 格式輸出的提示範本
prompt_structure = PromptTemplate(
template="""
Context: {context}
Instruction: {instruction}
Text: {text_to_process}
Output Cue: 以 JSON 格式格式化回應,其中包含一個名為 summary 的元素。
""",
input_variables=["context", "instruction", "text_to_process"]
)
# 提示的動態元素
context = "總結長文欄位落。"
instruction = "以 JSON 格式總結以下文字中的關鍵點。"
text_to_process = """
火星是太陽系的第四顆行星。火星表面呈現橙紅色,因為……
"""
formatted_prompt = prompt_structure.format_prompt(
context=context,
instruction=instruction,
text_to_process=text_to_process
)
llm = OpenAI(model_name='gpt-3.5-turbo-instruct', temperature=0.9, max_tokens=256)
response = llm.invoke(formatted_prompt)
print(response)
內容解密:
此程式碼範例展示瞭如何使用 LangChain 的 PromptTemplate 來建立一個結構化的提示,並要求模型以 JSON 格式傳回摘要。input_variables 用於定義範本中的動態元素,而 format_prompt 方法則用於將這些元素插入範本中。
輸出結果如下:
{
"summary": "火星是太陽系的第四顆行星,以其橙紅色的表面和高對比度的特徵而聞名,使其成為望遠鏡觀測的熱門物件。"
}
為零次學習開發有效的提示
要為大語言模型(LLM)開發有效的零次學習提示,需要對任務有清晰的理解,並仔細構建提示,同時考慮模型如何解釋和回應提示中的不同元素。透過應用這些原則,我們可以引導模型準確有效地執行各種任務。
提升提示品質——迭代和影響模型行為
本文將介紹一些受認知行為研究啟發的技術,用於增強與 AI 模型的互動。行為提示可以引導模型提供更準確、更細緻的回應。例如,可以透過提供正面的情感刺激、要求模型假設某種角色或性格,或使用情境提示(即角色扮演)來改善 LLM 的表現。
然而,必須認識到,這些技術也可能被濫用,或無意中引入刻板印象,因為它們依賴於假設和概括,而這些假設和概括可能無法準確反映個體經驗或多樣化的觀點。如果沒有仔細考慮和監控,就有可能強化現有的偏見或創造新的偏見,從而導致輸出結果出現偏差或有害內容。
大語言模型對情感訊號的反應
微軟與包括北京師範大學心理學系在內的多家機構合作的研究表明,大語言模型可以模仿和表現出人類情感智慧的某些方面。這可以提高任務表現,特別是在提示中加入情感刺激時。研究人員假設,強調積極的詞語可以觸發更具建設性和有效性的回應。
雖然這種現象尚不完全清楚,但研究結果表明,正面的情感訊號似乎能夠持續改善模型在各種任務上的表現。例如,研究人員輸入了鼓勵信心和正面結果的短語,例如「這對我的職業生涯非常重要」或「相信你的能力,努力追求卓越。你的努力將會帶來卓越的成果。」這些心理元素不僅能正面影響輸出品質,還能使互動更加有效和細緻。
提升提示效果:迭代與影響模型行為
人格特質的效果
研究表明,人格特質(personas)使大語言模型(LLMs)能夠透過採用多樣化的特徵、觀點和回應風格來模擬更像人類的互動。這種方法增強了模型從事更個人化、上下文相關對話的能力。在LLM提示中加入人格特質,有效地改變了可能輸出的分佈,將模型的生成過程引導向與特定角色特徵或觀點相符的回應。由於模型在多樣化的資料集上進行了廣泛的訓練,它可以複製與所描述的人格特質相符的模式,將其注意力和選擇過程聚焦於更明確的一組輸出。這增強了相關性和特定性。
內容例項
讓我們重新考慮一個假設的商業案例——StyleSprint,一個時尚品牌。如果我們向LLM發出這樣的提示:“作為一個創意且大膽的時尚品牌,StyleSprint將如何描述其即將推出的夏季系列?”模型採用該品牌的人格特質後,可能會生成如下回應:
“這個夏天,StyleSprint鼓勵你脫穎而出!我們的系列是色彩和圖案的充滿活力的大爆炸,為無畏的時尚達人設計。想像大膽的印花、敢於嘗試的剪裁,以及散發自信的宣言。從陽光普照的海灘到時尚的城市街道,我們的作品承諾讓每一個時刻都令人難忘。在這個夏天,用StyleSprint展現你的大膽。”
內容解密:
- 這段回應展示瞭如何透過人格特質引導模型的輸出,以反映特定的品牌語氣,如本例中的創造力和大膽。
- 這使得行銷材料更具吸引力,並與品牌的身份保持一致。
- 使用少樣本(few-shot)方法,我們可以為模型回應注入非常特定的品牌語氣。
人格特質使用的注意事項
然而,如前所述,使用人格特質應謹慎。人格特質可能會延續刻板印象和偏見,特別是對邊緣群體。史丹佛大學的研究人員進行了一項研究,發現根據交叉性人口統計群體生成的人格特質往往會產生更高的種族刻板印象和其他化模式,或者將某人或某群體描繪成根本不同或陌生的模式,與人類撰寫的文字相比。在某些情況下,模型的輸出可能會放大敘事和刻板印象。
情境提示或角色扮演
角色扮演在LLMs中的應用與人格特質類別似,都涉及採用特定的身份或特徵。然而,這兩者服務於不同的目的,並在不同的情境中使用。人格特質是一組預先定義的特徵或特性,LLM模仿這些特徵以調整其回應,重點是與這些特徵保持一致。正如我們在StyleSprint的例子中所展示的那樣,這對於建立具有特定語氣或觀點的內容非常有用。
角色扮演與人格特質的區別
相反,角色扮演超出了採用一組特徵的範疇,能夠動態地參與場景或敘事中。它涉及LLM在模擬環境或故事中扮演一個角色,以一種既符合人格特質又符合角色扮演場景演變上下文的方式回應輸入。這在複雜的模擬中尤其有用,因為LLM必須導航並參與持續的敘事或對話,需要實時理解和適應新的資訊或變化中的環境。
圖表說明:人格特質 vs 角色扮演
此圖示展示了人格特質與角色扮演之間的區別。人格特質關注於一致性,而角色扮演則涉及動態互動和適應。
實務應用:互動式客戶服務體驗
重新審視我們的真實場景,角色扮演對於建立互動式和吸引人的客戶服務體驗特別有用。例如,StyleSprint可以設計一個角色扮演場景,其中LLM充當虛擬個人造型師。在這個角色中,模型會與客戶進行如下提示的互動:“我是你今天的個人造型師!你為哪個場合穿衣?”根據客戶的回應,LLM可以提出後續問題以縮小偏好範圍,例如“你更喜歡大膽的顏色還是柔和的色調?”最後,它可以推薦StyleSprint系列中符合客戶需求的服裝,例如“對於夏季婚禮,我推薦我們的花卉長裙搭配復古太陽帽。它優雅,卻非常適合戶外環境。”
內容解密:
- 在這個案例中,我們利用LLM根據客戶輸入動態調整其對話的能力,建立了一個先進的推薦系統,促進了高度個人化的購物體驗。
- 它不僅有助於提供量身定製的時尚建議,還以新穎的方式吸引客戶。
少樣本學習
在探討了行為驅動技術(如人格特質和角色扮演)如何透過零樣本學習影響模型行為之後,讓我們現在轉向少樣本學習。這也被稱為上下文學習,正如我們在第5章中所述。回想一下,少樣本方法可以增強模型回應的一致性、穩定性和可靠性。透過在提示本身內為模型提供所需的輸出的幾個例子,少樣本學習有效地教會了模型手頭上的特定任務,從而導致更可預測和更準確的輸出。
高階提示技術實戰:少樣本學習與提示鏈
在少樣本(few-shot)場景中,大語言模型(LLM)會在輸入提示中接收少量的任務範例,以引導模型生成與這些範例一致的回應。正如前一章所討論的,這種方法顯著減少了對大量任務特定資料集進行微調的需求。相反,它利用了模型預先存在的知識和從提供的範例中推斷上下文的能力。在第5章中,我們看到這種方法對於StyleSprint特別有用,因為它使模型在接收到少數範例後能夠回答特定問題,從而增強品牌訊息傳遞的一致性和創造力。
這種方法通常涉及使用10到100個範例,具體取決於模型的上下文視窗。回想一下,上下文視窗是語言模型一次能夠處理的token數量限制。少樣本方法的主要好處是,它最小化了模型透過微調從特定資料集中學習過於狹隘的分佈的風險。儘管少樣本的表現可能並不總是能與其微調對應的方法相媲美,但少樣本學習通常優於單樣本(one-shot)和零樣本(zero-shot)學習,在任務適應性和準確性方面表現出顯著的改進。隨著更多範例被新增到上下文視窗中,這種改進尤其明顯(Brown et al., 2020)。
像LangChain這樣的應用程式提供了一種簡單方便的少樣本實作模式。考慮這樣一個場景:StyleSprint希望為其季節性系列生成標語。在這種情況下,我們可以為模型提供由內容團隊撰寫的範例,以引導模型朝向與品牌語氣的一致性。
程式碼範例:使用LangChain實作少樣本學習
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
# 定義範例
examples = [
{
"prompt": "以大膽和冒險的語氣描述新的夏季系列。",
"response": "與StyleSprint的最新夏季系列一起進入夏季!採用大膽的設計和充滿活力的色彩,這一切都是為了做出大膽的宣告。非常適合無所畏懼的時尚達人,準備好征服酷熱。"
},
{
"prompt": "您將如何向環保意識強烈的客戶介紹我們的環保系列?",
"response": "與StyleSprint的環保系列一起擁抱永續時尚。採用回收材料精心製作,每一件作品都將時尚與責任感結合在一起,為環保意識強烈且時尚的人設計。"
}
]
# 建立格式化器
prompt_format = PromptTemplate(
input_variables=["prompt", "response"],
template="提示:{prompt}\n回應:{response}"
)
# 建立FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_format,
suffix="提示:{input}",
input_variables=["input"]
)
from langchain import LLMChain, OpenAI
# 設定LLM和LLMChain
llm = OpenAI(temperature=0)
llm_chain = LLMChain(llm=llm, prompt=few_shot_prompt)
# 定義輸入提示
input_prompt = "為我們的冬季系列創造一個吸引人的標語。"
# 呼叫鏈生成輸出
response = llm_chain.run(input_prompt)
# 提取並列印生成的標語
generated_slogan = response
print(generated_slogan)
# => 回應:"與StyleSprint的冬季系列一起保持溫暖、時尚、領先!"
內容解密:
- 範例定義:首先,我們定義了一組範例,每個範例包含一個提示和對應的回應,用於引導模型生成符合特定語氣和風格的內容。
- 格式化器建立:使用
PromptTemplate建立了一個格式化器,用於將範例格式化為特定的範本。 - 少樣本提示範本建立:透過
FewShotPromptTemplate,我們將範例和格式化器結合起來,並增加了輸入變數,用於接收新的輸入提示。 - LLM和LLMChain設定:使用LangChain的
OpenAI類別初始化了一個LLM,並建立了一個LLMChain,將LLM和少樣本提示範本結合起來。 - 生成標語:定義了一個輸入提示,並透過
LLMChain生成了一個回應,最終提取並列印了生成的標語。
提示鏈技術
現在我們已經有了一種一致且可程式化的方法來為模型提供範例,我們可以透過提示鏈技術來迭代模型的回應。提示鏈通常指的是將多個提示和LLM互動串聯起來,以便與模型進行對話並迭代構建結果。請記住,模型本身無法儲存資訊,實際上沒有記憶或先前的輸入和輸出。相反,應用層儲存先前的輸入和輸出,然後在每次交換中將其提供給模型。
內容解密:
- 初始提示:首先,我們可以從一個初始提示開始,例如「為冬季服裝系列寫一個標語」。
- 迭代改進:然後,我們可以根據模型的回應建構後續提示,例如「修改標語,使其更具體地描述服裝的品質」。
- 持續迭代:透過這種方式,我們可以不斷迭代以改進輸出。
實戰專案:使用LlamaIndex實作RAG
在我們的實戰專案中,我們將從LangChain轉向探索另一個促進RAG方法的函式庫。LlamaIndex是一個專為根據RAG的應用程式設計的開源函式庫。LlamaIndex簡化了跨各種資料來源的擷取和索引。然而,在我們深入實施之前,我們將解釋RAG背後的基本方法和方法。
內容解密:
- RAG的基本前提:RAG的主要前提是透過提供來自外部資料來源的相關上下文來增強LLM的輸出。這些資料來源應該提供具體且經過驗證的資訊,以使模型的輸出更為可靠。
- 結合檢索和提示鏈:RAG可以選擇性地利用少樣本方法,透過檢索少樣本範例來提供給模型,從而進一步提高輸出的準確性和創造力。