Member-only story
做一個務實的RAG (Pragmatic RAG)
不要跟我五四三,回點有用的話來

這篇文章是專門為了繁體中文的 RAG 寫的。
你有覺得聊天機器人一直在打高空嗎?
你有覺得聊天機器人總是瞎掰胡謅嗎?
你有覺得聊天機器人經常答非所問嗎?
如果你使用的 prompt 已經很精準了,卻還常有上述感受,那很有可能你實作的 RAG 出了根本上的問題。
要讓 RAG 務實有以下幾個重點:
- 必須是要懂繁體中文的 embedding
- 要有中文語意的分片器
- 一定要是用繁體中文訓練的 LLM
- 精準的 prompt 連同 system instruction
- 沒做 rerank 的效果都差到不行,但 rerank 要懂繁體中文
能夠做到上述五點,那麼你就可以得到一個穩重且有參考價值的 RAG。
核心概覽
以下我會提供一個使用 langchain 實作的繁體中文萬用套餐,最重要的是:本地運行,完全免費。
既免費又萬用的核心元素是下列:
- 懂中文的 embedding:BGE-M3
- 中文語意的分片器:RecursiveCharacterTextSplitter
- 繁體中文訓練的 LLM:TAIDE
- 懂繁體中文的 rerank:ms-marco-MultiBERT-L-12
上述都是免費的,搭配本地運行的框架:
就可以實作我們要的務實 RAG。
具體實踐
把 Ollama 裝好,有 Python 後就開始吧。
以下我會用一個 Confluence 的爬蟲做示範,但整個腳本可以套用在任何繁體中文的資料源。
# Langchain 的核心套件
pip install langchain langchain-community langchain-core langchain-huggingface
# Confluence 爬蟲需要的套件 (根據資料源可替換)
pip install atlassian-python-api lxml pytesseract docx2txt
# Rerank 用
pip install flashrank
# 向量存儲
pip install faiss-cpu
Python 套件都安裝完成後的第一步,我們要先準備給 RAG 使用的資料源,以本例來說是 Confluence。
from langchain_community.document_loaders import ConfluenceLoader
CONFLUENCE_TOKEN = '<your token>'
USER = '<your account>'
ROOT_URL = '<your domain>'
SPACE_KEY = '<your space>'
PAGE_ID = '<your page>'
loader = ConfluenceLoader(
url=ROOT_URL, username=USER, api_key=CONFLUENCE_TOKEN
)
documents = loader.load(space_key=SPACE_KEY,
page_id=PAGE_ID, include_attachments=True, limit=50)
到此,Confluence 的資料就全部抓下來並存進 documents
了。
若你要處理的是別的資料源,就直接從這裡往下,重點是所有資料要放進 documents
。接著我們要來做分段,許多英文的教學會使用 token 來做分段,但中文與 token 並沒有很好的對應,效果會非常差。因此,我們依然採用標點符號的分段方式,並且讓上下兩片段是有重疊的。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter =…