為什麼傳統搜尋引擎會找不到你想買的東西?
在了解 RAG 系統是怎麼尋找「小抄」之前,我們先來看看傳統的搜尋技術出了什麼問題。
假設你開了一家服飾電商網站。有一個客人今天想找一件「能讓我在下雪天保暖的外套」。 他在你的網站搜尋欄輸入:「極度禦寒衣物」。
如果你的網站使用的是傳統的搜尋引擎(也就是所謂的「關鍵字比對」),搜尋結果會是:「抱歉,找不到任何商品。」 為什麼?因為你的資料庫裡面,商品的名字叫做「特級羽絨防寒大衣」。 傳統資料庫非常死腦筋,它只認得一模一樣的「字」。因為「極度禦寒衣物」這六個字,沒有出現在「特級羽絨防寒大衣」裡面,所以它就覺得這兩件東西毫無關聯。
但在人類的腦海裡,我們知道「禦寒」跟「防寒」是同義詞,「衣物」包含「大衣」。我們憑藉的是對「語意 (Semantic)」的理解。
如果我們想讓 RAG 系統在龐大的公司文件中,精準找出可以回答問題的那個段落,我們就不能依賴傳統的關鍵字比對,我們必須讓電腦學會**「理解語意」**。 這時候,AI 界的一項神級發明誕生了:Embedding (向量化)。
什麼是 Embedding?把文字變成「座標」的魔法
Embedding 聽起來很抽象,但我們可以把它想像成是在玩一個「文字的 3D 定位遊戲」。
假設我們現在有三個詞:「蘋果」、「香蕉」、「狗」。 如果我們請一個 AI 模型來幫這三個詞做 Embedding,它會把這三個詞變成三組「數字座標」,放在一個立體的空間裡面。
- 「蘋果」的座標可能是:
[0.9, 0.1, 0.2](代表它很有水果味,有點甜) - 「香蕉」的座標可能是:
[0.8, 0.2, 0.1](也是水果,但形狀不同) - 「狗」的座標可能是:
[0.1, 0.9, 0.9](動物味很重,會叫)
這時候神奇的事情發生了!在數學空間裡,「蘋果」跟「香蕉」的座標距離非常非常近!而「狗」的座標離它們十萬八千里!
這就是 Embedding 的強大威力。它把人類複雜的「語意」,轉換成了電腦最擅長處理的「數字座標 (向量)」。 有了 Embedding,當客人搜尋「極度禦寒衣物」時,AI 會把它變成一組座標;然後拿去跟資料庫裡的「特級羽絨防寒大衣」的座標一比對,發現它們在空間中的距離超級近!於是,AI 就能成功把這件大衣推薦給客人。
這種不看字面、只看意思的搜尋技術,我們稱為「語意搜尋 (Semantic Search)」。它正是 RAG 系統的心臟!
向量資料庫 (Vector Database) 的崛起
既然我們要把公司幾千頁的文件,全部切碎並變成「幾十萬組的座標數字 (向量)」,傳統的關聯式資料庫 (例如 PostgreSQL, MySQL) 根本沒辦法快速計算這些幾何距離。
因此,市場上誕生了一種專門為 AI 時代打造的全新資料庫:向量資料庫 (Vector Database)。 最著名的向量資料庫包含:
- Chroma:輕量級、開源、可以直接安裝在本地端,是開發 RAG 測試時的首選。
- Pinecone:雲端霸主,企業級首選,速度極快但收費不便宜。
- Qdrant / Milvus:也是非常強大的開源向量資料庫。
在我們的 RAG 系統中,這些向量資料庫扮演了「超級圖書館管理員」的角色。 當你把問題變成座標丟給它時,它能在零點幾秒內,從幾百萬個段落中,找出座標距離你最近(語意最相關)的 5 個段落還給你。
Vibe Prompt 實戰:用 LangChain 呼叫 Embedding 模型
要把文字變成座標,我們需要借助語言模型(例如 OpenAI 的 text-embedding-3-small 模型)。
使用 LangChain,這只需要兩行程式碼!
【Embedding 體驗 Prompt】 我正在學習 LangChain 與 OpenAI 的 Embedding 技術。 請用 Python 寫一段簡短的範例碼:
- 使用
langchain_openai裡的OpenAIEmbeddings模型。- 將一段文字:「這是一台極速旋風電風扇」進行 Embedding (向量化)。
- 請印出這段向量結果的前 5 個數字,讓我看看「座標」長什麼樣子。
- 請附上中文註解。
AI 產出的示範碼:
import os
from langchain_openai import OpenAIEmbeddings
# 確保你有設定 OpenAI 的 API Key (在真實專案中請放在 .env)
os.environ["OPENAI_API_KEY"] = "sk-你的密碼"
def demo_embedding():
# 1. 召喚 OpenAI 的 Embedding 模型 (預設使用效能最好的 text-embedding-3-small)
embeddings_model = OpenAIEmbeddings()
text = "這是一台極速旋風電風扇"
print(f"正在將文字轉換為向量座標:'{text}'")
# 2. 執行向量化魔法!
vector = embeddings_model.embed_query(text)
# 3. 印出結果 (OpenAI 的向量通常有 1536 個數字,我們只印前 5 個看看)
print(f"轉換成功!這段文字變成了一組 {len(vector)} 維度的座標數字。")
print(f"座標的前五個數字是:{vector[:5]}")
demo_embedding()
# 終端機輸出結果:
# 正在將文字轉換為向量座標:'這是一台極速旋風電風扇'
# 轉換成功!這段文字變成了一組 1536 維度的座標數字。
# 座標的前五個數字是:[0.012, -0.045, 0.088, 0.001, -0.023]
你看!這就是 AI 眼中的世界。那句關於電風扇的中文,已經變成了一長串精確的浮點數座標。
現在我們擁有了能理解語意的魔法與裝載它們的資料庫。 但問題來了,我們公司那厚達 500 頁的 PDF 說明書,要怎麼自動餵進這套系統裡呢? 在下一章,我們將學習 LangChain 最實用的積木:Document Loaders (文件讀取器) 與 Text Splitters (文字切割器),打造一條全自動的知識庫加工生產線!