3.1 從不同來源載入文件
知識庫的資料有各種格式,第一步是把它們都讀成乾淨的純文字,並且記得它是從哪來的。
RAG 的知識庫,資料可能散落在各種地方:PDF、Word、網頁、Markdown 筆記、資料庫。第一步要做的是載入(loading):把這些不同格式的內容讀出來,變成程式能處理的文字。
常見的資料來源
| 來源 | 載入時要注意的事 |
|---|---|
| 純文字、Markdown | 最單純,直接讀。Markdown 的標題結構之後可以拿來分塊 |
| 最常見也最麻煩。文字型 PDF 可以直接抽出文字;掃描型 PDF 是圖片,要先做 OCR | |
| Word、PowerPoint、Excel | 用對應的套件讀取,要留意表格、圖說、備註欄 |
| 網頁(HTML) | 要把導覽列、廣告、頁尾這些雜訊拿掉,只留主要內容 |
| 資料庫、API | 要決定哪些欄位組成「一份文件」,把結構化資料轉成可讀的文字 |
| 筆記、雲端文件系統 | 通常有官方 API 或匯出功能,要處理權限和更新 |
載入器
實務上不用每種格式都從頭寫。各種 RAG 框架(LangChain、LlamaIndex)和文件處理工具(例如 Unstructured)都提供現成的載入器(loader),一行就能讀進來。
一個最基本的 PDF 讀取,用 pypdf 套件大概是這樣:
from pypdf import PdfReader
reader = PdfReader("employee-handbook.pdf")
pages = [page.extract_text() for page in reader.pages]
text = "\n".join(pages)
載入之後,要不要清理
讀進來的文字通常不乾淨,清理的目標是:去掉對檢索沒有幫助的雜訊,保留對回答有用的內容。
常見要處理的雜訊:
- 每一頁重複出現的頁首、頁尾、頁碼
- 網頁的導覽列、廣告、版權宣告
- 亂碼或編碼錯誤
- 大量重複的段落
- 多餘的空白和斷行(PDF 抽出的文字常常在句子中間斷行)
要小心的是:別清過頭。例如標題、表格、清單,這些結構本身就帶有意義,如果全部壓成一長串文字,後面分塊的時候就沒辦法善用了。
載入時就要記住來源
每份文件在載入時,就應該同時記下它的來源資訊:檔名、網址、頁數、作者、更新日期。這些資訊會變成後面的 metadata(3.5),也是第 4 章能在答案旁邊標出處的基礎。
一個常見的做法是,載入後的每份文件包成這樣:
{
"text": "員工在同一公司服務滿六個月……",
"source": "employee-handbook.pdf",
"page": 12,
}
常見的坑
- 掃描檔沒做 OCR:抽出來是一片空白,卻沒有報錯。載入後要檢查每份文件的字數。
- 雙欄排版:PDF 兩欄的文字,可能被左右交錯讀成一團亂序。
- 表格被打散:表格抽出來變成一個一個的數字,失去欄位的對應關係。這類內容常常需要特別處理,甚至轉成 Markdown 表格。
- 編碼問題:繁體中文檔案要確認讀取的編碼是 UTF-8 或正確的編碼。
注意 資料準備有一句老話:垃圾進,垃圾出。載入階段讀得亂七八糟,後面的分塊、嵌入、檢索再精緻也救不回來。花時間親眼看一下讀出來的文字,是最划算的檢查。