前言

最近大家都在討論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>

技巧2:要求結構化輸出

  • 結構化輸出可以更加容易解析
  • 例如:要求以HTMLJSON格式輸出

技巧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-turboAPI的時候可以設定不同的角色內容
    • system:用來指定ChatBot的個性設定或是行為規範
    • user:使用者回覆的訊息,或是預期使用者回覆的例子
    • assistant:ChatBot回覆的訊息,或是預期它回覆的例子
  • 在使用API進行多輪對話的時候
    • 如果要ChatBot有歷史的記憶,必須要把所有的歷史記錄重新再送一次給模型
    • 長度限制仍然會受限於所有訊息的token總和

結論

  • 寫提示詞(Prompt)的兩個關鍵原則
    • 寫清楚具體的說明
    • 給模型足夠的思考時間
  • 提示詞的開發是一個持續迭代的過程
    • 第一次就得到最終可用的提示詞是幾乎不可能的
  • 學習了一些常見的應用
    • 總結
    • 轉換:翻譯、格式轉換
    • 推論:文本情緒、關鍵字、主題提取
    • 擴寫
  • 可以開始動手撰寫自己的小專案,並負責任的使用LLM來產生正面的影響

參考資料