【從一台 Server 到分散式架構】第 23 篇:網站加入 AI 助手——LLM、RAG 與向量庫

有一天,產品經理小雯帶著一個新功能提案:

「我們要加一個 AI 學習助理。用戶看課的時候,如果有問題可以直接問 AI,AI 會根據課程內容回答。不只是通用的 ChatGPT,是真的懂我們課程的 AI。」

小明第一個反應是:「那我們直接接 OpenAI API,不就好了?」

小傑搖頭:「直接接 LLM,它只知道訓練資料裡的知識,不知道我們課程的內容。你問它『第三章的練習題怎麼解』,它要嘛亂猜,要嘛說不知道。」

「那怎麼讓它知道我們的課程內容?」

小傑:「這就是 RAG 要解決的問題。」


生活化的比喻:博學的新人 vs 有課程手冊的顧問

想像你請了一個很聰明的新顧問(LLM),他讀過世界上幾乎所有的書,知識很廣博。

但他不知道你公司的課程怎麼設計的、你的教學方法是什麼、你的第三章習題答案是什麼。

有兩個解法:

解法 A:讓他把所有課程手冊背起來(Fine-tuning)——成本高,每次課程更新都要重新訓練,費時費錢。

解法 B:給他一個隨身的搜尋工具,每次用戶問問題時,先去課程手冊裡找相關段落,再把這些段落和問題一起交給他,讓他根據「找到的資料」來回答(RAG)——即時、便宜、課程更新後馬上生效。

這就是 **RAG(Retrieval-Augmented Generation,檢索增強生成)**的核心概念。


LLM 是什麼,為什麼直接用不夠

**LLM(Large Language Model,大型語言模型)**是一種 AI 模型,透過大量文字訓練,能夠理解和生成自然語言。GPT-4、Claude、Gemini 都是 LLM。

LLM 的能力:

  • 理解問題的語意
  • 歸納、推理、解釋
  • 根據提供的資訊生成文字

LLM 的限制:

  • 訓練截止日期:不知道訓練資料截止後的事情
  • 不知道私有資料:不知道你公司的課程內容、內部文件
  • 有時會「幻覺」(hallucination):不確定時可能編造看起來合理的答案

所以,要讓 LLM 能夠根據你的課程內容回答問題,必須在每次呼叫時,把相關的課程內容「塞給它看」。


RAG 的流程:先查,再答

RAG 的完整流程分兩階段:

離線階段:建立知識索引

課程文字內容
→ 切成小段(Chunking)
→ 每段轉成向量(Embedding)
→ 存入向量資料庫

線上階段:收到問題時即時查詢

用戶問題
→ 把問題也轉成向量
→ 去向量資料庫找「最相似的幾段課程內容」
→ 把找到的內容 + 用戶問題一起組成 Prompt
→ 傳給 LLM 生成回答
→ 回傳給用戶

向量和向量資料庫:用「距離」找相似

「向量(Embedding)」可能是這篇最陌生的概念。讓小明解釋一下:

Embedding 是把一段文字轉換成一個高維度的數字陣列(例如 1536 個浮點數)。

神奇的是:語意相似的文字,轉出來的向量在空間裡距離很近

舉例:

  • 「Python 如何做迴圈」和「Python for loop 怎麼寫」→ 向量距離很近
  • 「Python 如何做迴圈」和「如何做一道番茄炒蛋」→ 向量距離很遠

所以「找相似的課程內容」,就變成了「找向量空間裡距離最近的段落」,這個操作叫向量相似度搜尋

向量資料庫(Pinecone、Qdrant、Weaviate)就是專門為這種「找最近的向量」操作優化的資料庫。

也可以直接用 PostgreSQL 的 pgvector 擴充,如果你不想引入新的資料庫系統。


不是每個問題都需要 RAG

RAG 解決的是「讓 LLM 能夠根據特定知識庫回答問題」的問題。

不是所有 AI 功能都需要 RAG:

功能需要 RAG 嗎?
通用問答(解釋什麼是遞迴)不需要,LLM 本身知道
根據特定課程內容回答需要
程式碼解釋通常不需要
根據學生作答給出批改意見需要(要帶入評分標準)
生成課程摘要需要(要帶入課程原文)

小明的落地版本

第一版:最小可行的 AI 助理

1. 用 LangChain 或 LlamaIndex 快速搭 RAG 管道
2. 課程文字內容先用 OpenAI Embedding 轉成向量
3. 向量存在 pgvector(已有 PostgreSQL,不引入新系統)
4. 用戶提問 → 找 Top-5 相關段落 → 組 Prompt → 呼叫 GPT-4o

暫不做的:
- Fine-tuning(成本高,課程更新麻煩)
- 自架 LLM(技術複雜度高,先用 API)
- 多輪對話記憶(第一版先做單輪)

小結與預告

這篇小明學到的重點是:

  1. LLM 不知道私有資料:直接接 API 只有通用知識,問課程內容會亂答。
  2. RAG 的核心思路:先查再答——找到相關段落,再讓 LLM 根據那些段落回答。
  3. Embedding 的直覺:把文字轉成向量,語意相似的文字向量距離近;向量資料庫就是「找最近的向量」的專用工具。
  4. 不是所有 AI 功能都需要 RAG:LLM 本身的知識能回答的問題,不需要多此一舉。

AI 助理上線了,用戶很喜歡。但用戶多了之後,一個新問題出現:LLM 的回應不像一般 API,它是「一個字一個字慢慢吐出來」的——如果等整段回答生成完才回傳,用戶要等很久;而且 LLM 的推理很耗 GPU,要怎麼擴展?

下一篇,我們來談 AI 系統的架構:串流回應、推理服務與擴展策略

相關推薦

2026-04-07
【從一台 Server 到分散式架構】第 31 篇:從面試題反推架構——用本系列思維拆解系統設計考題
「設計一個 URL 短網址服務」「設計一個訊息系統」——系統設計面試問的不是背答案,而是思考方式。這篇整理了一套可以重複使用的面試框架,並用兩道例題示範如何從需求出發,一步步推導出架構、說清楚取捨。
2026-04-06
【從一台 Server 到分散式架構】第 30 篇:限流、排隊與降級實戰——開賣與直播場景
平常流量是 1000 QPS,但「開賣」的那一刻,瞬間湧入 50 萬個請求——系統要怎麼活下來?這篇用課程平台的限量課程開賣和直播開播場景,把第 13 篇學到的限流、降級、熔斷,落地到一個真實的高流量設計,走過每個防護層是怎麼工作的。
2026-04-05
【從一台 Server 到分散式架構】第 29 篇:用同樣的思維看 ChatGPT——AI 聊天系統架構
ChatGPT 看起來像一個聊天視窗,背後卻有幾個特殊的設計挑戰:回應是串流的、推理非常耗資源、每輪對話要記住上下文、系統要支援幾千萬用戶同時使用。這篇用熟悉的架構思維,拆解 AI 聊天系統的關鍵設計。
2026-04-04
【從一台 Server 到分散式架構】第 28 篇:用同樣的思維看 Twitter——社群動態與時序設計
Twitter 的核心功能看起來很簡單:發推文、看動態、按讚留言。但「動態牆」背後藏著一個棘手的設計問題:你追蹤 200 個人,每個人都可能隨時發文——你打開 App 時,那條時序動態要怎麼快速組出來?這篇來看社群動態系統的兩種策略:推(Fan-out on Write)與拉(Fan-out on Read)。