為什麼需要 RAG?
光靠大語言模型(LLM),有一個致命限制:它知道的,只是訓練時的知識,無法即時存取最新或企業內部的資料。
RAG(Retrieval-Augmented Generation)解決的就是這個問題:
Retrieval:從知識庫裡抓相關內容
Augmented:把內容丟給模型當上下文
Generation:最後由 LLM 生成更準確的答案
這讓模型不只是「說故事」,而是「帶根據地回答問題」。
RAG 系統的最小組成
從零開始,其實不需要太複雜,只要三個核心模組:
文件收集(Ingestion)
收集 PDF、Word、Excel、網站資料
轉成純文字
向量化與檢索(Embedding + Vector DB)
把文字切成段落(Chunking)
用 embedding 模型(如 OpenAI text-embedding-3-small)轉成向量
存到向量資料庫(如 FAISS、Milvus、Pinecone)
問答生成(LLM + Prompt)
使用者問題 → 檢索相似段落
把段落 + 問題丟進 LLM
回答時附帶來源,提升可信度
從零開始的步驟
Step 1:準備環境
Python 3.9+
安裝套件:
pip install openai faiss-cpu langchain
Step 2:文件切割與向量化
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
import faiss
docs = ["這是一段工廠SOP...", "另一份維修紀錄..."]
# 切割文件
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text("\n".join(docs))
# 向量化
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectors = embeddings.embed_documents(chunks)
# 建立 FAISS 向量庫
index = faiss.IndexFlatL2(len(vectors[0]))
index.add(vectors)
Step 3:檢索 + 問答
import openai
import numpy as np
query = "昨天B線停機的主要原因?"
q_vec = embeddings.embed_query(query)
# 找出前3個相關段落
D, I = index.search(np.array([q_vec]), k=3)
retrieved = [chunks[i] for i in I[0]]
# 丟進 LLM
context = "\n".join(retrieved)
prompt = f"根據以下內容回答:\n{context}\n\n問題:{query}\n答案:"
resp = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
print(resp["choices"][0]["message"]["content"])