還記得昨天我們聊的嗎?提示詞就像是指揮棒,能把模型從「亂猜」拉回正軌。可是就算你指揮得再精準,大型語言模型還是有一個很難避免的毛病——幻覺(Hallucination)。
所謂幻覺,就是模型一本正經地回答,但答案卻是它自己編的。你可能問它某個 API 的參數,它給你一個看起來很合理的 audiences_v2
;結果查文件才發現根本不存在。這種「自信但錯誤」的情況,就是 LLM 世界裡最頭痛的幻覺。
幻覺不像一般的錯字或計算失誤,它更像是模型「腦補」出來的結果。因為 LLM 本質上是用機率去預測下一個詞,所以當知識斷層出現,它就會憑「語感」補上。對於聊天還好,但如果用在工程文件、法規遵循或金融系統,那就可能是災難。
如同昨天提到的,LLM 的核心是:對所有可能的 token 算出 logits(原始分數),再套 softmax → 機率分布。如果知識覆蓋,正確 token 的 logits 會很高,輸出接近事實。如果知識斷層,模型就只能靠「語言共現統計」湊,填上「看似合理」的 token。所以你問「RFC 7807 定義什麼?」時,如果它在訓練資料裡找不到,就會根據「RFC + 號碼」的語言模式去腦補一個不存在的章節。
現在雖然很多系統用 RAG(Retrieval-Augmented Generation)補充知識,但有幾個常見缺陷:
RAG(Retrieval-Augmented Generation,檢索增強生成)可以想像成「模型考試時偷偷帶小抄」。單純的 LLM 只靠自己腦袋(訓練資料)回答問題,容易記錯或亂編。RAG 的做法是:先去資料庫或知識庫「翻找相關段落」(檢索),再把這些段落丟給模型當參考,讓模型生成更正確、更有根據的答案。這樣它就不是單靠「語感」亂猜,而是有外部依據來輔助回答。
前面我們談到幻覺的原因,像是知識缺口或 RAG 檢索不全。但還有一個常被忽略的來源:上下文衰減。你可以想像模型讀提示詞的過程,就像人聽一場演講——一開始講的東西(開場)大家通常記得比較清楚,越到後面注意力就越容易跑掉。LLM 也一樣,它的運算方式會讓「前段內容」的影響力相對穩定,而「尾端的訊息」權重會逐漸弱化,特別是當上下文很長的時候。
這意味著:如果你把「請僅根據以下文件回答」這樣的重要規則放在最後,模型很可能直接忽視。這也是為什麼有經驗的人會 在開頭先定規則,最後再重申一次 ——就像主持人會在會議開頭講議程、最後再提醒一次重點,避免大家漏聽。
Transformer 也是這樣,它的注意力機制對「位置」很敏感:
這個現象在技術上來自 位置編碼(Positional Encoding) 和 注意力分佈(Attention Distribution): Transformer 需要知道 token 在序列中的相對位置,於是會加上位置編碼。但當上下文拉得很長,遠距離 token 的位置資訊就會「稀釋」,導致尾端訊息難以被模型同樣重視。在傳統 Transformer 中,長上下文會造成尾端訊息影響力減弱。但新一代模型使用改良位置編碼(如 RoPE、ALiBi),已能改善這問題,但仍不等於完全解決。
新一代模型(像 GPT-4、Gemini 1.5)已經採用了 RoPE(Rotary Positional Encoding)、ALiBi、長上下文注意力(Long Attention) 等技術,可以顯著緩解尾端衰減。
除了知識缺口、RAG 限制、上下文衰減,還有一個影響「幻覺率」的重要環節:解碼策略。
LLM 在生成文字時,其實是在「機率池」裡挑下一個字。問題是,怎麼挑?這就取決於 sampling(採樣方式)。有幾項參數如下
不過一般GPT工具,大多不會讓你調整這些參數,但你還是能透過 Prompt 工程間接影響模型行為。明天會詳述這塊。
最後還有更底層的一層機制 —— 注意力(Attention)。Transformer 的運作可以簡化成一個公式:
Attention = Query × Key → Value
當模型要產生下一個 token 時,會拿當前位置的 Query,去比對整個 prompt 裡所有 token 的 Key,算出誰比較相似,然後根據這些相似度,從對應的 Value 裡「抽取訊息」。如果 prompt 裡根本沒有正確資訊,它也不會停下來,而是 硬要找一個最接近的 Key,再把相關的 Value 湊出來。這就是所謂的 「軟檢索(Soft Retrieval)」。不像傳統搜尋(有找到或沒找到),LLM 的注意力永遠會給你「某種答案」。所以當資料缺漏時,它會合理化地拼湊出一個聽起來像真的東西,幻覺就這樣產生了。
補充一個容易被忽略的來源:In-Context Learning 的副作用。所謂 In-Context Learning,就是模型在推理時,會把你在 prompt 裡提供的範例「當場學起來」,好像短期記憶一樣,用來模仿格式或思路。這也是 Few-shot / Zero-shot 的基礎:我們在 prompt 塞幾個範例(Few-shot),或乾脆沒有範例(Zero-shot),模型就會照著「場上學到的規則」來回答。聽起來很聰明,但也有隱憂——如果範例本身有錯,模型會把錯誤「當成規則」放大。這點會在後面提示詞的章節再更詳細展開解釋。