同一個問題,兩種不同答案
用某種方式打出一個問題,得到不錯的答案;把它做個無關緊要的改寫——加個「請」、把兩個子句調換順序、換個同義詞——答案的品質就可能改變、甚至翻盤。這就是提示脆弱性(prompt brittleness),以及它的近親提示敏感性(prompt sensitivity):模型的輸出取決於那些本應無關緊要的措辭表面特徵。一個穩健的推理者不會在意客套或詞序;一個模式比對器卻會,因為不同的措辭會把它推向它所學過文本中的不同區域。
一個句子被切分為詞元,再映射到詞元編號和嵌入向量。
空間就只有那麼多
模型一次所能考量的一切——你的指令、目前為止的對話、你貼上的任何文件、以及它正在寫的答案——都必須塞進它的上下文視窗(context window),以詞元(token)計量(一段段文字,每個大約幾個字元)。當對話成長到超過這個額度時,你就撞上上下文長度限制(context length limits):最舊的對話輪次會被丟棄或截斷,而模型是真的「看不到」那些被捲走的內容。它不會警告你,只是悄悄弄丟早先的材料,然後當作那些東西從不存在似地作答。
所有內容共享同一預算:提示、對話歷史、貼上的文件和答案都要計入上下文視窗。
現代模型標榜非常大的視窗,這確實有幫助——但更大的視窗不是免費的。更多的上下文意味著每次呼叫花更多錢、更多時間,而且如我們即將看到的,模型並不會均勻地運用長上下文。「塞得進去」並不等於「被好好用上」。
迷失在中段
一個鮮明且有充分記載的怪癖是「迷失在中段」效應:當關鍵資訊位於長上下文的中段時,模型運用它的能力,明顯遜於同樣的事實放在開頭或結尾附近的時候。注意力偏好兩端。於是你可以貼上一份正好包含答案的長報告,模型卻仍然錯過它——不是因為事實不在,而是因為它被埋在低注意力的地帶。
一個互動式自注意力視圖,突出顯示每個被選詞關注的其他詞。
- 把最重要的指令與事實放在提示的開頭或結尾,而不要埋在中段。
- 別因為一份長文件塞得進視窗,就假設模型「讀過」它;提出針對性的問題並查核。
- 當精確度重要時,只檢索並貼上相關段落,而非把整批語料一股腦倒進去。
限制如何讓失效雪上加霜
這些限制不會各自安分——它們會放大前面談過的失效。一個被捲出視窗的事實,會迫使模型退回記憶去找,而那正是幻覺棲身之處。又長又雜亂的上下文,會讓推理更容易飄移。而在這一切過程中,模型始終維持它自信的語氣,所以一個被截斷、或關鍵藏在中段的上下文,會產出一個缺漏資訊、卻聽起來很完整的答案。這些限制是無聲的,而那份無聲正是危險所在。
一個檢索增強生成流程:查詢檢索出相關段落,在生成前加入提示。