前言
最近大家都在討論AI大神吳恩達與OpenAI合開的這門ChatGPT 提示詞工程(ChatGPT Prompt Engineering for Developers),也有很多人整理了相關的筆記分享
不過實際看完課程和各個筆記以後,發現許多都是使用AI做文字轉語音+自動摘要產生的,因此雖然可能比原本的英文版本好理解一點,但還是會有許多會影響理解的雜訊。
所以我在自己實際看完課程+對照各筆記所強調的重點後,重新整理成一份濃縮的精華,期望能成為你在需要回憶內容時候最有效的參考~
雖然直接單看這份應該也會能理解
但還是更推薦可以實際動手跟著操作一次會更印象深刻哦!
Introduction(簡介)
- 簡述課程大綱
- 透過一些範例來說明提示工程(Prompt Engineering)
- 總結(Summarizing):例如總結用戶評論
- 推斷(Inferring):例如情感分類、主題提取
- 轉換文本(Transforming):例如翻譯、拼寫、語法更正
- 擴寫(Expanding):例如編寫電子郵件
- 說明兩種不同的大語言模型(LLM)差異
- 基礎模型(Base LLM): 單純的接下文,合理但可能不一定實用
- 指令調整模型(Instruction Tuned LLM):透過RLHF的方式微調,讓模型回答更加有用
Guidelines(準則)
原則1:撰寫明確具體的提示
清晰 ≠ 簡短
- 要盡可能的表達清楚具體的指令,讓模型瞭解你想要執行的任務
- 許多時候,使用更長的提示可以讓模型獲得更加明確的上下文脈絡
技巧1:使用分隔符號
- 使用分割符號標記輸入的不同部分
- 讓模型分的出來哪些是提示、哪些是待處理的內容
- 使用分隔符號也能降低被提示注入攻擊的可能性
提示注入(Prompt Injection):用戶在待處理內容中添加提示,可能導致模型遵循用戶的指令而非我們設定好的提示,或者可能導致提示詞被竊取。
- 常用分割符號
- 三重引號(Triple quotes):
"""
- 三重反引號(Triple backticks):
```
- 三重虛線(Triple dashes)
---
- 角括號(Angle brackets)
<...>
- XML標籤:
<tag>...</tag>
- 三重引號(Triple quotes):
技巧2:要求結構化輸出
- 結構化輸出可以更加容易解析
- 例如:要求以HTML或JSON格式輸出
技巧3:讓模型檢查條件是否滿足
- 列出一系列條件或步驟,讓模型檢查是否滿足
- 如果不滿足條件的話,應該要指出並停止繼續嘗試完成任務
技巧4:提供一些範例
- 又稱作few-shot prompting
- 透過給定一些成功的範例,讓模型可以模仿並輸出更加符合我們需求的結果
原則2:給模型思考的時間
- 如果試圖解決一個複雜的任務,但要求用很短的字數完成,模型可能會猜測結果
- 對人類也一樣,如果不給予足夠的計算時間,他們也很容易會犯錯
- 因此,我們可以要求模型花更多時間思考問題
- 在得到最終答案之前進行一系列相關的推理
技巧1:將任務拆解成數個步驟
- 對於比較複雜的任務,可以將過程拆解成數個子任務
- 範例:
- Step1:用一句話摘要文本
- Step2:將摘要翻譯成法語
- Step3:列出摘要中的每個名字
- Step4:輸出JSON格式
技巧2:讓模型在下結論之前先給出它的答案
- 像人一樣,先讓它思考一次解決方案,比起直接判斷內容是否正確會更有效
- 範例:需要判斷學生的答案是否正確
- Step1:先讓模型計算出自己的答案
- Step2:讓模型將自己的答案和學生的答案進行比較,評估學生的答案是否正確
模型的局限:幻覺
在使用LLM進行開發應用的時候,時刻記得模型的限制是很重要的
- 模型在訓練的過程中會接觸到大量的知識
- 但是它並不會很完美的記得這些內容
- 它並不知道「自己知道什麼」
- 如果當你問它一些它實際上不懂的內容
- 它可能會編造一些看起來合理但實際上不正確的回答(aka開始唬爛)。
- 這種現象成為模型的幻覺(hallucination)
- 如何減少幻覺的發生
- 先找到相關的資訊
- 再根據這些資訊進行回答
Interative(迭代)
使用LLM建立應用程序時,在第一次就得到了最終可以使用的提示詞是幾乎不可能的。但我們可以透過持續的迭代過程,讓提示不斷改進以獲得最終實現任務的提示。
- 和開發機器學習的模型一樣不會一次到位,而是一個持續迭代的過程
- 開發Prompt的流程指南
- 釐清你要達成的目的
- 根據需求寫出初步Prompt
- 分析為什麼結果不夠好,根據原因調整Prompt
- 重複,直到效果夠好為止
- 沒有一個完美的prompt可以適用所有情況
- 網路上各種所謂的「OO的30個完美提示」指南其實並不是那麼重要
- 有一個根據需求開發好prompt的流程更加重要
案例:從產品說明書生成產品描述
- 輸入文字:某個家具的產品說明書
- 第一版提示
- 給予目標:
你的任務是幫助銷售團隊基於說明書為產品建立描述內容
- 問題:模型有根據說明書給出結果,但是輸出太長了
- 給予目標:
- 第二版提示
- 添加限制:
最多使用50個字
-
需要注意的是,LLM在計數能力上可能不會非常精確,因此只會輸出大概50個附近的輸出
- 問題:發現面對的受眾不對,這個內容應該是要面向零售商而非消費者的
- 添加限制:
- 第三版提示
- 添加背景:
該描述是針對傢俱零售商而設計的,因此應具有技術性並聚焦於該產品所使用的材料
- 問題:缺少產品ID
- 添加背景:
- 第四版提示
- 添加任務:
在描述的結尾,請在技術規格中列出每個7個字元的產品識別號(Product ID)
- 問題:已經不錯了,但有個表格會更好
- 添加任務:
- 第五版提示
- 添加任務:
將所有可用於網站上的內容格式化為 HTML 。將描述放置在 <div> 元素中
- 添加任務:
Summary(摘要)
- 目前世界上有太多的文字內容,幾乎沒有人有足夠的時間閱讀所有的內容
- 總結文本正是大語言模型(LLM)其中一個非常適合的應用
案例:總結電商網站使用者評價
- 輸入文字:某個產品的消費者評論
- 第一版提示:設定任務
- 給與目標:
你的任務是從電子商務網站的產品評論中生成簡短的摘要。用30個字概括摘要。
- 給與目標:
- 第二版提示:添加背景
- 如果有明確的目標,可以在提示時候進行修改。例如:如果這個評論是用來讓物流部門提供回饋進行改善用的。
- 添加背景:
專注在物流相關的內容
專注在價格相關內容
- 第三版提示:用 提取 代替 摘要
- 如果我們只關心內容中的特定訊息而不想要有太多其他說明,可以用提取(extract)代替摘要(summarize)
- 改成提取:
你的任務是從電子商務網站的產品評論中提取相關訊息。限制30個字以內
Inference(推論)
- 推論是指模型使用文本作為輸入,並執行某種分析的任務,包含
- 提取標籤、提取名稱
- 情感分析
- …
- 在傳統的機器學習工作流程中
- 我們需要做非常大量的工作流程
- 搜集資料並標注
- 訓練模型並調整
- 把模型部署在雲端環境中
- 可能會很有效,但非常費工
- 而且每個任務都需要單獨的一個模型
- 我們需要做非常大量的工作流程
- 對於LLM來說,只需要編寫適合的提示
- 只要一個API,就能立即開始生成結果
- 這在開發應用上有非常巨大的速度優勢
案例1:電商產品評價分析
- 輸入文字:一個檯燈的產品評價
- 目標1:判斷正負向情緒
- 給定目標:
這個產品評論的情緒是什麼?
- 調整回覆格式:
請直接回答「正向」或「負向」
- 給定目標:
- 目標2:判斷可能包含的情緒
- 給定目標:
這個產品評論可能包含什麼情緒?
- 調整回覆格式:
給出不超過5個可能的結果,用逗號分隔
- 給定目標:
- 目標3:判斷是否包含特定情緒
- 給定目標:
這個產品評論是在表達憤怒嗎?
- 調整回覆格式:
請直接回答「是」或「否」
- 給定目標:
- 目標4:提取特定內容
- 給定目標:
從評論內容提取出「評論者購買的產品」和「製造商」
- 調整回覆格式:
回答使用JSON格式,以"產品"和"品牌"作為key。回答儘量簡短。
- 給定目標:
- 目標5:多任務並行
- 結合以上的提示
- 調整回覆格式:
回答使用JSON格式,以"產品"、"品牌"、"憤怒"、"情緒"作為key,其中憤怒部分用布林值表示。回答儘量簡短。
案例2:報紙文章內容分析
- 輸入文字:一篇虛構的關於政府工人對他們的工作機構的感受的報紙文章。
- 目標1:提取文章主題
- 給定目標:
找出五個這篇文章有關的主題
- 調整回覆格式:
用逗號將結果分隔
- 給定目標:
- 目標2:判斷是否包含特定主題
- 給定目標:
判斷這篇文章是否和以下主題有關:「NASA、地方政府、工程、員工滿意度、聯邦政府」
- 調整回覆格式:
針對每個主題,用0或1來表示是否有包含
- 給定目標:
Transform(轉換)
- LLM非常擅長將輸入轉換成不同的格式,包含
- 將一段文字翻譯成另一種語言
- 協助拼寫或是文法修正
- 修改語氣:例如正式、非正式
- 修改格式:例如json轉換成html格式
- …
案例1:翻譯與語言辨識
- 輸入內容:要翻譯/判斷的文字
- 給定目標:
將內容從英文翻譯成西班牙文
這是什麼語言
將內容翻譯成法文和英文
案例2:語氣與格式轉換
- 輸入內容:要轉換的文字
- 給定目標:
將內容轉換成正式和非正式的形式
將內容轉換成正式的商業書信風格
將這個Python字典從JSON轉換成HTML格式
確保這個內容符合APA格式,使用Markdown格式輸出
案例3:文法檢查
- 輸入內容:要轉換的資料
- 給定目標:
+校對並更正內容
+Proofread and correct this review:
(考慮到這個文法檢查通常用在英文,所以這邊用英文效果會更好就保留原始版本了)
Expand(擴寫)
- 擴寫是將短的文字片段,讓LLM生成更長的文本
- 例如
- 作為腦力激蕩的夥伴
- (若有人濫用)生成大量垃圾郵件
- 在使用LLM的時候,請記得以負責任的方式使用,以幫助人們
- 透過調整模型的
temperature
(溫度)參數可以調整模型輸出的多樣性- 降低溫度:輸出的結果更加確定
- 提高溫度:輸出更加多樣,更具有創造力
案例:自動回覆郵件機器人
- 輸入內容:客戶的電子郵件內容+客戶內容的情緒(詳見Inference(推論)段落)
- 設定背景:
你是一個客戶服務的AI助理
- 給定目標:
你的任務是發送一個關於客戶的電子郵件的回覆
- 設定條件:
如果情緒是中性或正向的,請感謝他們的評論
如果情緒是負向的,道歉並建議他們聯繫客戶服務
- 其他要求:
確保你有使用評論中提到的具體細節
以簡潔專業的預期書寫
以AI的身份署名郵件
ChatBot(聊天機器人)
- ChatGPT就是透過網路介面所呈現的聊天機器人
- 你也可以很簡單的用LLM來建立你自己的聊天機器人,例如
- 扮演AI客服
- 扮演餐廳AI接單員
- 在使用
gpt-3.5-turbo
API的時候可以設定不同的角色內容system
:用來指定ChatBot的個性設定或是行為規範user
:使用者回覆的訊息,或是預期使用者回覆的例子assistant
:ChatBot回覆的訊息,或是預期它回覆的例子
- 在使用API進行多輪對話的時候
- 如果要ChatBot有歷史的記憶,必須要把所有的歷史記錄重新再送一次給模型
- 長度限制仍然會受限於所有訊息的token總和
結論
- 寫提示詞(Prompt)的兩個關鍵原則
- 寫清楚具體的說明
- 給模型足夠的思考時間
- 提示詞的開發是一個持續迭代的過程
- 第一次就得到最終可用的提示詞是幾乎不可能的
- 學習了一些常見的應用
- 總結
- 轉換:翻譯、格式轉換
- 推論:文本情緒、關鍵字、主題提取
- 擴寫
- 可以開始動手撰寫自己的小專案,並負責任的使用LLM來產生正面的影響