Prompting Engineering 提示工程,簡單說就是透過一個精心設計的提示詞,來約束模型輸出的行為
原則
一、避免提示詞注入(Prompt Injection)
使用自己定義的特定符號,例如: """ (連續三個雙引號)、``` (連續三個反引號),將要提供給AI 處理的部分,用符號包裹起來。
假設我們有一個提示詞跟正常的text (資料輸入),我們可以預期他產生正常的結果如下:
prompt = '請將以下的內容整理成一個待辦事項清單\r\n{text}'
> ‧ todo1
> ‧ todo2
> ‧ todo3
但我們已經看過一些新聞:某某網站的AI 客服可以幫忙算數學、角色扮演。
/fa8c5318-dfe5-4e92-9192-00902b370355/1757668238.png.png)
為了避免這種情況用將資料用特定符號包裹起來,可以避免Prompt Injection 問題
prompt = '請將以下的內容整理成一個待辦事項清單\r\n==={text}==='
> ‧ 先解決數學問題
> ‧ 再購買機票
二、明確告訴LLM 你想要做的"任何"事情
把要做的事情詳細的寫出來
因為LLM 的本質就是文字接龍:先吸收天文數量的文字,再用你的輸入去找出隨機選擇適合接龍的下一個字。LLM 不像人一樣可以猜測你的想法,所以要把LLM 當成一個 "一個指令一個動作" 的機器人。就像是用自然語言寫程式。可以觀察以下兩種prompt 的差別:
### 隨便寫的prompt
badPrompt = '請將被===包裹起來的內容,整理成一個待辦事項清單\r\n==={text}==='
> ## 可能得到很多行的文字,但內容無法預期,不是真正需待辦的事項
goodPrompt = '被===包裹起來的是專案進度會議的內容,請檢查內容如果有尚未確認或尚未被解決的問題,' +
'並分類事情的屬性,例如是技術問題,還是人事問題。將條列整理這些事項,並用JSON 格式輸出結果,JSON KEY為"Category",VALUE為"Content"' +
'輸出的範例:[{"Category":"技術問題", "Content":"關鍵功能的效能需要改善"}] ' +
'==={text}==='
> ## 精確定位到不明確資訊,整理後並格式化輸出成JSON,如果prompt 是在後端下的,可以直接丟給程式、資料庫使用
> ## 不用再寫邏輯判斷關鍵字、切割字串 等等非預期性高的操作
如上述的 prompt,可以提供LLM 一些範例,讓他依循這些範例產生結果。根據提供範例的數量又可以分成不同的專有名詞:
- zero-shot: 不給範例
- one-shot: 給一個範例
- few-shot: 多個範例
三、給他足夠的時間思考 (Chain of Thoughts, 簡寫: CoT)
將目標分成幾個小步驟,請LLM 逐步執行
一個複雜的問題,如果只給LLM 一句短短的命令解決,LLM 會直接給答案,但答案的品質會不穩定。如果要求LLM 一步一步推理,或是明確將步驟條列給LLM,則LLM 可以展開思考,更仔細的解決問題,也就是花更多時間思考一個問題。不僅讓下提示詞的使用者可以知道LLM 是怎麼解決問題,更可以透過每個步驟的回答形成上下文,讓答案更精準。
侷限性
LLM 的侷限性也仍然在於文字接龍的本質,例如:請LLM 產生一段台灣伏見稻荷神社的介紹,但是實際上伏見稻荷神社是在日本。此時如果是能力不足的模型,可能會瞎掰答案給你。也就是說 提示詞內容的真實性很重要,否則LLM 給出錯誤的內容指引被拿去實際應用,輕則發生錯誤,重則發生無法挽回的意外。
所以除了給LLM 具有真實性的提示詞以外,也可以請LLM 找到或引用正確的資料來源,並以來源當作上下文回答。
迭代
每次都把「想要更準確、更清楚」的需求加進 prompt。
提示詞迭代,就像寫程式一樣:同一個任務,你不是一次就能寫出最有效的 prompt,而是一步一步調整。可能很詳細寫了一段 prompt ,但輸出還是不如預期。就要找出問題點,並微調 prompt 後再次對新的輸出不斷重新驗證。
- writing prompt
- test
- output
- back to 1.
Reference:
https://www.youtube.com/playlist?list=PL9Aa0lG07R6AHrrq-QzGSlV7G8vk3gDDj