學習LLM大語言模型之路(八) - RAG檢索增強生成-使用向量資料庫(Vector Database)

更新於 發佈於 閱讀時間約 9 分鐘

一、什麼是 RAG?

RAG 結合兩個階段:

  1. 檢索(Retrieval): 從外部知識庫檢索與提問語意相近的資料。
  2. 生成(Generation): 將檢索到的內容當作 context,一併輸入 LLM 中生成回答。

二、所需工具與套件

# requirements.txt
openai
dotenv
faiss-cpu # 本機向量資料庫
tiktoken # Token 長度估算

三、系統流程與架構

User Question ─▶ Text Embedding ─▶ 向量比對 (FAISS)

找到最相似的文本(context)

context + question 一起送入 LLM 生成回答

四、步驟與完整範例程式碼

步驟 1:準備資料

# === 1. 輸入原始資料(可視為知識庫文件)===
# 每一筆文字將轉換為向量並存入向量資料庫
documents = [
"Python 是一種廣泛使用的高階程式語言。",
"FastAPI 是用於建立 API 的 Python 框架。",
"向量資料庫可用於語意檢索。",
]

步驟 2:初始化嵌入與向量資料庫(使用 OpenAI Embedding + FAISS)

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)          # 輸出最終回答

小提示與進階技巧

raw-image

資料切片建議(長文處理)

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本地端向量資料庫來建立簡易的問答系統,下一篇來進階一點,使用雲端的向量資料庫來建立問答系統,也包含了把文件切片了上傳功能。


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
20會員
49內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/06/21
Pydantic :資料驗證的超強幫手 Pydantic 是 Python 中強型別資料驗證與處理的標準工具,特別適合用於 API 的請求 / 回應資料結構驗證。
Thumbnail
2025/06/21
Pydantic :資料驗證的超強幫手 Pydantic 是 Python 中強型別資料驗證與處理的標準工具,特別適合用於 API 的請求 / 回應資料結構驗證。
Thumbnail
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
這篇文章討論了自然語言處理技術的發展歷程,從語言模型的引入到深度學習的應用。作者觀察到現今GPT在產出中文國學內容時的深度不足,並提出了自然語言處理領域的倫理使用和版權問題,以及對大眾的影響。最後,作者探討了個人在自然語言領域的發展可能性。
Thumbnail
語言模型與文字表示以不同的方式來分析自然語言的詞語分佈及語意關係。本文章簡要介紹了語言模型、Word2vec、FastText、GloVe和Transformer等技術,並提供了實際的應用參考點,幫助讀者深入理解自然語言處理的技術。
Thumbnail
語言模型與文字表示以不同的方式來分析自然語言的詞語分佈及語意關係。本文章簡要介紹了語言模型、Word2vec、FastText、GloVe和Transformer等技術,並提供了實際的應用參考點,幫助讀者深入理解自然語言處理的技術。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」,然而,它們並非真正理解語言。除了在上篇介紹的技巧可以協助我們在使用 LLM 時給予指示之外,今天我們會介紹使用 LLM 的框架。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」,然而,它們並非真正理解語言。除了在上篇介紹的技巧可以協助我們在使用 LLM 時給予指示之外,今天我們會介紹使用 LLM 的框架。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」。 Prompt Pattern 是給予LLM的指示,並確保生成的輸出擁有特定的品質(和數量)。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」。 Prompt Pattern 是給予LLM的指示,並確保生成的輸出擁有特定的品質(和數量)。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News