PDF 檔案通常包含豐富的資訊,例如圖片、表格和文字。為了有效地處理和理解這些資訊,我們需要將 PDF 檔案解析成結構化的資料。本文介紹如何使用程式函式庫和大語言模型 (LLM) 來解析 PDF 檔案,並特別關注如何提取和摘要表格資料。首先,我們使用 partition_pdf 函式將 PDF 檔案分割成文字、圖片和表格等元素。接著,利用 GPT-4 等多模態模型,為每個表格生成簡潔的摘要,使其成為獨立的資訊單元,方便後續的文字嵌入處理。為了在 RAG 系統中有效地檢索相關資訊,我們將表格摘要和原始表格的連結一同儲存至向量資料函式庫。如此一來,RAG 系統便能根據使用者提問,快速定位到包含關鍵洞察的表格,並提供更精確的答案。

PDF檔案解析與表格摘要

在處理PDF檔案時,經常會遇到包含多種媒體元素的檔案,例如圖片、表格和文字。為了有效地提取和摘要這些元素,特別是表格,我們可以使用大語言模型(LLM)來幫助我們完成這項任務。

PDF檔案解析

首先,我們需要將PDF檔案分割成其個別元素,包括表格、圖片和文字。這可以透過使用特定的PDF解析函式庫或工具來實作。例如,使用partition_pdf函式可以將PDF檔案分割成其個別元素,並根據元素型別進行處理。

表格摘要

在提取出表格元素後,我們可以使用LLM來生成表格的摘要。這涉及到建立一個提示,要求LLM根據表格內容生成一個簡潔的摘要。例如,使用OpenAI的GPT-4模型,可以透過建立一個提示來要求模型根據表格內容生成一個簡潔的摘要。

import pandas as pd
from openai import OpenAI

# 定義表格摘要函式
def summarize_tables(row):
    summary_prompt = f"""您是一個負責摘要表格的助手。請給出一個簡潔的表格摘要。表格片段:{row.table}"""
    
    # 初始化OpenAI API客戶端和生成表格摘要
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    model="gpt-4o",
    messages=[{"role": "user", "content": summary_prompt}],
    temperature=0.7,
    max_tokens=150,
    )
    return row

# 建立一個Pandas DataFrame從表格
tables_df = pd.DataFrame(tables, columns=["table"])

# 新增一個欄位到DataFrame中儲存摘要
tables_df = tables_df.apply(summarize_tables, axis=1)

討論

LLM可以根據表格內容生成一個簡潔的摘要,使其成為一個獨立的資訊單元,這對於我們的文字嵌入模型非常適合。在儲存摘要和建立嵌入時,我們需要儲存原始表格的連結。當我們的RAG系統的檢索步驟識別出表格中的關鍵洞察與使用者問題相關時,包括整個表格而不是隻包括摘要在最終提示中是有意義的。LLM應該能夠分析原始表格,以避免在過程中丟失任何資訊。

相關內容

如今,我們使用LLM和多模態模型來處理許多資料處理任務。這些模型可以解釋資料、重新措辭文字、總結影像或文字,甚至可以做出決策。我們可以在無數使用案例中使用這些模型,通常只需要一個不同的提示。以下是本文中的一些例子:

  • 食譜1.8展示瞭如何使用多模態模型為影像建立文字摘要。
  • 食譜2.3示範瞭如何向模型顯示一個文字片段並要求它根據資訊生成假設性問題。
  • 最先進的應用是代理RAG概念,它透過模擬人類問題解決來實作(見[連結])。

多媒體PDF解析

最終,當處理包含多種媒體元素的PDF檔案時,瞭解如何有效地提取和摘要這些元素是非常重要的。透過使用LLM和其他相關技術,我們可以建立出強大的工具來自動化這些任務,並提高我們處理和理解複雜PDF檔案的能力。

處理多模態內容的PDF檔案

問題描述

您想要將包含多模態內容(如圖片和嵌入表格)的PDF檔案載入您的RAG系統中。

解決方案

多模態模型為處理和分析包含圖片和表格的檔案開啟了新的可能性。 在之前的章節中,我們學習瞭如何為圖片生成文字摘要(見Recipe 1.8)和如何為表格生成文字摘要(見Recipe 1.9)。在這個食譜中,我們結合了這兩個概念來解釋PDF檔案中的不同模態。

圖1-13展示了載入具有多模態內容的PDF檔案的完整過程。它需要一個多步驟的管道,包括以下步驟:

  1. 資料分割:載入原始資料並將其分割為文字、圖片和表格。
  2. 生成摘要:使用多模態模型(如OpenAI的GPT-4V、Anthropic的3.5 Sonnet或Google的Gemini 1.5)為圖片和表格生成文字摘要。
  3. 建立嵌入:為文字塊、圖片摘要和表格摘要生成文字嵌入。
  4. 儲存嵌入:將嵌入新增到向量儲存中,並儲存元資料,如時間戳、檔案路徑、頁碼等。

前置條件

我們需要使用unstructured函式庫將PDF檔案分割為文字、圖片和表格。然後,我們使用OpenAI的多模態模型GPT-4o為圖片和表格建立文字摘要。

步驟

在示例1-13中,我們使用unstructured函式庫將PDF檔案分割為其元素。每個元素都有一個特定的類別:敘述文字、圖塊、圖片或表格。

from unstructured.partition.pdf import partition_pdf
import os

# 設定OCR代理為tesseract
os.environ["OCR_AGENT"] = "tesseract"
pdf_file_path = "../datasets/pdf_files/adult_data_article.pdf"
image_output_dir = "../datasets/extracted_content_from_pdfs/images"

# 使用函式提取PDF元素
elements = partition_pdf(pdf_file_path, image_output_dir)

內容解密:

上述程式碼使用partition_pdf函式從PDF檔案中提取元素。這些元素可以是文字、圖片或表格。然後,我們可以使用多模態模型為圖片和表格生成文字摘要,並將其嵌入到向量儲存中。

圖表翻譯:

下圖展示了載入具有多模態內容的PDF檔案的過程。它包括分割資料、生成摘要、建立嵌入和儲存嵌入等步驟。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title PDF多媒體內容解析與表格摘要技術

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

此圖表顯示了載入具有多模態內容的PDF檔案的完整過程。它包括分割資料、生成摘要、建立嵌入和儲存嵌入等步驟。

處理PDF檔案中的元素

在處理PDF檔案時,我們需要將其分解為不同的元素,例如文字、圖片和表格。這些元素可以透過partition_pdf函式來提取,該函式可以根據元素型別進行分類別。

raw_pdf_elements = partition_pdf(
    filename=pdf_file_path,
    extract_images_in_pdf=True,
    extract_image_block_types=["Image", "Table"],
    extract_image_block_to_payload=False,
    extract_image_block_output_dir=image_output_dir,
)

接下來,我們需要將提取的元素分類別為不同的列表,例如文字、標題和表格。

texts = []
titles = []
tables = []

for element in raw_pdf_elements:
    if "unstructured.documents.elements.Table" in str(type(element)):
        tables.append(str(element))
    elif "unstructured.documents.elements.NarrativeText" in str(type(element)):
        texts.append(str(element))
    elif "unstructured.documents.elements.Title" in str(type(element)):
        titles.append(str(element))

處理文字和標題

對於文字和標題,我們可以將其分割為更小的文字塊,以便於嵌入模型的處理。這個過程涉及遞迴、語義和代理塊的技術。

從技術架構視角來看,處理多模態 PDF 檔案並整合至 RAG 系統的核心挑戰在於如何有效地解析、摘要和嵌入不同模態的資訊,例如文字、表格和圖片。本文提供的方案,利用 partition_pdf 函式和多模態大語言模型(LLM)如 GPT-4o,有效地將 PDF 檔案拆解成不同元素,並生成對應的文字摘要。此架構巧妙地將非結構化資料轉化為結構化資料,方便後續的嵌入和向量化操作。然而,目前的方案仍存在一些限制。例如,對於複雜表格的摘要,LLM 的理解能力仍待提升,可能導致資訊遺漏或曲解。此外,不同模態摘要的整合方式也值得進一步探討,例如如何權衡不同模態資訊的重要性,以及如何處理模態之間的語義衝突。展望未來,隨著多模態 LLM 技術的持續發展,預期 PDF 解析和摘要的準確性和效率將會顯著提升。同時,更精細的嵌入策略和向量搜尋技術,將能更好地捕捉多模態資訊的語義關聯,進而提升 RAG 系統的整體效能。對於開發者而言,建議深入研究不同 LLM 的特性,並根據實際應用場景調整提示策略和引數設定,以達到最佳的效能平衡。此外,探索更進階的資訊融合技術,例如圖神經網路,或許能為多模態 RAG 系統帶來新的突破。玄貓認為,多模態資訊處理是 RAG 系統發展的重要方向,掌握相關技術將成為未來資訊檢索和知識管理的關鍵能力。