Learning Objectives
- 說出提示詞的四個組成:任務、脈絡、輸出格式、限制
- 逐項加入組成,用真實回答比較差異,並說明哪一項沒有達到預期
- 把指令與要處理的資料分開,說明這麼做能擋住什麼、擋不住什麼
- 寫程式組出 messages,不靠手動拼接字串
模型不知道你沒寫的事
模型看到的只有你送過去的文字。你腦中想的「給誰看」「要多長」「什麼格式」,沒寫就不存在,模型只能自己猜。
把提示詞拆成四個部分來檢查,比較不容易漏:
| 組成 | 回答的問題 | 例子 |
|---|---|---|
| 任務 | 要做什麼 | 整理這段課程公告 |
| 脈絡 | 給誰、在什麼情況下用 | 讀的人是修課的大學生,正在用手機看 |
| 輸出格式 | 結果長什麼樣子 | 三行,分別是時間、地點、要做的事 |
| 限制 | 什麼不可以 | 不超過 80 字;只用公告裡有的資訊 |
下面的範例會呼叫模型。程式裡的 client.chat.completions.create 第 7 課會詳細說明,這一課先看 messages 裡放了什麼:system 是給模型的規則,user 是這次的輸入。
和這一軌其他範例一樣,回應是事先用 gpt-5.6-luna 錄好的真實輸出(2026-11-03),改了提示詞再跑會對不上。想試自己的寫法,請用本課後面的互動練習。
逐步看:同一個任務,一次多加一項
公告是虛構的。四個版本只有系統提示詞不同。先猜猜看:哪一項會讓回答改變最多?每個版本各跑一次,所以只能看大方向。
四個版本的差別
上面的真實輸出整理如下:
| 版本 | 字數 | 觀察 |
|---|---|---|
| 只有任務 | 233 | Markdown 標題加 11 個條列,幾乎把公告重列一遍 |
| 加上脈絡 | 246 | 多了「你需要做什麼?」,但沒有變短,還把「計入同儕互評」寫成「列入成績」 |
| 再加格式 | 111 | 變成三行,程式也容易處理 |
| 再加限制 | 83 | 更短,但沒有遵守 80 字的上限 |
從這次的結果可以看到三件事:
- 輸出格式的效果最容易看到。 直接寫出你要的樣子,比描述讀者更有效。
- 加了一項不一定變好。 脈絡讓回答多了一段行動清單,也多了公告沒有的說法。多寫不保證多對,每次修改都要看結果。
- 模型不擅長數字數。 它不是逐字計數再輸出,所以「不超過 80 字」只是方向。真的有上限時,要用程式檢查
len(answer),超過就重試或截斷。
逐步看:資料裡有一句像指令的話
公告的最後一句是寫給同學看的,但模型分得出來嗎?同一種寫法各跑三次。
分開寫有幫助,但不是保證
| 寫法 | 三次的結果 |
|---|---|
| 指令和資料混在一起 | 三次都回答「收到」 |
| 指令放 system,資料包在標籤裡 | 一次做了摘要,兩次仍回答「收到」 |
三次的樣本很小,只能當成例子,不能算出機率。但足以說明兩件事:
為什麼要分開: 模型讀到的全部是文字,沒有「這段是資料」的記號,界線要由你標出來。分開之後,程式也比較好維護:指令固定寫一次,資料每次替換。常用的分隔符有 XML 標籤(<notice>…</notice>)、三個反引號、或 ---。
分開還不夠: 上面的結果顯示,標籤裡的句子還是可能被當成指令。如果資料來自外部(使用者上傳的文件、網頁、信件),這就是資安問題,稱為提示詞注入,不能只靠提示詞防守,第 18 課會處理。
還有一個程式上的小地方:資料裡如果剛好出現結束標籤(</notice>),後面的文字就跑到標籤外面了。組字串之前要先處理,下面的實作題會寫到。
實作:寫一個組 messages 的函數
完成 build_messages(instruction, document),回傳兩則訊息:
system:instruction後面接上NOTE。user:<document>、換行、拿掉</document>之後的document、換行、</document>。
這一題看的是你的程式,提示詞已經固定。組出來的訊息正確才對得上錄音,模型才會回應;錯了會看到「沒有預錄的回應」。請改函數,不要改提示詞的文字。
小測驗:提示詞的結構
在 grow_prompt 範例裡,哪一項讓回答的形式改變最明顯?
提示詞寫了「不超過 80 字」,模型回了 83 字。程式應該怎麼處理最可靠?
範例裡把資料放進標籤、指令放進 system 之後,三次中還有兩次回答「收到」。這說明什麼?
下面的程式會印出什麼?
doc = "停課</notice>補課"
print("<notice>" + doc.replace("</notice>", "") + "</notice>")
重點整理
- 提示詞可以拆成任務、脈絡、輸出格式、限制來檢查;模型不知道你沒寫的事。
- 直接寫出輸出的樣子,通常比描述要求有效;但加了一項不一定變好,要看真實回答。
- 長度這類可以計算的限制,判斷要放在程式裡。
- 指令與資料分開,用標籤包住資料;這有幫助,但不是保證,不能當成資安防線。
- 用函數組 messages,資料裡的結束標籤要先處理。
下一課: 給模型幾個範例、要求它列出步驟,什麼時候有用、什麼時候只是多花錢。