iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
生成式 AI

AI Development系列 第 9

Day 9|從零開始搭建一個 RAG 系統

  • 分享至 

  • xImage
  •  

為什麼需要 RAG?
光靠大語言模型(LLM),有一個致命限制:它知道的,只是訓練時的知識,無法即時存取最新或企業內部的資料。

RAG(Retrieval-Augmented Generation)解決的就是這個問題:
Retrieval:從知識庫裡抓相關內容
Augmented:把內容丟給模型當上下文
Generation:最後由 LLM 生成更準確的答案

這讓模型不只是「說故事」,而是「帶根據地回答問題」。

RAG 系統的最小組成
從零開始,其實不需要太複雜,只要三個核心模組:

  1. 文件收集(Ingestion)
    收集 PDF、Word、Excel、網站資料
    轉成純文字

  2. 向量化與檢索(Embedding + Vector DB)
    把文字切成段落(Chunking)
    用 embedding 模型(如 OpenAI text-embedding-3-small)轉成向量
    存到向量資料庫(如 FAISS、Milvus、Pinecone)

  3. 問答生成(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"])

上一篇
Day 8|Prompt Engineering 作為軟體開發的一環
下一篇
Day 10|向量資料庫選型:FAISS vs Milvus vs Pinecone
系列文
AI Development10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言