從說明走向示範
有些任務難以描述,卻很容易示範。與其解釋規則,你不如展示幾組「輸入—輸出」配對,讓模型自行推斷出當中的模式。在提示裡加上範例就是少樣本提示(few-shot prompting)(「少」指的是兩個到一小把),與上一篇的零樣本做法相對。
Convert each company name to a stock-ticker guess. Apple -> AAPL Microsoft -> MSFT Nvidia -> NVDA Netflix ->
自回归循环:将每个预测出的 token 重新输入以生成下一个。
你完全沒有更新模型的權重——學習整個發生在提示視窗之內,只為這一次請求服務。這正是整個領域的核心標題觀念。
情境學習:不用訓練的學習
這種「從放在提示裡的範例學會一項任務、且不更動權重」的能力,就是情境學習(in-context learning,ICL)。它是大型模型帶來的驚喜之一:餵給它一個模式,模型就把它當成一個臨時指令。這些範例不會被儲存;對話一結束,「這堂課」就消失了。每個新提示都得從零教起。
少样本上下文学习:模型在 k 个示例和查询的条件下预测答案,而权重 θ 保持不变。
由於範例就住在提示裡,它們會和其他所有內容爭奪空間。每個示範都要花費詞元(tokens),並計入脈絡長度(context length)上限。三個精準的範例,通常勝過十個草率的範例。
挑選該展示哪些範例
你放進哪些範例,和放幾個一樣重要——這就是範例選擇(demonstration selection)。模型會把範例當成指引,所以要挑真正能代表這項任務的範例,包括你在意的那些棘手情況。
交互式自注意力,高亮显示每个 token 关注的词。
- 涵蓋你預期會在實際使用時遇到的多樣性——而不是三個幾乎相同的簡單案例。
- 至少包含一個邊界案例(空白欄位、含糊的輸入),讓模型學會該如何處理。
- 維持標籤平衡:如果你只展示正面範例,模型可能就不再預測負面結果了。
- 順序也可能有影響;把一個明確有力的範例放在靠近結尾處,往往能錨定模型會複製的格式。
讓範例格式一致
範例不只教內容,也教格式,所以要無比一致。輸入與輸出之間用同一個分隔符、同樣的大小寫、同樣的欄位名稱。強而清楚的分隔符與格式能讓模型看清一個範例在哪裡結束、下一個在哪裡開始——也讓它複製出你想要的那個確切形狀來作答。
如果你在許多請求中重複使用相同結構,就把固定的部分抽成一個提示模板(prompt template):一個可重複使用、留有空位讓你填入的骨架。範例與指令保持不變,只有新的輸入會改變,這就一舉消除了一整類意外造成的不一致。
Task: {task_description}
Examples:
{example_1}
{example_2}
{example_3}
Now do the same for:
Input: {new_input}
Output:範例何時有用、何時無用
當任務有特定格式、或有模型猜不到的特殊慣例,或當零樣本一直偏離你要的東西時,就動用少樣本。當任務常見、一句清楚的指令就已經到位時,就維持零樣本——這時加範例只是白花詞元、毫無收穫。