昨天簡單介紹了 RAG 是甚麼,可以用來做什麼之後,接下來今天就用一個完整範例,來實作出屬於你的 RAG 系統!
以下範例示範如何使用 LangChain + OpenAI API,打造一個能讀取 PDF 並回答問題的 RAG(檢索增強生成)系統。
首先請先執行以下指令,安裝所有需要的模組:
pip install -U langchain-core langchain-community langchain-openai langchain-chroma sentence-transformers pymupdf chromadb tiktoken
import os
os.environ["OPENAI_API_KEY"] = "你的 OpenAI 金鑰"
這樣可以把一整份 PDF 拆成許多小段(chunk),確保後續 Embedding 不會超長,chunk_overlap 用於保持段落之間的語意連貫性。
from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 載入 PDF 文件
loader = PyMuPDFLoader("iThomeIronmanGuide-2025.pdf")
PDF_data = loader.load()
# 切割文字段落
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
all_splits = text_splitter.split_documents(PDF_data)
這步會把每個段落轉換成向量,存入本地資料夾 db,之後可以快速檢索最相關的段落。
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_chroma import Chroma
# 使用 Hugging Face 向量模型(可離線運行)
embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
# 建立向量資料庫
persist_directory = "db"
vectordb = Chroma.from_documents(
documents=all_splits,
embedding=embedding,
persist_directory=persist_directory
)
temperature 決定生成的隨機性,0.0 越接近固定答案,1.0 越有創意。
from langchain_openai import ChatOpenAI
# 使用 GPT 模型
llm = ChatOpenAI(
model="gpt-5",
temperature=0.3
)
透過 RetrievalQA,讓模型可以根據檢索結果回答問題,這就是完整的 RAG(檢索增強生成)流程。
from langchain.chains import RetrievalQA
# 建立檢索器
retriever = vectordb.as_retriever(search_kwargs={"k": 3})
# 建立問答鏈(RAG Pipeline)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 將檢索到的文本直接塞進 prompt
retriever=retriever,
verbose=True
)
最後我們對模型提出問題,模型會根據向量資料庫中最相關的段落,生成回答:
query = "鐵人賽的活動宗旨是甚麼?"
result = qa.invoke({"query": query})
print("\n問題:", query)
print("回答:", result["result"])
問題: 鐵人賽的活動宗旨是甚麼?
回答: 鼓勵 IT 人分享技術心得、促進學習與交流,振興繁體中文 IT 文章創作。