deaw.ai

大家都想要一個能從自己的文件回答問題的聊天機器人——公司手冊、一份合約、一篇研究論文。這種技術稱為 RAG(Retrieval-Augmented Generation,檢索增強生成)

我以建置生產級 RAG 與 LLM 系統為生,每次專案都在重複搭建同樣的基礎架構。因此我將它整理成一個小型的開源起步模板。這篇文章將帶你了解 RAG 的實際運作方式、重要的設計決策,以及如何免費執行整個系統——完全不需要 API 金鑰。

文末附有完整開源儲存庫連結,你只需幾分鐘即可克隆並執行。

為什麼需要 RAG?

像 GPT 或 Claude 這類 LLM 只知道它們被訓練過的內容。若詢問筆電裡的一份文件,它只能猜測——或者產生幻覺。

RAG 用一個簡單的概念解決這個問題:先檢索相關資訊,再讓 LLM 僅依據這些資訊回答。 結果是答案會基於你的實際文件,並附上可追溯到特定頁面的引用。

流程:兩條路徑

路徑 1 — 索引(文件進入系統時):

  1. 從 PDF 擷取文字
  2. 將文字切成帶重疊的區塊
  3. 將每個區塊轉換為能捕捉語意的向量(embedding)
  4. 將這些向量存入向量資料庫

路徑 2 — 查詢(使用者提問時):

  1. 用相同的模型將問題轉換為 embedding
  2. 在向量資料庫中搜尋最相似的區塊
  3. 將這些區塊與問題一起送給 LLM
  4. 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 或剛入門,我很樂意收到你的回饋——特別是在區塊切割與檢索策略方面,我仍在持續調整。歡迎在留言區分享你的經驗。