Member-only story

做一個務實的RAG (Pragmatic RAG)

不要跟我五四三,回點有用的話來

Chunting Wu
9 min readAug 19, 2024
My girl

這篇文章是專門為了繁體中文的 RAG 寫的。

你有覺得聊天機器人一直在打高空嗎?
你有覺得聊天機器人總是瞎掰胡謅嗎?
你有覺得聊天機器人經常答非所問嗎?

如果你使用的 prompt 已經很精準了,卻還常有上述感受,那很有可能你實作的 RAG 出了根本上的問題。

要讓 RAG 務實有以下幾個重點:

  1. 必須是要懂繁體中文的 embedding
  2. 要有中文語意的分片器
  3. 一定要是用繁體中文訓練的 LLM
  4. 精準的 prompt 連同 system instruction
  5. 沒做 rerank 的效果都差到不行,但 rerank 要懂繁體中文

能夠做到上述五點,那麼你就可以得到一個穩重且有參考價值的 RAG。

核心概覽

以下我會提供一個使用 langchain 實作的繁體中文萬用套餐,最重要的是:本地運行,完全免費。

既免費又萬用的核心元素是下列:

  1. 懂中文的 embedding:BGE-M3
  2. 中文語意的分片器:RecursiveCharacterTextSplitter
  3. 繁體中文訓練的 LLM:TAIDE
  4. 懂繁體中文的 rerank:ms-marco-MultiBERT-L-12

上述都是免費的,搭配本地運行的框架:

  1. Ollama
  2. Langchain

就可以實作我們要的務實 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 =…

--

--

Chunting Wu
Chunting Wu

Written by Chunting Wu

Architect at SHOPLINE. Experienced in system design, backend development, and data engineering.

No responses yet

Write a response