提示究竟是什麼
你已經知道,大語言模型 本質上是一個下一個詞元的預測器:它讀入到目前為止的文本,給出對接下來內容的機率分布。提示(prompting)無非就是把這段文本安排妥當,讓最可能的續寫恰好就是你想要的答案。當你提示時,模型那幾十億個權重並不會改變——它們在訓練結束時就已經固定了。你唯一能控制的是輸入,而提示就是那個輸入。
這一下子就把整件事重新框定了。你並不是在持久意義上*教會*模型任何東西——你提示裡的內容,對話一結束就什麼也留不下。你是在*引導*一個早已在 指令微調 與預訓練中吸收了海量知識的系統,把它已有的能力對準你這個具體任務。好的提示與其說像程式設計,不如說像給一位讀過幾乎一切、卻對*你的*處境一無所知、聰明又死板的同事下達精確的指示。
上下文學習:不訓練也能「學」
提示之所以根本就能起作用,靠的是一個引人注目的特性,叫做 上下文學習:一個大型預訓練模型能從放進提示裡的示例中捕捉到新的模式,而無需更新權重、無需 反向傳播、無需 梯度下降。給它看三個帶標註的任務示例,它往往就能正確地續寫出第四個。這並不是被明確設計出來的;它是在模型大到一定程度後才浮現出來的,是少數幾個真正配得上 湧現能力 這個名號的現象之一。
不過,得誠實面對這到底是什麼。上下文學習不是模型在重新接線;它是模型*識別出*一個它本就能表示的模式,並據此對接下來的詞元預測加以約束。這個區別解釋了它的侷限:當任務是模型在訓練中見過同類的東西時,示例最管用;而示例無法可靠地裝上一項全新的技能、教會嶄新的事實,或者推翻深層的傾向。當有人把「湧現」說得好像能力一過某個閾值就魔法般冒出來時,請謹慎對待——其中很大一部分的「陡然」,其實是我們*度量*任務的方式造成的假象,而不是網路內部突然有個開關被撥動了。
零樣本、少樣本,以及如何挑選示例
最簡單的提示是零樣本(zero-shot):你只是描述任務然後發問。得益於指令微調,現代模型能很好地應付大量 零樣本 請求。當它們開始搖擺時——格式不一致、類別含糊、風格罕見——你就該祭出少樣本(few-shot)提示:在提示裡直接放進幾組輸入—輸出示例。這就是純靠上下文完成的 少樣本學習,在你考慮微調之前,它往往是最快、最便宜的解法。
Classify the sentiment as positive / negative / neutral. Review: "Battery dies in an hour." -> negative Review: "Setup took five minutes, love it." -> positive Review: "It is a phone. It makes calls." -> neutral Review: "Screen is gorgeous but it overheats." ->
示例攜帶的資訊比你想像的多。它們悄悄地固定了輸出格式、演示了邊角情況、定下了語氣——往往比一整段指令還要可靠。幾條手藝心得:要覆蓋你預期輸入的*多樣性*,而不是三個幾乎一模一樣的簡單例子;讓每個示例的格式逐字逐句保持一致,因為模型對表面形式模仿得特別起勁;還要留意順序——對某些任務,最後一個示例的標籤會把答案往那邊帶。多並不總是好:兩個精當的示例通常勝過十個潦草的,而且每個示例都會花掉你一部分 上下文窗口。
系統提示:搭好舞台
大多數聊天模型會把輸入按角色拆分,其中第一個就是 系統提示:一條常駐的指令,在使用者開口之前,就為整段對話框定了*模型在扮演誰*以及*要遵守什麼規則*。人設、語氣、輸出格式、範圍邊界、拒答規則,都該放在這裡——「你是一位嚴謹的稅務助手;引用你依據的條文;不確定就如實說;絕不杜撰數字。」因為它位於最前面,而且模型被訓練成會著重對待它,所以它會塑造接下來的一切。
但要把你的預期校準好。系統提示是一種強烈的*偏好*,而不是一紙牢不可破的契約。一段冗長或帶有對抗性的對話可能把它一點點磨蝕掉,而一個機靈的使用者輸入有時能把模型勸過它的規則。把它當作你手裡最可靠的行為引導層,而不是一道安全邊界——任何真正絕不能發生的事,都需要在模型*之外*加護欄,而不是只在模型裡面放一句嚴厲的話。
寫出模型能遵循的指令
清晰勝過花俏。模型接觸不到你的意圖,只接觸得到你的字句,所以 提示工程 裡最大的那根槓桿,就是消除歧義。把你想要什麼、要什麼格式、有什麼約束、遇到尷尬情況該怎麼辦,都說清楚。含糊的要求(「總結一下這個」)只會產出含糊、難以預料的輸出;具體的要求(「用三個要點總結這段,每條不超過十五個字,面向非技術讀者」)才能產出你真正可以依賴的東西。
- 先說角色與目標,再說任務——好讓模型在讀到細節之前就明白自己要幹什麼。
- 多用正面指令(「用 JSON 回覆,包含 a、b 兩個鍵」),少用反面指令(「別囉嗦」);說該做什麼,而不只是說別做什麼。
- 用清晰的分隔符(小標題、三引號、類 XML 標籤)把指令和資料分開,讓模型絕不會把兩者搞混。
- 給它一條退路:告訴它當答案不在所給材料裡時該怎麼說,好讓它選擇拒答,而不是編造。
- 用真實、多樣的輸入去測試並反覆打磨;一個在某個例子上表現完美的提示,往往在第二個例子上就翻車。
對於需要推理的任務,一個小小的結構改動就幫助很大:讓模型在作答之前先把思路一步步走一遍——思維鏈提示——給它留出空間去鋪陳中間步驟,這能顯著改善算術、邏輯和多步問題。誠實的提醒是:那段寫出來的推理是一段*被生成的敘述*,並不是內部計算的忠實記錄;它可以看似有理卻依然錯誤,所以要核對答案本身,而不只是核對那段說辭。下一篇指南我們會更深入地講推理技巧。
侷限、解碼與好習慣
再好的提示也越不過模型的兩道硬天花板。第一道是 上下文窗口:一切——系統提示、示例、你的資料、正在進行的對話——都必須塞進一份固定的詞元預算裡,落在窗口之外的,對模型來說就根本不存在。第二道是 幻覺:即便沒有任何依據,模型也會產出流暢、自信的文字,因為流暢正是它被訓練去優化的目標。提示能減輕這兩者(寫簡潔些、讓它註明出處、叫它說「我不知道」),卻無法將其根除——而那正是本階後面要講的檢索與接地(grounding)的用武之地。
在提示旁邊還有一個旋鈕:解碼。像 溫度 這樣的設置,控制著模型取樣下一個詞元時有多隨機。低溫讓輸出更聚焦、更可復現——這正是分類或抽取任務想要的;高溫讓輸出更多變——適合腦力激盪或創意初稿。它不是提示文本的一部分,但它對結果的塑造毫不遜色,而一個「飄忽不定」的提示,有時其實只是溫度對這個任務來說設得太高了。
最後,把提示當作程式碼來對待。給它做版本管理、在一組固定的輸入上測試它,並且每次只改一處,這樣你才能分辨出究竟是什麼起了作用。提示是一項有真實槓桿的真功夫——但它是你最先伸手去拿的工具,而不是最後那個。當一個任務確實需要嶄新的事實時,去用檢索;當它需要的是某種基礎模型怎麼也無法從示例裡學會的行為時,那就是該考慮微調的信號——本階後面的指南會誠實地把它和提示放在一起權衡。