EN

3.1 從不同來源載入文件

知識庫的資料有各種格式,第一步是把它們都讀成乾淨的純文字,並且記得它是從哪來的。

RAG下一篇 →

RAG 的知識庫,資料可能散落在各種地方:PDF、Word、網頁、Markdown 筆記、資料庫。第一步要做的是載入(loading):把這些不同格式的內容讀出來,變成程式能處理的文字。

資料準備的完整流程:載入、清理、分塊、加 metadata、轉成向量、存入向量庫

常見的資料來源

來源 載入時要注意的事
純文字、Markdown 最單純,直接讀。Markdown 的標題結構之後可以拿來分塊
PDF 最常見也最麻煩。文字型 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 或正確的編碼。

注意 資料準備有一句老話:垃圾進,垃圾出。載入階段讀得亂七八糟,後面的分塊、嵌入、檢索再精緻也救不回來。花時間親眼看一下讀出來的文字,是最划算的檢查。

← 全部文章