大家都想要一個能從自己的文件回答問題的聊天機器人——公司手冊、一份合約、一篇研究論文。這種技術稱為 RAG(Retrieval-Augmented Generation,檢索增強生成)。
我以建置生產級 RAG 與 LLM 系統為生,每次專案都在重複搭建同樣的基礎架構。因此我將它整理成一個小型的開源起步模板。這篇文章將帶你了解 RAG 的實際運作方式、重要的設計決策,以及如何免費執行整個系統——完全不需要 API 金鑰。
文末附有完整開源儲存庫連結,你只需幾分鐘即可克隆並執行。
為什麼需要 RAG?
像 GPT 或 Claude 這類 LLM 只知道它們被訓練過的內容。若詢問筆電裡的一份文件,它只能猜測——或者產生幻覺。
RAG 用一個簡單的概念解決這個問題:先檢索相關資訊,再讓 LLM 僅依據這些資訊回答。 結果是答案會基於你的實際文件,並附上可追溯到特定頁面的引用。
流程:兩條路徑
路徑 1 — 索引(文件進入系統時):
- 從 PDF 擷取文字
- 將文字切成帶重疊的區塊
- 將每個區塊轉換為能捕捉語意的向量(embedding)
- 將這些向量存入向量資料庫
路徑 2 — 查詢(使用者提問時):
- 用相同的模型將問題轉換為 embedding
- 在向量資料庫中搜尋最相似的區塊
- 將這些區塊與問題一起送給 LLM
- LLM 依據這些上下文回答,我們同時回傳來源頁面
選擇技術堆疊
經過多次實作後,以下是一個容易上手且能在生產環境中穩定的堆疊:
- FastAPI — 撰寫快速,API 清晰且支援非同步
- ChromaDB — 輕量級向量資料庫,可內嵌執行,無需管理獨立伺服器
- SentenceTransformers — 免費的 embedding 模型,支援多語系
- 任何 LLM — OpenAI、Claude、Gemini,或本地端的 Ollama
一個常被忽略的細節:你可以在完全不需要 API 金鑰的情況下測試整個流程——可以使用僅回傳匹配區塊的檢索模式,或用 Ollama 完全在本機執行,讓資料完全不離開你的電腦。
檢索步驟的核心
以下大致是查詢端的程式碼:對問題做 embedding、搜尋、將區塊交給 LLM:
def answer_question(question: str, top_k: int = 3):
# 1. Embed the question with the same model used at indexing time
query_embedding = embed(question)
# 2. Retrieve the most similar chunks from the vector store
chunks = vector_store.search(query_embedding, top_k=top_k)
# 3. Build a prompt grounded in those chunks, then ask the LLM
context = "\n\n".join(c["text"] for c in chunks)
answer = llm.generate(question=question, context=context)
return answer, chunks # chunks double as citations
Enter fullscreen mode Exit fullscreen mode
關鍵限制:問題與文件必須使用相同的 embedding 模型。 不同模型產生的向量無法直接比較,這是相當常見的錯誤。
影響品質的關鍵細節
根據經驗,一個 RAG 系統是否能給出好的回答,取決於幾個容易被低估的因素:
- 區塊大小。 太大會讓不相干的內容混在一起;太小則會失去上下文。區塊之間的重疊有助於避免句子在中途被切斷。
- 掃描式 PDF。 如果檔案是影像檔,一般文字擷取會回傳空值。此時需要 OCR 作為備案,否則這些頁面會被靜默索引為空白。
- 重排序(Re-ranking)。 純向量搜尋快速但粗略。加入 cross-encoder 重排序器,同時讀取問題與每個區塊,能明顯改善送給模型的區塊品質。
免費開源,立即試用
我已將以上內容整理成一個 MIT 開源的起步模板。只要 clone 後執行一條 Docker 指令,就能擁有具來源引用的文件問答聊天機器人。它支援多語系,且無需 API 金鑰即可免費執行。
👉 GitHub: https://github.com/panutpl/rag-chatbot-template-starter
git clone https://github.com/panutpl/rag-chatbot-template-starter
cd rag-chatbot-template-starter
cp .env.example .env
docker compose up --build
Enter fullscreen mode Exit fullscreen mode
接著開啟 http://localhost:8000/docs,上傳 PDF 後即可開始提問。
如果你正在建置 RAG 或剛入門,我很樂意收到你的回饋——特別是在區塊切割與檢索策略方面,我仍在持續調整。歡迎在留言區分享你的經驗。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.