iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
生成式 AI

從上下文工程到 Agent:30 天生成式 AI 與 LLM 學習紀錄系列 第 24

[Day24] 打造你自己的檢索增強生成(RAG)系統!(二)

  • 分享至 

  • xImage
  •  

昨天簡單介紹了 RAG 是甚麼,可以用來做什麼之後,接下來今天就用一個完整範例,來實作出屬於你的 RAG 系統!

RAG 實作範例

以下範例示範如何使用 LangChain + OpenAI API,打造一個能讀取 PDF 並回答問題的 RAG(檢索增強生成)系統。

安裝必要套件

首先請先執行以下指令,安裝所有需要的模組:

pip install -U langchain-core langchain-community langchain-openai langchain-chroma sentence-transformers pymupdf chromadb tiktoken

設定 OpenAI API Key

import os
os.environ["OPENAI_API_KEY"] = "你的 OpenAI 金鑰"

載入與分割 PDF 文件

這樣可以把一整份 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)

建立向量資料庫(Chroma)

這步會把每個段落轉換成向量,存入本地資料夾 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
)

初始化 OpenAI LLM

temperature 決定生成的隨機性,0.0 越接近固定答案,1.0 越有創意。

from langchain_openai import ChatOpenAI

# 使用 GPT 模型
llm = ChatOpenAI(
    model="gpt-5",
    temperature=0.3
)

建立檢索問答鏈(RetrievalQA)

透過 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 文章創作。

上一篇
[Day23] 打造你自己的檢索增強生成(RAG)系統!(一)
系列文
從上下文工程到 Agent:30 天生成式 AI 與 LLM 學習紀錄24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言