昨天提到,當 Baseline 缺少外部知識時,第一步不是直接建立 Vector Database,而是先找出真正的 Source of Truth,再依照資料型態與問題複雜度,決定要搜尋、查詢,還是透過工具取得所需脈絡。但如果 Source of Truth 是企業內部累積的大量文件,新的問題也會跟著出現:
企業文件通常不是一串乾淨且順序正確的文字,這些 PDF、PowerPoint、Word、Excel、掃描圖片與網頁,究竟要怎麼變成可以被系統穩定檢索的知識?
如果這些結構在進入流程的第一步就消失了,後面不管換多好的 Embedding Model、Vector Database 或 Reranker,都只是在更有效率地搜尋一份已經被解析錯誤的資料。
所以今天想討論的,是 RAG 架構的另一半:
在查詢發生以前,文件匯入與索引流程如何把原始資料轉換成可被檢索的知識。

如果先把細節拿掉,一條常見的 RAG 文件匯入與索引流程可以整理成:
資料來源 → Connector → Adapter / Parser → 結構化表示 → Chunking → 內容增強 → Embedding / Index
每一層處理的問題不同:
產品可能把多層包在同一個工具裡,但從架構角度仍應分開理解,才能定位 Retrieval 失敗發生在哪一層。
最簡單的 Adapter / Parser,可能只是把檔案內容抽成純文字。但純文字很容易造成資訊損失。
例如規格表中很常會多個欄位共用合併標題,下一列才分成尺寸、重量與容量。Parser 若只按文字座標逐行抽取,最後可能得到看似完整、實際上已失去欄位關係的文字;多欄 PDF 也一樣,我們人類會知道先讀完左欄再讀右欄,Parser 卻可能把兩欄交錯串起;PPT 更是不一定,可能圖的設計本身就是一種資訊,不存在明確閱讀順序。
因此,結構化表示除了文字,還應視需求保留文件階層、章節路徑、表格儲存格、圖片、圖說、閱讀順序、頁碼、位置座標、來源位置、版本與 ACL。它們不一定都送進 Embedding Model,卻會影響 Chunking、資料篩選、引用、權限與增量更新。
Adapter / Parser 的價值,不只是把不同格式轉成文字,而是盡可能把文件原本的語意結構轉成機器可以繼續處理的表示法。

目前 GitHub 上已經有不少熱門工具可以處理 PDF、Office、圖片與 OCR。它們常被放在一起比較,但定位並不完全相同。以下熱度是近期比較社群關注比較熱門的一些repo。
| 工具 | 比較接近的定位 | 主要優勢 | 適合優先評估的情境 | 需要注意 |
|---|---|---|---|---|
| Docling | Parser 與統一文件表示 | 版面、閱讀順序、表格、公式、OCR,輸出 Markdown / JSON | 保留結構並依文件結構進行 Chunking | 約 60k Stars;繁中掃描仍需實測 |
| MinerU | 複雜文件解析引擎 | 多欄、公式、OCR、表格與跨頁表格 | 論文、財報、亞洲語言與複雜 PDF | 確認資源需求與附加授權條件 |
| Marker | 文件轉 Markdown / JSON | PDF、公式、表格與多欄,可選 LLM 強化 | 快速產生適合 LLM 使用的文件 | 約 38k Stars;另查模型權重授權 |
| Unstructured | 文件 ETL 框架 | Connector 與處理流程生態完整,涵蓋解析、切塊與內容增強 | 異質企業來源與完整匯入流程 | 約 15k Stars;Connector 多不等於解析最佳 |
| Apache Tika | 廣格式內容與 Metadata 擷取 | 成熟、支援上千種格式 | 舊式 Office、格式偵測與備援解析 | 約 4k Stars;不以高保真版面解析為主 |
| PyMuPDF4LLM | 輕量 PDF Parser | 適合 CPU 執行,輸出 Markdown / JSON | 原生數位 PDF、重視速度與成本 | 另評估 Office 支援與授權 |
| MarkItDown | 將檔案轉成 Markdown 的 Adapter | API 簡單、支援常見格式 | 結構簡單的 Office 文件 | 不適合代表複雜表格解析能力 |
三大雲也有託管服務:AWS 的 Amazon Textract 與 Bedrock Data Automation、Azure AI Document Intelligence,以及 Google Cloud 的 Document AI Layout Parser。它們提供 OCR、版面與表格辨識、欄位擷取,部分服務也能產生適合 RAG 的 Chunk。
託管服務的優勢是 API、擴縮與治理整合;代價是費用、服務區域、資料邊界與 Vendor Lock-in。這是自建或採購的選擇,不是單純的功能競賽。
但實際上,最後都要回歸到處理內部的資料的資料特性,像是繁中掃描、多欄論文、跨頁表格與產品簡報建立代表性測試資料集,比較文字、閱讀順序、表格與標題階層是否正確。除此之外,能否回溯來源,以及速度、資源、失敗率與授權也是很重要的評估指標。
工具的 README 告訴我們它能處理什麼;自己的評估資料集才能告訴我們它能不能處理我們的資料。
文件完成解析後,下一步才是 Chunking。
Chunk 太大,可能同時代表多個主題;Chunk 太小,又可能失去標題、前後文與條件。例如「不得退貨」若被切掉前面的「已拆封商品」,就會從有條件規則變成錯誤的絕對規則。
因此 Chunk Size 並不存在對所有資料都適用的固定答案。切分、Metadata 與 Retrieval 階段的脈絡擴展等策略可以一起整理如下:
| Chunking 與脈絡組織策略 | 做法 | 優點 | 缺點 | 適合情境 |
|---|---|---|---|---|
| 固定長度(Fixed-size) | 每 N 個字元或 Token 切割,通常加入重疊範圍 | 最簡單、速度快、大小可預測 | 容易切斷句子、表格與條件,重疊也會增加重複資料 | Baseline、同質且結構簡單的文字 |
| 遞迴切塊(Recursive) | 依段落、換行、句子等分隔符號逐層切割 | 比固定長度更容易保留自然邊界 | 不真正理解文件階層,無法修復錯誤的 Parser 產出 | 一般 Markdown 與純文字 |
| 依 Metadata 組織 | 保留標題、章節、頁碼、日期、語言、ACL 等欄位 | 可做資料篩選、權限、引用與版本管理 | Metadata 不完整或不一致可能造成漏查 | 企業知識庫、多租戶與需追溯來源的系統 |
| 依章節切塊(Section-aware) | 依標題與章節邊界切割,過長章節再二次切分 | 主題完整、容易解釋 | 依賴標題辨識,短章節可能過碎 | 手冊、政策、技術文件與規格書 |
| 語意切塊(Semantic) | 依句子的 Embedding 或模型判斷語意轉折 | Chunk 內語意通常較一致 | 成本較高、閾值敏感,也可能破壞表格與列表 | 長篇敘事、訪談、逐字稿 |
| 依結構/版面切塊(Structure / Layout-aware) | 依文件樹狀結構、表格、圖片、清單與閱讀順序切割 | 能保留原始文件邏輯與完整物件 | 高度依賴 Parser 品質,實作也比較複雜 | PDF、PPT、財報、論文與複雜 Office 文件 |
| 父子區塊(Parent-child) | 用小 Chunk 進行 Retrieval,命中後取回較大的父層脈絡 | 同時兼顧精準召回與完整脈絡 | Index 與 Retrieval 邏輯較複雜 | 長文件、條款與跨段落說明 |
| 句子視窗(Sentence-window) | 用句子檢索,命中後補回前後數句 | 適合找細節,又能恢復局部語境 | 句子切分對表格、項目符號與部分語言未必穩定 | FAQ、法規與細節密集的長文 |
實務上可以組合多種方法。合理的預設策略是:
先依版面與章節保留自然邊界,再對過長章節使用 Recursive 與 Token 上限;表格、圖片與圖說、程式碼區塊及清單則視為不應任意拆散的完整物件。

大型表格可依資料列群組切割,但每一塊都要重複表格標題、欄位名稱與單位,並保存儲存格座標,否則模型可能找到數字卻不知道它屬於哪個欄位。
完成 Chunking 後,最直接的做法是把每個 Chunk 送進 Embedding Model。但 Chunk 一旦離開原始文件,常常會失去原本隱含的脈絡。
例如 Chunk 只有「保固期限為兩年」,沒有文件名稱、產品型號與章節路徑時,很難分辨它描述哪項產品。因此常會在 Embedding 前補上額外資訊。
| 內容增強方式 | 主要用途 | 代價與風險 |
|---|---|---|
| Metadata | 保存資料來源、標題、章節路徑、頁碼、日期、版本、語言與 ACL | 欄位結構改變或漏填可能造成資料篩選與權限問題 |
| 文件標題/補充脈絡 | 在 Chunk 前補上文件與章節背景 | 補充內容太長可能稀釋原文;用 LLM 產生時也可能出錯 |
| 摘要 | 建立較高階的主題表示,協助探索整份文件 | 容易遺漏數字、例外與否定,不應取代原文 |
| 自動產生可能問題 | 替 Chunk 產生它可能回答的問題,縮短 Query 與文件語言差距 | 增加 Index 大小與生成成本,也可能產生不符合原文的問題 |
| Entity Extraction | 取出產品、人名、組織、地點、代碼與其他領域 Entity | 需要處理別名、名稱正規化與領域評估 |
| Relation / Claim Extraction | 建立 Entity 間的關係、事件、主張與來源 | 成本最高,錯誤關係也可能在後續查詢中被放大 |
不必讓每份資料都先經過 LLM 增強。穩健的順序是先加入固定且可驗證的 Metadata、文件標題與章節路徑,再觀察實際的 Retrieval 失敗。
口語問題與正式文件語言差異大時,再考慮替 Chunk 自動產生可能問題;常問整份文件主題時才增加摘要;跨文件 Entity 與 Relation 無法被局部 Chunk 表達時,才考慮 Knowledge Graph。
內容增強不應該因為可以生成就全部生成,而應該用來修復已經被觀察到的 Retrieval 缺口。
GraphRAG 常被理解成另一種內容增強。但 Microsoft GraphRAG 會從 Text Unit 抽取 Entity、Relationship 與 Claim,再做 Community Detection、產生社群報告(Community Report)並建立多種 Index。
這代表 GraphRAG 不是只替原本的 Chunk 多加幾個欄位,而是在向量表示之外,再建立一套描述知識關係的 Graph 表示。
一般 Vector RAG 擅長回答「某商品的保固期限是多久?」等局部事實。GraphRAG Local Search 適合從特定 Entity 尋找關係;Global Search 則利用社群報告,回答整個資料集的主要議題、風險或共同模式。

GraphRAG 的代價是額外的 Entity / Relation Extraction、Entity Resolution、Community Detection 與摘要生成;文件更新時也要維護 Graph。如果 Relation 抽取錯誤,影響還可能被圖結構放大。
因此,以下情況通常不需要急著建立 Graph:
如果問題天然具有關係網路結構,或答案需要跨文件 Multi-hop Reasoning 與全域綜整,GraphRAG 才可能值得投入。
是否需要 Graph,不是由資料裡有沒有 Entity 決定,而是由問題是否需要透過 Relation 與整體語料庫結構才能回答決定。
把今天的流程重新整理一次:
資料來源 → 文件結構 → Chunk → 內容增強 → Index
資料來源決定知識從哪裡來;Parser 決定保留多少結構;Chunking 決定最小知識單位;內容增強補足遺失的脈絡;Embedding、關鍵字或 Graph Index 最後才決定如何搜尋。
這些步驟彼此相依:沒有辨識標題與表格,就難以做 Structure-aware Chunking;沒有保存來源位置,就難以提供引用;只需局部事實時,過早加入摘要、自動產生可能問題與 Graph 反而增加成本。
所以成熟的文件匯入與索引流程不應從「用哪一個 Vector Database」開始,而要先問:原始資料有什麼結構、哪些資訊不能遺失、Retrieval 應找到多大的知識單位、Chunk 缺少哪些脈絡,以及問題是否真的需要 Entity Relation 與整體知識結構。
RAG 的 Retrieval 品質,很多時候在 Query 發生以前,就已經被文件匯入與索引流程決定了。
下一步,才是進一步討論這些 Chunk 要如何轉成 Embedding、放進什麼 Index,以及到了查詢階段,又該如何透過關鍵字、Vector、資料篩選、Reranking 與不同 Retrieval Strategy 找回真正需要的脈絡。
