跳到主要內容
Lab Grimoire
TW
請喝咖啡
動手實作

生成式 AI:嵌入、向量資料庫與 RAG

資料在預訓練、微調與偏好對齊的角色,嵌入與餘弦相似度、向量資料庫與近似最近鄰、RAG 流程與切塊、合成資料的風險。

作者
CY
發表
AI 的資料基礎:從統計到生成式 AI · 第 17/19 篇

本系列第 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 這類關鍵字檢索。幻覺要靠依據、引用、只依提供內容回答與事後查核來緩解。
  • 合成資料可補稀少類別、協助保護隱私並降低標註成本,但會繼承偏誤;反覆用模型自己的產出訓練可能造成模型崩潰,仍需真實資料與人工抽查。提示注入要控管檢索來源並把權限降到最小;訓練資料或對話中的個資也可能被記住後輸出。

覺得有幫助? RSS · X · 請我喝杯咖啡

箭頭把預訓練接到監督式微調,再接到偏好對齊,三個階段的目的各不相同。

生成能力沿三階段逐步對齊
1 / 3
先出現預訓練節點
預訓練學文字規律,監督式微調學按指令作答,偏好對齊讓回答符合人類偏好。
  1. 預訓練用海量文字,以自監督方式預測下一個 token,學的是語言怎麼接,以及文字裡帶有的知識。
  2. 監督式微調使用人工撰寫的指令與回答,讓模型學會按指令作答,而不是只把字接完。
  3. 偏好對齊使用人類偏好資料,例如 RLHF,讓模型偏向人比較想要的那一種。三個階段不能互相替代。

a = (1, 0) 與 b = (1, 1) 兩支箭頭的指向,以及註記上的 cos ≈ 0.707。

餘弦相似度只看向量方向
1 / 3
畫出向量 a = (1, 0)
a = (1, 0)、b = (1, 1) 的餘弦相似度為 1/√2 ≈ 0.707。
  1. 餘弦相似度把向量看成箭頭,只看方向、不看長度。|a| = √(1² + 0²) = 1。
  2. |b| = √(1² + 1²) = √2;內積 a·b = 1×1 + 0×1 = 1。
  3. cos(a, b) = 1 / (1 × √2) ≈ 0.707。兩支箭頭指向接近,所以餘弦高,但仍低於方向相同時的 1。

問題先變成嵌入,再從向量資料庫取出 top-k 片段,放進提示詞後由模型回答並附出處。

先檢索依據,再生成並附來源
1 / 5
先出現使用者的問題
問題轉成嵌入後,取回最相近的 k 段,放入提示詞供模型回答與引用。
  1. 整條流程的起點是使用者的提問。提問會轉成嵌入,才能檢索最相近的 top-k 片段。
  2. 嵌入把文字轉成高維向量,語意相近時向量也相近。沒有這一步,問題無法進資料庫比較。
  3. 向量資料庫找出和提問最相近的 top-k 片段,當作回答的依據。這一步取回的是文件片段,還不是回答。
  4. 模型只根據提示詞裡看得到的內容作答。片段沒有進去,檢索就影響不了這一次生成。
  5. 有片段可依,回答可以附上出處,也有助於降低幻覺。幻覺是指看似合理但不正確的內容。

四個節點從夾帶指令走到偏離任務,再連到外洩或越權,終點是權限控管。

檢索文件也可能帶入惡意指令
1 / 4
外部文件夾帶指令
外部文件的隱藏指令可能誘使模型越權;控管來源與最小權限可限制風險。
  1. RAG 會把檢索片段放進提示詞,文件裡藏的指令因此一起進入模型。
  2. 藏在文件裡的指令會誘使模型去做另一件事,而不是使用者要它做的任務。
  3. 任務被帶偏之後,模型可能輸出不該給的內容,或依文件裡的指令越權。個資若被記住,也可能在回答裡被輸出。
  4. 檢索來源要控管,權限採最小化;訓練資料進模型前也要先移除個資。