本系列第 17 篇|這篇回答:生成式 AI 的能力從哪些資料來?怎麼讓它先查資料再回答? 讀完這篇,你應該能:
- 說明大數據在預訓練、監督式微調與偏好對齊各階段分別在學什麼
- 畫出 RAG 流程,並依情境判斷該用 RAG 還是微調
- 用嵌入、餘弦相似度與向量資料庫解釋語意相近的內容如何被找回來
一、原理:生成式模型學的是資料分佈
生成式模型學的是資料分佈,餵入的偏誤會進到生成結果。
詳細說明
生成式模型(generative model)學的是資料本身的分佈,並依這個分佈產生新樣本。餵進去的資料有哪些規律、哪些話重複出現、哪些內容不該留下,都會進到模型後來的生成結果裡。
常見類型可以先分開理解,避免把「能生成」看成同一種訓練。
大型語言模型(LLM)以 Transformer 的自注意力(self-attention)預測下一個 token。前面的文字決定下一個 token 的機率,模型再把 token 一個個接下去,新的文字就是這樣產生的。一次預測一個 token 的過程、注意力與脈絡窗口的限制,以及幻覺的成因,第 16 篇有完整說明。擴散模型(diffusion model)從雜訊出發,逐步去噪,得到影像。GAN(Generative Adversarial Network)把生成器與判別器放在一起對抗訓練:生成器產生樣本,判別器分辨真假,兩邊同時更新。VAE(Variational Autoencoder)把資料編碼到潛在空間,再從潛在空間解碼回樣本;要新樣本時,走的仍是這條解碼路徑。
大數據進到 LLM,依目的分成三個階段,不能互相替代。
預訓練使用海量文字,以自監督方式預測下一個 token,學的是語言怎麼接,以及文字裡帶有的知識。監督式微調(SFT,supervised fine-tuning)使用人工撰寫的指令與回答,讓模型學會按指令作答,而不是只把字接完。偏好對齊使用人類偏好資料,例如 RLHF(以人類回饋強化學習):幾種回答都接得下去時,模型偏向人比較想要的那一種。
預訓練資料進模型前要先處理。重複內容必須去重複,因為重複會被過度記憶。其後做品質過濾,移除個資與有害內容,再斷詞成 token。資料品質直接決定模型品質。低品質或重複的資料不會被自動忽略,其中的偏誤會被放大。
二、嵌入、RAG、微調與資料風險
嵌入、餘弦相似度與向量資料庫
餘弦相似度只看方向不看長度,近似最近鄰以少量精確度換取速度。
詳細說明
檢索之前,文字和圖片要先變成可以比較的數字。嵌入(embedding)把文字或圖片轉成高維向量:語意相近的內容,向量也相近。
這篇用餘弦相似度(cosine similarity)比較兩向量有多近:
cos(a, b) = a·b / (|a| |b|)
分子是內積,分母是兩個長度的乘積。結果落在 −1 到 1,只看方向,不看長度。方向相同時接近 1,方向垂直時為 0。可以把向量想成箭頭:兩支箭頭指向接近,就算一長一短,餘弦仍然高。
以 a = (1, 0)、b = (1, 1) 把算式走完。
- a·b = 1×1 + 0×1 = 1
- |a| = √(1² + 0²) = 1
- |b| = √(1² + 1²) = √2
- cos(a, b) = 1 / (1 × √2) = 1/√2 ≈ 0.707
內積 1 與長度 √2 都是算式的一部分,本身不是相似度。
向量資料庫(vector database)存放大量嵌入。筆數到了百萬至數十億,逐筆比對太慢,因此用近似最近鄰(ANN,approximate nearest neighbor)索引,例如 HNSW,在毫秒級找出最相近的 k 筆。ANN 以少量精確度換取大幅速度,不保證每一筆都是數學上的精確最近鄰。
檢索增強生成:流程、切塊,以及和微調的分工
經常變動的事實通常用 RAG,格式與語氣才靠微調。
詳細說明
檢索增強生成(RAG,retrieval-augmented generation)把找依據和生成回答接成一條可以畫出來的流程:
文件切塊 → 每塊轉成嵌入 → 存入向量資料庫 → 使用者提問轉成嵌入 → 檢索最相近的 top-k 片段 → 把片段放進提示詞 → LLM 依據片段生成回答,並可附出處。
文件切塊(chunking)的大小決定檢索準不準。切塊太大,一個片段塞進太多主題,檢索不精準,也佔用上下文。切塊太小,語意被切斷,依據不完整。常讓相鄰塊有部分重疊,使落在邊界上的句子不會只出現在其中一塊。
用詞不同但意思接近時,向量檢索比較有利;專有名詞和型號則不一定穩。混合檢索把兩側合在一起:關鍵字檢索例如 BM25,擅長專有名詞與型號;向量檢索擅長語意。
RAG 的知識放在文件裡。文件更新後,換成新的切塊與嵌入即可,不必重新訓練。回答可以引用來源,也因為有片段可依,有助於降低幻覺(hallucination)。幻覺是指模型產生看似合理但不正確的內容。緩解方式是:用 RAG 提供依據、要求附上引用、限制只根據提供的內容回答,以及事後查核。企業內部的私有知識同樣適合走這條路,不必全部寫進模型參數。
微調(fine-tuning)改的是另一件事:模型的行為、輸出格式、語氣,或某項特定任務的能力。若要讓模型跟上經常變動的事實,通常用 RAG 較合適。事實隨文件更換;格式與語氣才靠微調,也可以再結合指令設計。
合成資料
合成資料會繼承並放大偏誤,持續迭代會造成模型崩潰。
詳細說明
合成資料(synthetic data)是用生成式模型產生的訓練資料,可補足稀少類別、在不便直接使用原始個資時保護隱私,並降低標註成本。它會繼承並放大原模型的偏誤與錯誤。若下一代又拿這些產出當訓練資料,分佈會逐漸變窄、品質退化,稱為模型崩潰(model collapse)。因此仍要人工抽查,並用真實資料驗證,不能把真實資料整批換成合成資料後就持續迭代。
提示注入與個資外洩
提示注入會誘使模型偏離任務,個資也可能在回答裡被輸出。
詳細說明
提示注入(prompt injection)是指使用者的輸入,或檢索到的文件,裡面藏了指令,誘使模型偏離原本任務。RAG 會把檢索片段放進提示詞,所以文件本身就可能帶著這類指令。檢索來源要控管,權限採最小化。
另一項是個資外洩。訓練資料或對話中的個資,可能被模型記住,之後又在回答裡輸出。預訓練時移除個資,上線後限制模型能讀到的內容,都是在壓這條出路。
程式對照
search 回傳的編號 I 用來取出切塊原文,再放進提示詞。
詳細說明
下面是 RAG 四個呼叫的概念示意。model 是嵌入模型,index 是向量索引,實際名稱依使用的套件而定;最後兩行是本篇的餘弦相似度算式。
import numpy as np
emb = model.encode(chunks) # 每個切塊轉成一個向量
index.add(emb) # 存入向量索引(例如 HNSW)
query_emb = model.encode([question]) # 提問也轉成向量
D, I = index.search(query_emb, k=5) # I:最相近的 5 個切塊編號;D:對應的距離
a, b = np.array([1.0, 0.0]), np.array([1.0, 1.0])
cos = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 約 0.707
search 回傳的編號 I 用來取出對應的切塊原文,再放進提示詞。
三、容易混淆的地方
實務上常把下面六組概念放在一起比較。先分清每一組在回答的問題,再看資料需求與系統紀錄中的線索。
| 容易混淆 | 差別在哪 | 實際遇到時的線索 |
|---|---|---|
| RAG/微調 | RAG 更換文件與嵌入就能更新知識,並可附出處;微調改行為、格式、語氣或特定任務能力 | 知識文件經常更新且回答要對到條文時用 RAG;需要固定格式或語氣時考慮微調 |
| 預訓練/SFT/偏好對齊 | 預訓練用海量文字自監督預測下一個 token,學語言與知識;SFT 用人工指令與回答;偏好對齊用人類偏好,例如 RLHF | 訓練資料規格包含海量文字、指令與回答,或人類對回答的偏好時,分別對應預訓練、SFT 與偏好對齊 |
| 餘弦相似度/歐氏距離 | 餘弦只看方向,範圍 −1 到 1,長度不計;歐氏距離(Euclidean distance)是直線距離,長度會影響。方向相同但長短不同時,歐氏距離不為 0,餘弦仍可以很高 | 向量資料提供兩個向量,且需求只比較方向、不看長度時,用餘弦相似度 |
| 精確最近鄰/近似最近鄰 | 精確最近鄰(exact nearest neighbor)保證找到最近的一筆;ANN(例如 HNSW)以少量精確度換毫秒級速度,規模可到百萬至數十億 | 向量索引含大量高維資料且速度要求高時考慮 ANN;產品規格若要求保證找到最近一筆,就不能以 ANN 滿足這項保證 |
| 資料擴增/合成資料 | 資料擴增(data augmentation)從既有真實樣本做變化;合成資料由生成式模型產生,能補稀少類別,也會繼承偏誤 | 生成流程下一代全部使用模型自己的產出時,屬合成資料,並需考慮模型崩潰 |
| 鑑別式/生成式 | 鑑別式(discriminative)模型判斷樣本屬於哪一類;生成式模型學資料分佈,能產生新樣本 | 功能需求要產生新文字或新影像時用生成式;只要判斷樣本類別時用鑑別式 |
四、基礎練習
第 1 題
某公司的內部規章每週更新。員工要用自然語言提問,回答必須對得到依據的條文。比較合適的做法是?
- (A) 每週重新預訓練一次,把新規章學進模型
- (B) 以 RAG 檢索最新條文,依片段回答並附出處
- (C) 在提示詞中要求模型記得最新規章
- (D) 將規章轉成 One-Hot 編碼後再拿來回答
看答案與解析
答案:B
規章每週變,而且回答要附條文。RAG 把最新規章切塊、嵌入、存入向量資料庫;提問時取出 top-k 片段放進提示詞,模型依片段作答並可附出處。文件更新就更換切塊與嵌入,不必重新訓練。
- (A) 預訓練是用海量文字自監督預測下一個 token,用來學語言與知識,不是每週刷新一份內部規章的做法。
- (C) 提示詞若只命令模型「記得」,並沒有把當週條文放進上下文,模型無從引用剛更新的文字。
- (D) One-Hot 只用 0 與 1 標記類別,沒有「語意相近則向量相近」,也不能檢索條文後生成附出處的回答。
第 2 題
某檢索步驟把兩段文字編成向量 a = (1, 0)、b = (1, 1)。這兩向量的餘弦相似度是?
- (A) 1
- (B) 0
- (C) √2
- (D) 約 0.707
看答案與解析
答案:D
a·b = 1×1 + 0×1 = 1。|a| = √(1² + 0²) = 1。|b| = √(1² + 1²) = √2。cos(a, b) = 1 / (1 × √2) = 1/√2 ≈ 0.707。
- (A) 1 是內積,還沒除以兩個長度。
- (B) 0 是兩向量垂直時的餘弦;b = (1, 1) 在第一個分量上與 a 同向,並不垂直。
- (C) √2 是 |b|,只是分母的一部分,不是相似度。
第 3 題
某平台的向量資料庫存放大量高維嵌入,查詢希望在毫秒級完成,因此採用 ANN 索引。採用它的主要原因是?
- (A) 在大量高維向量中,以少量精確度換取大幅檢索速度
- (B) 保證每次都找到精確最近鄰
- (C) 把原始文字壓縮成較短的句子
- (D) 確保寫入符合 ACID 交易
看答案與解析
答案:A
百萬到數十億筆高維向量若逐筆精確比對,速度不夠。ANN(例如 HNSW)放棄「每一筆都是精確最近鄰」的保證,換取毫秒級檢索。
- (B) 保證找到精確最近鄰的是精確搜尋;ANN 的取捨正是少一點精確度。
- (C) ANN 索引用來找相近向量,不是把文字壓成較短原文。
- (D) ACID 是交易資料庫的性質,不解釋高維向量為什麼要做近似檢索。
第 4 題
某客服 RAG 經常答非所問。檢查後發現,每一個檢索片段都長達整章。比較合適的調整是?
- (A) 將 top-k 設為 1,只保留一個片段
- (B) 改以 Min-Max 處理向量數值
- (C) 切塊過大,應縮小片段並讓相鄰塊部分重疊
- (D) 更換參數規模更大的模型
看答案與解析
答案:C
片段長達整章,表示切塊太大。檢索會把整章當成一個單位,既不精準,又佔用上下文。應縮小切塊,並讓相鄰塊部分重疊,避免邊界上的句子被切掉。
- (A) top-k 改成 1,取回的仍是一整章,粒度問題還在。
- (B) Min-Max 是把數值縮放到固定區間,不決定文件怎麼切。
- (D) 模型更大並不改變「一塊就是一章」這個檢索單位。
第 5 題
某團隊覺得真實標註太少,打算從下一版開始,每一代都只用這一代模型產生的合成資料來訓練下一代。這個計畫最該先面對的問題是?
- (A) 合成資料由模型產生,因此沒有偏誤
- (B) 有偏誤放大與模型崩潰的風險,仍需真實資料與人工驗證
- (C) 訓練資料越多越好,不必再檢查
- (D) 合成資料是模型寫出來的,不可能含有錯誤
看答案與解析
答案:B
合成資料會繼承並放大原模型的偏誤與錯誤。一代代只吃自己的產出,分佈逐漸變窄、品質退化,就是模型崩潰。要保留真實資料,並做人工抽查與驗證。
- (A) 合成資料沿用原模型的分佈,偏誤會跟著過去。
- (C) 筆數變多不能代替檢查;未經驗證就迭代,正是這裡的風險。
- (D) 合成資料可以含有錯誤,錯誤還會被下一輪訓練放大。
第 6 題
某電商的客服模型答得出產品問題,但每則回覆的格式不同,語氣也忽正式忽隨意。若目標是讓格式固定、語氣一致,比較合適的做法是?
- (A) 只能改用 RAG 來統一格式與語氣
- (B) 把歷史回覆存進向量資料庫,語氣就會一致
- (C) 提高 top-k,多附幾段資料即可
- (D) 以微調(或結合指令設計)固定格式與語氣;RAG 主要處理知識來源
看答案與解析
答案:D
格式與語氣屬於模型的行為與輸出方式,適合微調,也可以結合指令設計。RAG 解決的是知識從哪一份文件來、回答能否附出處。
- (A) 這個目標的主軸不是更換知識來源,所以不是只能用 RAG。
- (B) 向量資料庫存放與檢索嵌入,不會把客服語氣訓練成同一種。
- (C) 提高 top-k 只是多附幾段文字,不固定回答的格式與語氣。
五、重點回顧
- 生成式模型學的是資料分佈;預訓練前要去重複、做品質過濾、移除個資與有害內容,再斷詞成 token。低品質或重複資料會放大偏誤。
- 預訓練用海量文字自監督預測下一個 token,學語言與知識;SFT 用人工撰寫的指令與回答;偏好對齊用人類偏好資料,例如 RLHF。
- 嵌入讓語意相近的內容在高維空間裡也相近;餘弦相似度只看方向,a = (1, 0)、b = (1, 1) 時為 1/√2 ≈ 0.707。向量資料庫以 ANN(例如 HNSW)用少量精確度換毫秒級速度。
- RAG 的流程是切塊、嵌入、入庫、提問嵌入、取 top-k、放入提示詞再生成並可附出處。知識經常變動、回答要有依據時用 RAG;要改行為、格式、語氣或特定任務能力時用微調。
- 切塊太大則檢索不精準並佔用上下文,太小則語意不完整,相鄰塊宜部分重疊。專有名詞與型號可再搭配 BM25 這類關鍵字檢索。幻覺要靠依據、引用、只依提供內容回答與事後查核來緩解。
- 合成資料可補稀少類別、協助保護隱私並降低標註成本,但會繼承偏誤;反覆用模型自己的產出訓練可能造成模型崩潰,仍需真實資料與人工抽查。提示注入要控管檢索來源並把權限降到最小;訓練資料或對話中的個資也可能被記住後輸出。