iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
生成式 AI

一塊一塊拼湊的 AI 樂高世界之旅系列 第 15

[Day 15] Rag 前處理 - 文件處理

  • 分享至 

  • xImage
  •  

在建構 RAG (Retrieval-Augmented Generation) 系統前,最關鍵的步驟之一就是 從文件中擷取文字。這個過程通常稱為 文件截取 (document parsing / text extraction),目的是把各種不同格式的文件(如 PDF、Word、Markdown)轉換成乾淨的純文字,方便後續切分(chunking)、向量化(embedding)、以及檢索。

那為什麼要先截取文字?
大多數原始資料並不是以純文字存在,而是封裝在複雜格式中:

  • PDF:常見於研究論文、公司報告,但其排版複雜,直接複製會丟失結構。
  • Word/Markdown:可能含有標題、表格、圖片,直接讀取難以保留語意層次。

因此,我們需要使用合適的工具,把這些檔案「還原」成乾淨且可處理的文字。

這邊介紹幾個套件

我們以 交通部的機車法規選擇題 的第二頁文件做演示效果

pypdf

pypdf 是一個專門處理 PDF 的 Python 套件,支援文字擷取、合併、分割頁面等功能。
優點是輕量、安裝方便,缺點是對於複雜排版(例如兩欄式 PDF)可能擷取效果不佳。

範例程式碼:

from pypdf import PdfReader

reader = PdfReader("sample.pdf")
print( reader.pages[1].extract_text())
  • 輸出結果

    機車法規選擇題
    題號 答案 題   目 分類
    編號
    001 3 為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依
    規定駕駛。
    11
    002 1 防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生
    (2)優良駕駛技術(3)良好生活習慣。
    11
    003 2 行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離
    即會增為(1)2倍(2)4倍(3)8倍。
    11
    004 2 行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。 11
    005 3 夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡
    (2)使用遠光燈(3)使用近光燈
    11
    006 1 行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。 11
    007 1 肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理
    力爭,以脫責任。
    11
    008 2 對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議
    (3)向警察機關提出告訴。
    11
    009 1
    變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提
    前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況
    (3)與前方車輛保持安全距離。
    11
    010 1
    下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還
    是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,
    並加強安全配備(3)騎在路中間,大家都看得到。
    11
    011 1
    行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行
    駛其後所保持的安全距離與同車速的汽車相比,可以再縮短
    一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減
    速重新取得安全距離。
    11
    012 2
    關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標
    準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀
    沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全
    帽。
    11
    013 2
    請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又
    輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保
    障(3)選深色的,比較不容易髒。
    11
    014 3 關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏
    移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。
    11
    015 1 機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行
    駛(2)多使用煞車(3)快速通過。
    11
    016 2 下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)
    減速、禮讓(2)開亮頭燈(3)顯示方向燈。
    11
    第2頁/共36頁
    

PyMuPDF

PyMuPDF 功能更強大,除了純文字,也能處理字體、圖片、座標資訊。若文件需要 更精準的文字擷取 或保留版面結構,這是比 pypdf 更靈活的選擇。

範例程式碼:

import fitz

file = fitz.open("sample.pdf")
print(file[1].get_text())
  • 輸出結果
    機車法規選擇題
    題號
    答案
    題   目
    分類
    編號
    001
    3
    為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依
    規定駕駛。
    11
    002
    1
    防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生
    (2)優良駕駛技術(3)良好生活習慣。
    11
    003
    2
    行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離
    即會增為(1)2倍(2)4倍(3)8倍。
    11
    004
    2
    行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。
    11
    005
    3
    夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡
    (2)使用遠光燈(3)使用近光燈
    11
    006
    1
    行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。
    11
    007
    1
    肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理
    力爭,以脫責任。
    11
    008
    2
    對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議
    (3)向警察機關提出告訴。
    11
    009
    1
    變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提
    前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況
    (3)與前方車輛保持安全距離。
    11
    010
    1
    下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還
    是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,
    並加強安全配備(3)騎在路中間,大家都看得到。
    11
    011
    1
    行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行
    駛其後所保持的安全距離與同車速的汽車相比,可以再縮短
    一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減
    速重新取得安全距離。
    11
    012
    2
    關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標
    準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀
    沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全
    帽。
    11
    013
    2
    請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又
    輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保
    障(3)選深色的,比較不容易髒。
    11
    014
    3
    關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏
    移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。
    11
    015
    1
    機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行
    駛(2)多使用煞車(3)快速通過。
    11
    016
    2
    下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)
    減速、禮讓(2)開亮頭燈(3)顯示方向燈。
    11
    第2頁/共36頁
    

Marker-PDF (需要 GPU)

Marker-PDF 能快速將文件轉換成 Markdown、JSON、HTML,並具備以下特點:

  • 支援多種格式:PDF、DOCX、PPTX、XLSX、EPUB、HTML、圖片等。
  • 自動處理表格、數學公式、程式碼區塊、參考文獻。
  • 可以擷取並保存圖片。

可輸出 結構化 JSON,支援自訂 Schema。

提供 LLM 輔助模式 (--use_llm),能進一步優化表格格式、數學式與跨頁內容的合併。

這些特性讓 Marker 特別適合用於 RAG 前處理,因為它不僅能輸出乾淨文字,還能保留結構資訊(例如標題、列表、表格),對之後的切分檢索更友好。

import re
from marker.models import create_model_dict
from marker.output import text_from_rendered
from marker.config.parser import ConfigParser
from marker.converters.pdf import PdfConverter

converter = PdfConverter(
    config=ConfigParser({
        "paginate_output": True
    }).generate_config_dict(),
    artifact_dict=create_model_dict()
)
rendered = converter("sample.pdf")
text, _, images = text_from_rendered(rendered)
text = re.split(r"\{\d+\}-+", text)
text.pop(0) # pop(0) 是因為 ["", "<page_1>", "<page_2>",...]

print(text[1])
  • 輸出結果
    | 題號  | 答案 | 題<br>目                                                                                                      | 分類<br>編號 |
    |-----|----|-------------------------------------------------------------------------------------------------------------|----------|
    | 001 | 3  | 為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依<br>規定駕駛。                                                                   | 11       |
    | 002 | 1  | 防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生<br>(2)優良駕駛技術(3)良好生活習慣。                                                         | 11       |
    | 003 | 2  | 行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離<br>即會增為(1)2倍(2)4倍(3)8倍。                                                         | 11       |
    | 004 | 2  | 行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。                                                                             | 11       |
    | 005 | 3  | 夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡<br>(2)使用遠光燈(3)使用近光燈                                                            | 11       |
    | 006 | 1  | 行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。                                                                            | 11       |
    | 007 | 1  | 肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理<br>力爭,以脫責任。                                                                | 11       |
    | 008 | 2  | 對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議<br>(3)向警察機關提出告訴。                                                             | 11       |
    | 009 | 1  | 變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提<br>前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況<br>(3)與前方車輛保持安全距離。                             | 11       |
    | 010 | 1  | 下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還<br>是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,<br>並加強安全配備(3)騎在路中間,大家都看得到。                    | 11       |
    | 011 | 1  | 行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行<br>駛其後所保持的安全距離與同車速的汽車相比,可以再縮短<br>一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減<br>速重新取得安全距離。 | 11       |
    | 012 | 2  | 關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標<br>準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀<br>沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全<br>帽。         | 11       |
    | 013 | 2  | 請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又<br>輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保<br>障(3)選深色的,比較不容易髒。                           | 11       |
    | 014 | 3  | 關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏<br>移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。                                               | 11       |
    | 015 | 1  | 機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行<br>駛(2)多使用煞車(3)快速通過。                                                          | 11       |
    | 016 | 2  | 下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)<br>減速、禮讓(2)開亮頭燈(3)顯示方向燈。                                                      | 11       |
    
    #### 第2頁/共36頁
    

上一篇
[Day 14] RAG 前前處理 - 介紹 RAG & Embedding
下一篇
[Day 16] 互動框架的選擇 Gradio
系列文
一塊一塊拼湊的 AI 樂高世界之旅17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言