OpenClaw Skills #1|RAG Architecture:讓 LLM 擁有長期記憶的關鍵架構
一、開場破題
大型語言模型(LLM)天生有一個致命弱點:知識截止日期。GPT-4 的訓練資料截止於某個時間點,之後發生的事它一概不知。更麻煩的是,就算是截止日前的知識,模型也可能「記錯」或「幻覺」出不存在的資訊。
RAG(Retrieval-Augmented Generation,檢索增強生成) 正是為了解決這個問題而生。它讓 LLM 在回答問題之前,先從外部知識庫「查資料」,再根據查到的內容生成回答。這個設計讓 AI 系統能夠:
- 存取即時、最新的資訊
- 引用具體來源,降低幻覺率
- 在不重新訓練模型的情況下更新知識
在企業 AI 應用中,RAG 已成為最主流的架構模式,從客服機器人到內部知識庫問答,幾乎無所不在。
---
二、概念精講
RAG 的核心流程分為兩個階段:索引階段(Indexing) 與 查詢階段(Querying)。
索引階段(離線預處理)
原始文件(PDF / 網頁 / 資料庫)
↓
文件切割(Chunking)
↓
向量嵌入(Embedding)
↓
存入向量資料庫(Vector DB)
查詢階段(即時推論)
使用者提問(User Query)
↓
問題向量化(Query Embedding)
↓
相似度搜尋(Vector Search)
↓
取回相關文件片段(Retrieve Chunks)
↓
組合 Prompt(Augment)
↓
LLM 生成回答(Generation)
↓
回傳給使用者(Response)
關鍵元件說明
| 元件 | 功能 | 常見工具 |
|---|---|---|
| Embedding Model | 將文字轉為向量 | text-embedding-3-small, BGE |
| Vector Database | 儲存並搜尋向量 | Pinecone, Chroma, Qdrant |
| Retriever | 執行相似度搜尋 | LangChain Retriever |
| LLM | 根據 context 生成回答 | GPT-4o, Claude 3.5 |
| Chunker | 切割文件為適當片段 | RecursiveCharacterTextSplitter |
---
三、實戰場景
場景一:企業內部知識庫問答
一家公司有上千份 PDF 規章制度,員工每天要花大量時間翻找。導入 RAG 後,員工直接用自然語言提問「請假超過三天需要哪些審核?」,系統自動從文件庫中找到相關條文並生成精確回答,附上原始文件來源連結。
場景二:即時新聞分析機器人
傳統 LLM 無法回答「今天台積電股價發生了什麼?」,但搭配 RAG 後,系統每小時爬取最新新聞存入向量庫,讓 LLM 能基於最新資料給出分析,準確率大幅提升。
場景三:程式碼文件助手
開發者將自家 SDK 文件(Markdown、API spec)整合進向量庫,打造專屬程式碼助手。與通用 LLM 相比,這類系統對私有 API 的回答準確率從 40% 提升到 85% 以上。
---
四、關鍵步驟
以 LangChain + OpenAI + Chroma 為例,快速建立一個基礎 RAG 系統:
Step 1:安裝依賴
bash
pip install langchain langchain-openai chromadb pypdf
Step 2:載入並切割文件
python
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("knowledge_base.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_documents(docs)
Step 3:建立向量索引
python
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(chunks, embeddings)
retriever = vectordb.as_retriever(search_kwargs={"k": 4})
Step 4:建立 RAG Chain
python
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-4o-mini")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
result = qa_chain.invoke({"query": "你的問題"})
print(result["result"])
---
五、常見誤區
誤區一:Chunk Size 設太大或太小
很多開發者直接用預設值,導致檢索結果雜訊過多(chunk 太大)或語意不完整(chunk 太小)。建議根據文件類型測試:技術文檔用 500–800 tokens,對話記錄用 200–300 tokens。
誤區二:忽略 Embedding 模型的語言適配
用英文 Embedding 模型處理中文文件,相似度搜尋效果大打折扣。中文場景建議使用多語言模型,如
text-embedding-3-large 或 BGE 系列。誤區三:只做向量搜尋,忽略關鍵字搜尋
純向量搜尋對精確名詞(如「JoJoRadar」、「GPT-4o」)的召回率反而不如關鍵字搜尋。最佳實踐是 Hybrid Search:向量搜尋 + BM25 關鍵字搜尋,再用 RRF(Reciprocal Rank Fusion)合併結果。
誤區四:沒有做 Re-ranking
從向量庫取回 10 個片段後,直接全部塞給 LLM 會稀釋重要資訊。建議加入 Cross-Encoder Re-ranker(如 Cohere Rerank),先對候選片段做精排,只傳最相關的 3–4 個給 LLM。
---
六、延伸學習
掌握基礎 RAG 後,可進一步探索以下進階方向:
- Advanced RAG:加入 Query Rewriting、HyDE(Hypothetical Document Embeddings)、Parent-Child Chunking 等技術提升召回率
- Agentic RAG:讓 LLM 自主決定何時需要檢索、檢索什麼,與 Tool Use 結合
- Multi-modal RAG:不只檢索文字,還能檢索圖片、表格(使用 ColPali 等模型)
- GraphRAG:Microsoft 提出的以知識圖譜為基礎的 RAG 架構,適合複雜推理場景
- Evaluation:使用 RAGAS 框架評估系統的 Faithfulness、Answer Relevancy、Context Recall 等指標
---
Reference