提示就是你交給模型的那段文字
當你使用大型語言模型(large language model)時,你輸入的一切就是提示(prompt)——模型在回覆之前先讀到的輸入。提示工程就是把這段文字寫好的技藝。這裡沒有隱藏的控制面板:文字本身就是控制鈕。一個模型在某種寫法下看似聰明、換個寫法卻一問三不知,通常是因為它看到了兩個不同的提示,而不是有兩種心情。
流程图:文本被切分为词元,每个词元映射为整数 id,再转换为嵌入向量。
在底層,模型永遠只做一件事——根據目前為止的所有內容,預測下一個詞元(next-token prediction,下一個詞元預測)。你的提示就是在鋪設這段「接龍」。所以提示真正的問題是:什麼樣的脈絡,能讓最有用的接續成為最有可能出現的接續?
模型所做的全部计算:在你目前提示的全部内容条件下,为每个可能的下一个词元给出一个概率——你的提示决定了这段续写。
零樣本:不給範例就直接問
最簡單的提示只給一句指令、完全不給範例。這就是零樣本提示(zero-shot prompting)——你倚賴模型在訓練時已經學到的東西,去完成一個你從未明確示範過的任務。現代經過指令微調的模型,在日常任務上的零樣本表現出奇地好:幫我摘要這段、翻譯那段、把這則評論分類。
Classify the sentiment of this review as positive, negative, or neutral. Respond with only one word. Review: "The battery lasts forever, but the screen scratches easily."
注意這個提示已經有兩個做得好的地方:它列出了允許的標籤,也限制了輸出(「只用一個字」)。當任務常見、而且你把「正確答案長什麼樣」講得一清二楚時,零樣本的效果最好。
把話講清楚就是整場比賽
指令清晰度(instruction clarity)對結果的幫助,勝過任何花俏的技巧。模型讀不到你的心思,只能讀你的文字。模糊的要求等於邀請模型去猜你的本意——它會猜得很合理,卻不一定猜得對。
- 把任務寫成明確的指令,而不是暗示。「把這段改寫成淺白的中文」勝過「這太複雜了」。
- 說明讀者是誰、答案該多長。「給初學者看的三句話」一口氣消除了十幾個猜測。
- 指定輸出的形狀——清單、JSON、單一標籤、表格——這樣你就不必再手動重排格式。
- 如果光用文字仍嫌含糊,就補上一個你想要的形式的範例。(下一篇會更深入談範例。)
角色與結構:系統文字與使用者文字
對話模型會把提示拆成不同角色。系統(system)訊息設定持久的行為——語氣、人設、硬性規則——而使用者(user)訊息承載具體的請求。把長期有效的指示放進系統提示(system prompt),能讓它們在整場對話中保持穩定,而不必每一輪都重講一次。
在單一訊息內部,結構同樣重要。善用分隔符與格式(delimiters and formatting)——標題、三引號、類似 XML 的標籤——把你的指令和模型該處理的資料分開。這能避免模型把「該遵守的文字」和「該處理的文字」混為一談。
System: You are a careful editor. Fix grammar only; never change meaning. User: Instruction: Correct the grammar of the text between the triple quotes. \"\"\" Me and him goes to the market every Sundays. \"\"\"
為什麼同一個意思、寫兩次、結果卻可能不同
很早你就會注意到,兩個你認為等價的提示,可能產生不同的答案。這就是提示敏感度(prompt sensitivity):措辭、順序或格式上的小改動,都可能改變輸出。這不是一個你罵兩句就能消失的臭蟲——它本來就源自 next-token prediction 的運作方式。務實的對策是:把你的提示當成一個需要測試與打磨的東西,而不是寫一次就永遠信任的東西。
交互式自注意力:选择一个词元会高亮它所依赖的其他词元。