一、什麼是 RAG?
RAG 結合兩個階段:
- 檢索(Retrieval): 從外部知識庫檢索與提問語意相近的資料。
- 生成(Generation): 將檢索到的內容當作 context,一併輸入 LLM 中生成回答。
二、所需工具與套件
# requirements.txt
openai
dotenv
faiss-cpu # 本機向量資料庫
tiktoken # Token 長度估算
三、系統流程與架構
User Question ─▶ Text Embedding ─▶ 向量比對 (FAISS)
▼
找到最相似的文本(context)
▼
context + question 一起送入 LLM 生成回答
四、步驟與完整範例程式碼
步驟 1:準備資料
# === 1. 輸入原始資料(可視為知識庫文件)===步驟 2:初始化嵌入與向量資料庫(使用 OpenAI Embedding + FAISS)
# 每一筆文字將轉換為向量並存入向量資料庫
documents = [
"Python 是一種廣泛使用的高階程式語言。",
"FastAPI 是用於建立 API 的 Python 框架。",
"向量資料庫可用於語意檢索。",
]
import openai
import faiss
import numpy as np
# 設定 OpenAI API 金鑰,用於呼叫嵌入與 Chat API
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
# === 2. 定義取得文字向量的函式 ===
def get_embedding(text: str) -> list[float]:
res = openai.embeddings.create(
input=text,
model="text-embedding-3-small"
)
return res.data[0].embedding # 取得第一筆(唯一一筆)嵌入結果
# === 3. 建立向量索引 ===
# text-embedding-3-small 輸出的向量維度為 1536
dimension = 1536
index = faiss.IndexFlatL2(dimension)# 建立 L2 距離計算的索引器(平坦向量索引)
# 儲存原始文本與對應向量,用於日後查詢時對應
texts = []
vectors = []
# 將所有文件轉為向量並加入向量資料庫
for doc in documents:
vec = get_embedding(doc) # 將文字轉為向量
index.add(np.array([vec]).astype("float32")) # 加入向量到索引(FAISS 要 float32)
vectors.append(vec)
texts.append(doc) # 保留原始文本對應
步驟 3:查詢使用者問題,並找出最相近的內容
# === 4. 查詢最相似的內容 ===
def search_similar_context(query: str, k: int = 1):
query_vec = get_embedding(query) # 將提問轉為向量
D, I = index.search(np.array([query_vec]).astype("float32"), k) # 搜尋向量資料庫
results = [texts[i] for i in I[0]] # 根據找到的索引值抓出原始文字
return results
步驟 4:RAG 問答生成
# === 5. RAG 問答函式 ===
def rag_answer(query: str):
"""
將查詢語句轉為向量,搜尋最相似內容,將內容 + 問題
一起送入 GPT 模型,讓它產生回答。
"""
context = search_similar_context(query, k=2) # 找出前 2 筆最相近的內容
# 組合 Prompt,將內容作為背景知識,附帶問題
prompt = f"""
根據以下內容回答問題:
內容:
{chr(10).join(context)}
問題:
{query}
""".strip()
# 呼叫 ChatGPT API 模型,使用 GPT 3.5 Turbo 或 GPT-4.1 Nano
res = openai.ChatCompletion.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": prompt}]
)
# 回傳生成的回答內容
return res.choices[0].message.content.strip()
測試
# === 6. 測試區段 ===
if __name__ == "__main__":
query = "請問 FastAPI 是什麼?" # 使用者提問
answer = rag_answer(query) # 呼叫 RAG 問答流程
print("回答:", answer) # 輸出最終回答
小提示與進階技巧

資料切片建議(長文處理)
def split_text(text, chunk_size=300, overlap=50):
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunks.append(text[i:i+chunk_size])
return chunks
簡易版 README.md
# RAG + 向量資料庫範例
## 功能
- 使用 OpenAI Embedding 建立文件向量索引
- 用 FAISS 檢索語意相近內容
- 搭配 GPT 生成回答
## 執行方式
1. 建立 `.env` 或替換程式內的 `openai.api_key`
2. 執行 `python main.py`
回答: FastAPI 是用於建立 API 的 Python 框架。
📘 說明總結
- get_embedding:將文字轉換為向量,用於搜尋或建索引
- faiss.Index:儲存所有向量,用於快速相似度查詢
- search_similar_context:給定提問文字,找出最相似的文件內容
- rag_answer:使用語意相似內容 + 問題,送入 GPT 產生最終回答
main
測試區塊:示範一次查詢流程(模擬 RAG 問答)
此篇簡單的應用RAG檢索增強生成,使用了faiss本地端向量資料庫來建立簡易的問答系統,下一篇來進階一點,使用雲端的向量資料庫來建立問答系統,也包含了把文件切片了上傳功能。