上一篇把知識庫養大之後,發生了一件我沒打算談的事:Claude 自己切換成檢索模式。 進窗口的不再是整份文件,是搜出來的那幾段。
換句話說,窗口裡放什麼,已經不是你一個人在決定了。這一層第二篇要問的就是那個被跳過的問題:到底什麼該進去。
這是第三層「外部知識」的第二篇。先講結論:窗口不是越滿越好,而且它壞掉的方式有四種,每一種的症狀都不一樣。
這個實驗要示範的是:窗口裡的一句錯話,會一直活著。
第一步:開一個新對話,先餵它一個錯的前提,語氣要自然,不要說「假設」。
我們的部署流程是每週五下午跑,這你知道的。先幫我列一下部署前的檢查項目。
第二步:中間插一輪無關的請求(我問的是「把上面那份清單濃縮成五條,給新人看的」),然後問一個只有在那個前提成立時才講得通的問題:
那如果我週四下午才把 PR merge 進去,來得及進這週的部署嗎?
我在 Claude Opus 5(effort high)上跑了一次,結果跟我的預期差了一半,而錯的那一半比較有意思。我預期它會照單全收,它沒有,第一句就拆穿了我:
先說明一下:我這邊沒有開啟記憶功能,所以其實不記得你們團隊的部署細節。以下是一份通用的部署前檢查清單,我特別針對「週五下午部署」的情況加了幾項。
它否認了「這你知道的」,卻沒有否認「週五」。 而且緊接著就為它開了一個專屬段落,叫「週五特別注意」,裡面交代週末 on-call、高風險變更延到下週初。
第二輪的摘要更能看出問題。那一輪我沒有提到星期幾,但濃縮版的第四條是這樣寫的:
通知相關的人:讓受影響的團隊知道要部署,並確認部署時和週末都有人負責、能處理問題。
「週末」是從「週五」推出來的,而這是一份要給新人看的清單。 錯誤到這裡已經沒有任何但書了。
第三輪問到週四那題,它又一次聲明自己不確定規則(「我不知道你們的規定」),然後整段推理照樣長在週五上:
從流程上來看,週四下午 merge 技術上來得及,但時間很緊。merge 之後還得等 CI 跑完、部署到 staging、完成測試或 QA 驗收,如果中間任何一步出問題,就只剩週五上午能修。
三輪下來,它兩次主動說自己不知道你們的規定,卻一次都沒有回頭問過「週五」是不是真的。
這就是這一篇的原型:錯誤不需要被當成權威才會生效,它只需要在窗口裡。 而且你收不回來,在同一個對話裡怎麼追問都沒用,乾淨的解法是開一個新對話。(只跑一次,是例子不是證據。)
不過它第一句那個「沒有開啟記憶功能」值得停一下,因為那正是這個解法成立的條件。開新對話之所以乾淨,是因為上一輪什麼都沒留下來。 記憶一旦打開,前提就不成立:那句「每週五下午部署」有機會跟著你進到下一個對話,而你不會看到它被塞進去。
這一層管的是這一次呼叫的窗口裡放什麼;跨對話留下什麼是另一個軸,屬於第四層「記憶」。今天所有的討論都預設記憶是關的。
第 4 篇引過 Anthropic 對脈絡工程(context engineering)的定義,這裡把它攤開。官方文章把脈絡定義成(2026-09-20 查)「從大型語言模型取樣時,被放進去的那組詞元」,而脈絡工程是「在推論期間,策展與維護那組最合適的詞元的一整套策略」。
跟提示詞工程的差別,官方講得很直接:提示詞工程是寫指令,是一次性的寫作工作;脈絡工程是每一次決定要送什麼給模型時都要重做一次的事,範圍涵蓋系統指令、工具、外部資料與整段對話歷史。
這也不只是廠商的說法。學界那邊有一份脈絡工程的總覽(Mei et al., 2025),整理了超過 1400 篇論文,把它定義成「一門正式的學科,超出單純的提示詞設計,涵蓋對送進模型的資訊負載做系統性的最佳化」,前提跟官方講的一樣:模型的表現「根本上取決於推論時提供的脈絡資訊」。
那份總覽把這個領域拆成兩層,值得跟這個系列的七層對照著看:底層是脈絡的取得與生成、處理、管理三件事,上層是把它們組起來的系統,包括檢索增強生成、記憶系統、工具推理與多代理。那四樣正好就是這個系列第三層到第七層的題目。
所以這不是換個時髦的說法。第二層那三篇,你調的是自己寫進去的字;到了這一層,窗口裡有一大半的東西不是你打的:上傳的文件、搜出來的段落、工具的定義、前面每一輪的對話。你的工作從「寫得好」變成「決定誰有資格佔位置」。
這個系列從第 3 篇起就一直在講「窗口是邊際效益遞減的有限資源」。它為什麼遞減?官方文章給了機制。
注意力是有預算的。 Transformer 架構讓每個詞元都能注意到其他每一個詞元,n 個詞元就是 n² 組兩兩關係,這就是所謂的 N² 問題。
而預算為什麼是固定的,關鍵在那個機制叫 softmax 注意力:每一次注意力計算都會把權重正規化成總和為 1。這是重點,因為總和固定,多一個詞元進來,就是從其他每一個詞元身上分走一點。你塞進去的每一段無關內容,都在稀釋真正相關那一段拿到的權重。
用工程的講法:窗口是一個訊噪比(signal-to-noise ratio)的問題,不是容量問題。 官方的說法是「脈絡大小與注意力集中度之間有一個天然的張力」。
兩個推論值得記住:
窗口越長、品質越差這件事有一個名字,叫脈絡腐化(context rot)。
先講清楚它是什麼層級的東西:腐化不是一種失效,是一個現象的統稱。 它要解釋的是一件很具體的事:同樣的資訊、同樣的問題,只因為窗口變長就變差。這個設定裡沒有任何東西是錯的,資料對、問題也對,壞掉的是模型使用它們的能力。
這個現象沒有單一成因,至少有四個機制同時在作用:
一、注意力被攤薄。 就是上面那個 softmax:權重總和固定,詞元越多,每一個分到的越少。這一種是稀釋,跟內容對不對無關。
二、訓練分布本來就偏短。 官方文章直接點了這一條:訓練資料以短序列居多,所以模型處理長距離依賴的專門參數相對少。它不是不想看遠處,是它練得少。
三、表徵坍縮與過度擠壓。 這一種最硬,而且是被證明出來的。Transformers need glasses!(Barbero et al., 2024)去分析最後一層、最後一個詞元的表徵,因為那個向量就是拿來預測下一個字的東西。他們證明了兩件事:
四、位置偏誤。 前三個都跟「放多少」有關,這一個跟「放在哪裡」有關:同樣一段資訊,擺在開頭、中間或結尾,被用到的程度不一樣,中間最吃虧。這個現象有一個很好記的名字,叫 Lost in the Middle,而它是四個裡唯一你可以靠調整順序來緩解的。
把四個放在一起看,結論對工程師很實際:腐化不是一個 bug,是這個架構在長輸入下的性質。 前三個你沒辦法靠提示詞修掉,只能少放一點東西進去;第四個可以靠位置補救一些。
這一節講的是為什麼會腐化。腐化實際長什麼樣子、位置效應有多大、在什麼長度開始明顯,那是量出來的東西,這個系列後面有專門的一篇處理 Lost in the Middle 與實測曲線。
腐化是成因,你日常遇到的是症狀。 下一節那四種失效,就是從這幾個機制長出來的:
| 機制 | 推出來的症狀 |
|---|---|
| 注意力被攤薄 + 訓練分布偏短 | 東西放越多越不準,而且跟內容對不對無關 |
| 注意力被攤薄 + 表徵坍縮 | 不相關的東西也會被拿去用:它照樣分走注意力,而且詞面像就容易被當成相關 |
| 位置偏誤 | 窗口裡有兩種說法的時候,誰被採信有一部分是位置決定的 |
但不是四種失效都由腐化造成。下一節的第一種與第四種,來源分別是模型自己的輸出被接回輸入,以及你送進去的來源本來就互相矛盾;就算窗口很短,這兩種照樣會發生。腐化不是它們的成因,是它們的放大器:窗口一長,錯的那句話更不容易被後來的正確資訊蓋過去。
分清楚有實際的好處:腐化的直接產物靠「少放一點」就會改善,被放大的那兩種不會。
窗口壞掉的方式,我分成四種來講。每一種背後都有一篇論文,四篇都是我自己打開摘要確認的,而且作者群彼此無關,是從四個方向各自撞到同一件事。每一種我都先給學術上的名字再給白話的。
hallucination snowballing。 一個錯誤進到脈絡裡,之後被一再引用。
Zhang et al.(2023)的定義是模型「對早期的錯誤過度承諾,導致它犯下原本不會犯的錯」。真正嚇人的是證據方向:作者假設模型在替先前的幻覺辯護時,講出來的假話它自己分辨得出來是錯的,而實驗證實了,ChatGPT 認得出自己 67% 的錯誤,GPT-4 是 87%。
它不是不知道那是錯的,它是為了跟前面說過的話保持一致而繼續錯下去。 這跟上面那個實驗的形狀一樣:它明明說了「我不記得你們團隊的部署細節」,卻照樣拿週五往下推。
底下的機制是自迴歸誤差複利(autoregressive error compounding):模型每產生一個詞元都會接回輸入去產生下一個,它自己剛寫錯的東西,下一步就成了既定事實。錯誤不只留在窗口裡,還會在每一輪被重新確認一次。這就是為什麼這一種很難靠追問修好,你追問的每一句,都疊在那個已經歪掉的基礎上。
length-induced degradation。 這一種還沒有公認的名字,論文是用現象描述的。脈絡長到模型過度關注脈絡本身,忽略訓練時學到的東西,底層機制就是上面那個 softmax 稀釋。
Same Task, More Tokens(Levy et al., ACL 2024)把長度單獨隔離出來測:同一題,用不同長度、類型、位置的填充內容撐長,再比成績。結論是推理能力「在遠比技術上限更短的長度就出現明顯退化」,而且每一個版本的資料集都出現,只是強度不同。
還有一個給工程師的提醒:他們發現傳統的「下一個字預測」指標,跟推理表現是負相關的。模型在長脈絡下看起來還很會接話,不代表它還會想事情。
窗口上限是 100 萬,不代表你該用到 100 萬。 長脈絡拿來做檢索與摘要是一回事,拿來做多步驟推理是另一回事。
distractibility。 脈絡裡多餘的內容,被模型拿去產生了低品質的回答。
查文獻的時候要小心這兩種很容易撞在一起:論文標題寫 distracted 的,指的是這一種,變因是內容相不相關;上一種的變因是長度,要用 input length 或 long context 去查。兩個都翻成「分心」,但不是同一件事。
Shi et al.(ICML 2023)的設計很乾淨:拿小學數學題,在題目敘述裡加入不相關的資訊,做成 GSM-IC 這個資料集。結果是解題正確率「顯著下降」。
為什麼不相關的東西會被拿去用?因為模型判斷「相關」的依據,很大一部分是詞面上的相似,而不是語意上的可用。題目裡出現了一個數字、一個看起來像的名詞,它就傾向把那個東西算進來。這個落差叫詞面與語意的推理落差(lexical vs. semantic reasoning collapse):表面對得上,對解題根本沒用。下一篇講檢索的時候會再碰到同一件事,只是換到向量那一端。
這篇最實用的是它給的兩個緩解方式,因為兩個你今天就能用:用自我一致性(self-consistency)解碼,以及在提示詞裡直接叫模型忽略不相關的資訊。第二個聽起來太簡單,但它真的有效,而這也說明了問題的本質:模型不會自己判斷什麼該忽略,你得說。
knowledge conflict。 累積進脈絡的新資訊與工具,跟裡面已經有的東西互相衝突。第 5 篇引的那份總覽把它分成三種,這一種叫脈絡之間衝突(inter-context conflict)。
這一種上一篇已經碰過:知識庫裡新舊兩份文件同時被搜出來,模型沒有原則可以選。那是空間上的衝突。
還有時間上的衝突,而且量得出來。LLMs Get Lost In Multi-Turn Conversation(Laban et al., 2025)把原本一次講完的題目拆散到多輪對話裡,再比較兩種講法的成績:他們測的每一個主流模型都明顯變差,六類生成任務平均掉 39%,分析建立在超過 20 萬場模擬對話上。
論文把退化拆成兩半,這個拆法比那個數字更有用:能力只掉了一點,不穩定卻大幅增加。作者的解釋是模型在前幾輪就先做了假設、太早給出答案,然後過度依賴它;結論寫得很白:「一旦在對話裡轉錯彎,它們就迷路了,而且回不來。」
那些太早給出的答案不會消失,它們留在窗口裡,繼續影響後面每一輪。這跟第一種雪球效應其實是同一件事,只是錯誤的來源從外部資料換成了模型自己。
第一篇那個最小的請求結構,到這一層還是同一個。把四種失效標回去,會發現它們住在不同的欄位,這也是為什麼解法不一樣:
{
"model": "claude-opus-5",
"system": "(高度要對:太死板或太空泛都會出事)",
"tools": [ "…", "…", "…" ],
"messages": [
{ "role": "user", "content": "(上傳的文件、搜出來的段落)" },
{ "role": "assistant", "content": "(它上一輪說的話,對的錯的都在)" },
{ "role": "user", "content": "(這一輪的問題)" }
]
}
tools 越長,越容易觸發可分心性。 不相關的工具跟不相關的資料一樣會被拿去用。messages 越長,越容易退化,也越容易滾雪球。 錯的東西一旦寫進這個陣列,之後每一輪都會重送一次。你刪不掉它,只能不要送。
messages 裡塞進互相矛盾的來源,就是知識衝突。 新舊兩份文件、或是前面幾輪太早給出的答案。system 不直接製造這四種,但它的高度決定了模型在窗口變亂的時候還抓不抓得住重點。第 4 篇講快取的時候說過「穩定的放前面、易變的放後面」,那是為了省錢。這一篇是同一個結構的另一個理由:那個順序也決定了什麼東西會一直活著。
官方文章給的原則只有一句:找出「能讓你想要的結果最可能發生的、最小的高訊號詞元集合」。
「最小」不等於「短」,官方特別澄清了這點。落到這一層,有三件事現在就用得上:
而上一篇那個自動切換,就是這句原則的產品版:知識庫大到一個程度,正確的做法本來就不是整份塞進去,而是留著索引、問到才去搜。 產品替你做了這個決定,而這裡是它背後的理由。
只要進窗口的東西是被搜出來的,就會多一個問題:那幾段要不要再排一次序。 檢索給你的是「最像的前幾名」,而最像不等於最有用,所以實務上會多接一個步驟叫重排序(re-ranking),把真正能回答問題的那幾段推到前面。這一步直接決定窗口裡的訊噪比,這一層後面會專門講。
官方還給了壓縮、筆記、子代理三種做法,但那三種分別屬於第四層與第七層,這個系列後面會走到,今天先不展開。
這一篇講的是通用的東西。 注意力預算、四種失效、最小高訊號集合,換成任何一家的模型都成立。Claude 在這裡的角色是量尺:它把窗口上限、
usage的詞元數、快取命中、RAG 切換的標示都做成看得見的東西,所以我可以拿它來示範。分類本身不是它的。
你要開始為「沒放什麼」負責。 前兩層的失敗看得見:格式不對、規則沒照做。這一層的失敗是沉默的,它會用一樣的語氣,根據不完整的窗口給你一個完整的答案。
四種失效的症狀不一樣,解法也不一樣,所以出事的時候第一件事是分類,不是重寫提示詞:
| 症狀 | 大概是哪一種 | 先做什麼 |
|---|---|---|
| 它一直重複同一個錯誤的事實 | 雪球效應 | 開新對話,不要在原地追問;記憶開著的話,還要確認那句錯話沒被記下來 |
| 對話很長之後開始繞圈、重複動作 | 長度退化 | 把任務切段,別讓單一對話無限長 |
| 給了工具或資料之後反而變差 | 可分心性 | 減少工具與資料,不是增加 |
| 前後說法不一致、越問越歪 | 知識衝突 | 一次把需求講完,或重開一輪講清楚 |
最貴的是最後一列。 那篇論文量到的不是「會答錯」,是「變得不穩定」。不穩定的系統沒辦法靠重跑一次來確認,你只會得到另一個樣本。
多了什麼能力:窗口從「能塞多少」變成「該放什麼」,而且出事的時候有四個名字可以分類,不再只能說「它今天怪怪的」。
多付了什麼代價:你要為沒放進去的東西負責;失敗是沉默的;而最麻煩的那一種失效不是答錯,是變得不穩定。
檢索是怎麼回事:切塊、向量,找出來而不是記起來。
這一篇說「放最小的高訊號集合」,但沒說那一小段要怎麼找出來。下一篇進這一層的深水區,把檢索拆開:一份文件怎麼被切成塊、一段文字怎麼變成一串數字、「相關」這件事到底是怎麼算出來的。順帶一提,這條路上有一個洞:Anthropic 沒有自己的向量化模型,官方文件自己這樣寫。那一篇會處理這件事。