National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 72 24°C PM2.5 13
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 05

提示詞的結構

任務、脈絡、格式與限制,改一項看回答怎麼變
Interaction實作 25 minute(s)

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 字的上限

從這次的結果可以看到三件事:

  1. 輸出格式的效果最容易看到。 直接寫出你要的樣子,比描述讀者更有效。
  2. 加了一項不一定變好。 脈絡讓回答多了一段行動清單,也多了公告沒有的說法。多寫不保證多對,每次修改都要看結果。
  3. 模型不擅長數字數。 它不是逐字計數再輸出,所以「不超過 80 字」只是方向。真的有上限時,要用程式檢查 len(answer),超過就重試或截斷。

逐步看:資料裡有一句像指令的話

公告的最後一句是寫給同學看的,但模型分得出來嗎?同一種寫法各跑三次。

分開寫有幫助,但不是保證

寫法 三次的結果
指令和資料混在一起 三次都回答「收到」
指令放 system,資料包在標籤裡 一次做了摘要,兩次仍回答「收到」

三次的樣本很小,只能當成例子,不能算出機率。但足以說明兩件事:

為什麼要分開: 模型讀到的全部是文字,沒有「這段是資料」的記號,界線要由你標出來。分開之後,程式也比較好維護:指令固定寫一次,資料每次替換。常用的分隔符有 XML 標籤(<notice>…</notice>)、三個反引號、或 ---。

分開還不夠: 上面的結果顯示,標籤裡的句子還是可能被當成指令。如果資料來自外部(使用者上傳的文件、網頁、信件),這就是資安問題,稱為提示詞注入,不能只靠提示詞防守,第 18 課會處理。

還有一個程式上的小地方:資料裡如果剛好出現結束標籤(</notice>),後面的文字就跑到標籤外面了。組字串之前要先處理,下面的實作題會寫到。

互動練習:把課程公告整理成固定格式

寫一段系統提示詞,讓三則公告都整理成同樣的格式。規則檢查只是提示,回答每次可能不同;至少跑兩個版本,比較你改了什麼、結果差在哪裡。

第 3 題的公告裡有一句像指令的話。未登入時可以切換兩個示意版本,看真實的回答:只寫一句的版本在第 3 題只回了「收到」;寫清楚的版本有照格式整理,但第 2 題把地點填成「課程網站」,沒有寫「未提及」。這算不算錯,要由你依用途決定,這也是評估提示詞時常遇到的情況。

實作:寫一個組 messages 的函數

完成 build_messages(instruction, document),回傳兩則訊息:

  1. system:instruction 後面接上 NOTE。
  2. user:<document>、換行、拿掉 </document> 之後的 document、換行、</document>。

這一題看的是你的程式,提示詞已經固定。組出來的訊息正確才對得上錄音,模型才會回應;錯了會看到「沒有預錄的回應」。請改函數,不要改提示詞的文字。

你的輸出
預期輸出

小測驗:提示詞的結構

1.

在 grow_prompt 範例裡,哪一項讓回答的形式改變最明顯?

2.

提示詞寫了「不超過 80 字」,模型回了 83 字。程式應該怎麼處理最可靠?

3.

範例裡把資料放進標籤、指令放進 system 之後,三次中還有兩次回答「收到」。這說明什麼?

4.

下面的程式會印出什麼?

doc = "停課</notice>補課"
print("<notice>" + doc.replace("</notice>", "") + "</notice>")
第 1 次作答

重點整理

  • 提示詞可以拆成任務、脈絡、輸出格式、限制來檢查;模型不知道你沒寫的事。
  • 直接寫出輸出的樣子,通常比描述要求有效;但加了一項不一定變好,要看真實回答。
  • 長度這類可以計算的限制,判斷要放在程式裡。
  • 指令與資料分開,用標籤包住資料;這有幫助,但不是保證,不能當成資安防線。
  • 用函數組 messages,資料裡的結束標籤要先處理。

下一課: 給模型幾個範例、要求它列出步驟,什麼時候有用、什麼時候只是多花錢。

這一課完成了!
Next lesson:Few-shot 與逐步推理
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。