以下摘要自Lee Boonstra的Prompt Engineering
【概括全書】
《Prompt Engineering》(提示詞工程)系統介紹如何透過撰寫高品質的提示(prompts),來引導大型語言模型(LLMs,Large Language Models)產生準確、符合預期的輸出。作者(Lee Boonstra)不僅講解了提示詞設計的基本原理,還細緻分類了各種提示技巧,例如零-shot(zero-shot)、少量示例提示(few-shot prompting)、角色提示(role prompting)、系統提示(system prompting)、鍊式思考(Chain of Thought,CoT)等高級方法。書中也結合了多種實際應用場景,如文字產生、程式碼產生與除錯、結構化輸出、自動提示最佳化(APE,Automatic Prompt Engineering)等,力求讓讀者掌握理論並能夠實操應用。此外,全書強調了實驗、迭代和記錄prompt過程的重要性,是一本初學者和進階者的全面指南。
【全書要點】
- 理解LLM工作機制:LLM透過輸入文字序列,逐步預測下一個最可能的token,因此prompt的措詞、結構、風格非常關鍵。
- 模型配置調整:除了prompt本身,還要調整輸出長度(output length)、溫度(temperature)、Top-K和Top-P等取樣參數以影響輸出。
- 基礎提示技巧:包含零-shot、單-shot(one-shot)、少量範例提示(few-shot)等不同策略,應根據任務複雜度選擇。
- 進階提示技術:系統提示(system prompting)、角色提示(role prompting)、上下文提示(contextual prompting)等,能顯著提高模型輸出的一致性與相關性。
- 推理類別提示:鍊式思考(Chain of Thought, CoT)、自一致性(Self-consistency)、思考樹(Tree of Thoughts, ToT)方法用於複雜推理任務,提升準確性。
- 自動化提示最佳化:介紹了自動提示工程(Automatic Prompt Engineering, APE)方法,實現提示詞的自動生成與篩選優化。
- 程式碼產生與偵錯:詳細講解如何使用prompt來產生、解釋、翻譯、偵錯程式碼,特別是多語言遷移。
- 最佳實務總結:提出如提供範例、簡化表達、明確輸出要求、優先用正向指令等prompt工程原則。
【各章節要點】
Introduction(引言)
- 大型語言模型(LLMs)透過預測下一token運作。
- 任何人都可以寫prompt,但要寫出高效prompt需要技巧。
- Prompt engineering是一種迭代優化過程,需要反覆實驗。
第1章:Prompt Engineering(提示工程)
- 提示工程是為了讓LLM預測正確的token序列。
- 需考慮模型的選擇、提示詞長度、風格、結構等因素。
- Prompt可應用於摘要、資訊擷取、問答、分類、翻譯、程式碼產生等多種任務。
- 不同模型(如Gemini、GPT、Claude、Gemma、LLaMA)可能需要最佳化不同的提示策略。
第2章:LLM Output Configuration(LLM輸出配置)
- 輸出長度(Output Length):影響計算量和反應速度,過長可能導致成本上升。
- 採樣控制(Sampling Controls):決定輸出的隨機性,包括:
- 溫度(Temperature):控制輸出的確定性或多樣性。
- Top-K採樣:只考慮機率最高的K個token。
- Top-P採樣(Nucleus Sampling):選擇累積機率達到P的前幾個token。
- 設定範例建議:
- 創意輸出:溫度0.9、Top-P 0.99、Top-K 40;
- 精確回答:溫度0.1、Top-P 0.9、Top-K 20;
- 只有一個正確答案時(如數學問題):溫度設定為0。
第3章:Prompting Techniques(提示技巧)
- 零-shot提示(Zero-shot Prompting):直接給指令,無範例,適合簡單任務。
- 單一-shot和少量範例提示(One-shot & Few-shot Prompting):
- One-shot:給一個例子;
- Few-shot:給多個範例,推薦3-5個,提高模型理解。
- 範例提示需多樣、準確且考慮邊界案例(edge cases)。
第4章:System, Contextual and Role Prompting(系統、上下文和角色提示)
- 系統提示(System Prompting):設定模型整體任務目標,如「只回傳標籤」或「以JSON格式輸出」。
- 上下文提示(Contextual Prompting):提供特定背景信息,例如正在為80年代街機遊戲博客寫作。
- 角色提示(Role Prompting):指定模型扮演特定角色,例如旅遊顧問、兒童教師、激勵演講家等,還可以指定風格(如幽默、正式等)。
第5章:Step-back Prompting(回退式提示)
- 在直接回答之前,先讓模型考慮相關的更一般性問題,調動背景知識。
- 舉例:
- 直接提示 vs. 先列舉FPS遊戲的典型場景,再產生劇情,效果明顯提升。
第6章:Chain of Thought (CoT)(鍊式思考提示)
- 透過要求模型逐步推理(step-by-step)來提高推理任務準確率。
- 零-shot CoT與單/少-shot CoT結合使用更有效。
- 例:數學問題透過逐步推導,正確率大幅提升。
第7章:Self-consistency(自一致性提示)
- 透過多次取樣、產生不同推理路徑,取最多數答案,提升推理任務的穩定性與準確率。
- 成本較高(因為多次呼叫模型),但提昇明顯。
- 適合複雜判斷,如安全性審核、郵件分類等。
第8章:Tree of Thoughts (ToT)(思維樹提示)
- 進一步擴展Chain of Thought。
- 不只是單線推理,而是生成推理樹,探索多種思考路徑,更適合複雜決策場景。
第9章:ReAct (Reasoning + Acting)(推理與行動結合提示)
- 結合推理和外部工具(如搜尋引擎、API呼叫)進行任務。
- 模仿人類:推理 → 行動 → 觀察 → 更新推理。
- 範例:用LangChain和Vertex AI結合,查詢Metallica樂團成員的孩子數。
第10章:Automatic Prompt Engineering(自動提示工程)
- 使用LLM自動產生多種提示變體。
- 評估並篩選最優提示(如使用BLEU、ROUGE分數)。
- 範例:用LLM產生10種不同說法來描述「購買一件Metallica T卹」。
第11章:Code Prompting(程式碼提示)
- 程式碼產生提示(Prompts for Writing Code):
- 範例:如何以 Bash 腳本批次重命名檔案(新增「draft_」前綴)。
- 使用Gemini(Google Vertex AI 中的模型)進行簡單程式碼生成,注意設定低溫度(低隨機性)。
- 程式碼解釋提示(Prompts for Explaining Code):
- 將一段沒有註解的 Bash 腳本,提示 LLM產生詳細的逐行解釋。
- 便於理解陌生程式碼或幫助團隊合作。
- 程式碼翻譯提示(Prompts for Translating Code):
- 例如,把 Bash 腳本翻譯成 Python 腳本,保持功能一致但適合不同語言環境。
- 重要場景:將命令列腳本轉換為可擴充的應用程式元件。
- 程式碼偵錯與審查提示(Prompts for Debugging and Reviewing Code):
- 透過提示讓LLM找出程式碼錯誤並提出改進建議。
- 範例:偵測錯誤如
toUpperCase
未定義,應使用 Python 的upper()
方法。
第12章:What about Multimodal Prompting?(多模態提示)
- 多模態提示不僅可以輸入文本,還能組合圖像、音頻等不同格式。
- 支援不同輸入模式的模型可以用來處理更複雜或豐富的任務(例如影像描述、音訊轉文字等)。
第13章:Best Practices(最佳實踐)
成為專業提示工程師的關鍵建議摘要:
- 提供範例(Provide Examples):
- Few-shot示範極大提升模型理解準確性。
- 保持簡潔(Design with Simplicity):
- 使用簡潔直接的語言,避免複雜長句。
- 明確輸出要求(Be Specific About the Output):
- 指定段落數量、結構要求、風格等。
- 優先使用指令而非限制(Use Instructions over Constraints):
- 正面引導模型,比列出「不要做什麼」效果更好。
- 控制最大token數量(Control Max Token Length):
- 限制輸出長度,避免冗長或耗費資源。
- 使用變數(Use Variables in Prompts):
- 使prompt可重複使用,例如
{city}
變數取代具體城市名。
- 嘗試不同輸入格式與寫作風格(Experiment with Input Formats and Writing Styles):
- 例如問題式、敘述式、指令式不同格式,會引導不同的輸出風格。
- 在分類任務中打亂範例順序(Mix Up Classes in Few-shot Prompting):
- 避免過擬合範例順序,提高模型泛化能力。
- 適應模型更新(Adapt to Model Updates):
- 不同版本模型的行為有差異,提示詞需調整。
- 記錄各種提示嘗試(Document Prompt Attempts):
- 記錄版本、參數、結果,有助於追蹤最佳化。
第14章:Summary(總結)
- Prompt Engineering是一個需要持續學習、實驗、調整的過程。
- 透過不同技巧(Zero-shot、Few-shot、CoT、ReAct、ToT等)組合使用,可以大幅提升大型語言模型的輸出品質和任務完成度。
【擴展思考】
本書所述的提示工程理念,與認知心理學中的「引導式學習(scaffolding learning)」高度契合——透過逐步引導或提供示範,提高學習(這裡是模型輸出)的準確性與穩定性。 同時,鍊式思考(Chain of Thought)和自一致性(Self-consistency)提示策略,與人類推理過程中的「演繹推理」及「冗餘驗證」有異曲同工之妙。
在更大的AI系統工程領域,這些技巧也正是**Prompt-Oriented Programming(面向提示程式設計)**新趨勢的重要基礎。
【我的整體看法】
優點:
- 系統性極強,從基礎到進階技巧都有覆蓋範圍。
- 理論與實務結合緊密,例子豐富,便於操作。
- 對實際應用場景考慮細緻,如程式碼產生、自動化訓練、輸出結構化等。
不足:
- 略顯偏重於 Google Cloud 產品(如Vertex AI),對於非使用Google生態的讀者,部分內容可能需要自行適應。
- 高階部分(如ToT和ReAct)雖然提及,但實作細節(如程式碼呼叫鏈)解釋略顯簡略,需要讀者進一步查閱外部資源。
- 對提示工程的限制、風險控制(如模型幻覺、偏見)討論較少。