RAG基建之PDF解析的“無OCR”魔法之旅

PDF文件轉換成其他格式常常是個大難題,大量的信息被鎖在PDF里,AI應用無法直接訪問。如果能把PDF文件或其對應的圖像轉換成結構化或半結構化的機器可讀格式,那就能大大緩解這個問題,同時也能顯著增強人工智能應用的知識庫。

嘿,各位AI探險家們!今天我們將踏上了一段奇妙的PDF解析之旅,探索了那些不用OCR(光學字符識別)也能搞定PDF的神奇小模型。就像哈利·波特不用魔杖也能施法一樣,這些小模型用神經網絡直接“讀懂”PDF,省去了繁瑣的OCR步驟,簡直是AI界的“無杖魔法”!

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”與“陷阱”

文章目錄

    • 概述
  • 詳細介紹
    • Donut
      • 編碼器
      • 訓練
      • 微調
    • Nougat
      • 模型架構
      • 訓練數據集的構建
    • Pix2Struct
      • 模型架構
      • 預訓練任務
      • 預訓練數據集
      • 微調
    • 一絲感悟
      • 關于預訓練任務
      • 關于預訓練數據
      • 關于性能
      • 基于流水線 vs. OCR-Free
      • OCR-Free小型模型方法的局限性
    • 結論

概述

之前介紹的基于流水線的PDF解析方法主要使用OCR引擎進行文本識別。然而,這種方法計算成本高,對語言和文檔類型的靈活性較差,且OCR錯誤可能影響后續任務。

因此,應該開發OCR-Free方法,如圖1所示。這些方法不顯式使用OCR來識別文本,而是使用神經網絡隱式完成任務。本質上,這些方法采用端到端的方式,直接輸出PDF解析結果。在這里插入圖片描述
OCR-Free vs. 流水線:誰更香?
從結構上看,OCR-Free方法比基于流水線的方法更簡單。OCR-Free方法主要需要注意的方面是模型結構的設計和訓練數據的構建。OCR-Free方法雖然一步到位,避免了中間步驟的“損耗”,但它的訓練和推理速度有點慢,像是一輛豪華跑車,雖然性能強大,但油耗高。而基于流水線的方法則像是一輛經濟型小車,雖然步驟多,但每個模塊都很輕量,適合大規模部署。

接下來,我們將介紹幾種具有代表性的OCR-Free小型模型PDF解析框架:

    1. Donut:PDF解析界的“甜甜圈”
      Donut這個小家伙,別看它名字甜,干起活來可是一點都不含糊。它用Swin Transformer當“眼睛”,BART當“嘴巴”,直接把PDF圖像“吃”進去,吐出一串JSON格式的“甜點”。不用OCR,全靠神經網絡,簡直是PDF解析界的“甜品大師”!
    1. Nougat:PDF解析界的“牛軋糖”
      Nougat,名字聽起來就很有嚼勁,它的絕活是把PDF圖像變成Markdown。它特別擅長處理復雜的公式和表格,簡直是PDF解析界的“糖果工匠”。不過,它的生成速度有點慢,像牛軋糖一樣,嚼起來需要點耐心。
    1. ** Pix2Struct:PDF解析界的“像素魔法師”**
      Pix2Struct是個視覺語言理解的高手,它的任務是從屏蔽的網頁截圖中預測HTML解析。它不僅能處理PDF,還能搞定網頁截圖,簡直是多才多藝的“像素魔法師”。不過,它的訓練數據來自網頁,可能會帶來一些“有害內容”,使用時得小心點。

詳細介紹

Donut

如圖2所示,Donut是一個端到端模型,旨在全面理解文檔圖像。其架構簡單,由基于Transformer的視覺編碼器和文本解碼器模塊組成。在這里插入圖片描述

Donut不依賴任何與OCR相關的模塊,而是使用視覺編碼器從文檔圖像中提取特征,并直接使用文本解碼器生成token序列。輸出序列可以轉換為JSON等結構化格式。

代碼如下:

class DonutModel(PreTrainedModel):r"""Donut: 一個端到端的OCR-Free文檔理解Transformer。編碼器將輸入的文檔圖像映射為一組嵌入,解碼器預測所需的token序列,可以將其轉換為結構化格式,給定提示和編碼器輸出的嵌入"""config_class = DonutConfigbase_model_prefix = "donut"def __init__(self, config: DonutConfig):super().__init__(config)self.config = configself.encoder = SwinEncoder(input_size=self.config.input_size,align_long_axis=self.config.align_long_axis,window_size=self.config.window_size,encoder_layer=self.config.encoder_layer,name_or_path=self.config.name_or_path,)self.decoder = BARTDecoder(max_position_embeddings=self.config.max_position_embeddings,decoder_layer=self.config.decoder_layer,name_or_path=self.config.name_or_path,)def forward(self, image_tensors: torch.Tensor, decoder_input_ids: torch.Tensor, decoder_labels: torch.Tensor):"""給定輸入圖像和所需的token序列計算損失,模型將以教師強制的方式進行訓練參數:image_tensors: (batch_size, num_channels, height, width)decoder_input_ids: (batch_size, sequence_length, embedding_dim)decode_labels: (batch_size, sequence_length)"""encoder_outputs = self.encoder(image_tensors)decoder_outputs = self.decoder(input_ids=decoder_input_ids,encoder_hidden_states=encoder_outputs,labels=decoder_labels,)return decoder_outputs......

編碼器

Donut使用Swin-Transformer作為圖像編碼器,因為它在初步的文檔解析研究中表現出色。該圖像編碼器將輸入的文檔圖像轉換為一組高維嵌入。這些嵌入將作為文本解碼器的輸入。

對應代碼如下:

class SwinEncoder(nn.Module):r"""基于SwinTransformerDonut編碼器使用預訓練的SwinTransformer設置初始權重和配置,然后修改詳細配置作為Donut編碼器參數:input_size: 輸入圖像大小(寬度,高度)align_long_axis: 如果高度大于寬度,是否旋轉圖像window_size: SwinTransformer的窗口大小(=patch大小)encoder_layer: SwinTransformer編碼器的層數name_or_path: 預訓練模型名稱,要么在huggingface.co.注冊,要么保存在本地。否則,將設置為`swin_base_patch4_window12_384`(使用`timm`)。"""def __init__(self,input_size: List[int],align_long_axis: bool,window_size: int,encoder_layer: List[int],name_or_path: Union[str, bytes, os.PathLike] = None,):super().__init__()self.input_size = input_sizeself.align_long_axis = align_long_axisself.window_size = window_sizeself.encoder_layer = encoder_layerself.to_tensor = transforms.Compose([transforms.ToTensor(),transforms.Normalize(IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD),])self.model = SwinTransformer(img_size=self.input_size,depths=self.encoder_layer,window_size=self.window_size,patch_size=4,embed_dim=128,num_heads=[4, 8, 16, 32],num_classes=0,)self.model.norm = None# 使用swin初始化權重if not name_or_path:swin_state_dict = timm.create_model("swin_base_patch4_window12_384", pretrained=True).state_dict()new_swin_state_dict = self.model.state_dict()for x in new_swin_state_dict:if x.endswith("relative_position_index") or x.endswith

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899431.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二層框架組合實驗

實驗要求: 1,內網IP地址使用172.16.0.0/16分配 2,SW1和sw2之間互為備份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通過DHCP獲取IP地址 5,ISP只能配置IP地址 6,所有電腦可以正常訪問ISP路由器環回 實驗思路順序: 創建vlan eth-trunk 劃分v…

光纖耦合器

以下是關于光纖耦合器的詳細介紹: 定義與原理 - 定義:光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合,并進行再分配的器件,也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理:利用不同光纖面緊鄰光纖芯…

惠普(HP)和聯想(Lenovo)作為全球兩大電腦品牌,并不是簡單的“拼接電腦”

惠普(HP)和聯想(Lenovo)作為全球兩大電腦品牌,并不是簡單的“拼接電腦”,它們都有自己的核心技術、專利設計和生態體系。以下是它們“自己的”核心部分: 1. 關鍵自研技術 品牌自研技術/專利說明…

若依賴前端處理后端返回的錯誤狀態碼

【背景】 后端新增加了一個過濾器,用來處理前端請求中的session 若依賴存放過濾器的目錄:RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【問題】 后端返回了一個狀態碼為403的錯誤,現在前端需要處理這…

智能的數學公式:Intelligence = Priori knowledge * Reasoning ?

愛因斯坦的相對論公式大道至簡, 假如智能有公式的話,會不會是: 其中,兩個影響因子分別是先驗知識 和 推理能力,推理能力的指數部分可以是整數也是小數,但是暫時還不好確定。 解析:&#xff08…

簡單使用LlamaIndex實現RAG

簡單使用LlamaIndex實現RAG 1 介紹 LlamaIndex是一個專門為大語言模型(LLM)設計的開源數據管理工具,旨在簡化和優化LLM在外部數據源中的查詢過程。適合在數據索引上構建RAG。 參考的地址 # 官網地址 https://docs.llamaindex.ai/en/stabl…

Redis延時隊列在訂單超時未報到場景的應用補充說明

一、工具類設計要點解析 連接保活機制 Scheduled(cron "0 */10 * * * ?") 定時任務每10分鐘向所有隊列發送心跳消息("keepAlive"),避免云Redis因空閑斷開連接。這是針對云服務商自動回收空閑連接的通用解決方案1。 泛…

理解Kubernetes中CoreDNS域名解析與DNS策略

CoreDNS是什么 CoreDNS是一個靈活可擴展的DNS服務器,使用Go語言編寫,旨在提供快速、靈活的DNS服務 為什么需要CoreDNS CoreDNS為Kubernetes集群內部的DNS解析提供服務,使得服務之間能夠通過域名互相通信 Kubernetes集群中, CoreDNS是運行在…

日報日報流量分析

快捷鍵 CtrlK,選擇需要抓包的網卡 CtrlF可以進行關鍵字搜索 CtrlM,標記數據包 CtrlShiftN跳到標記處 查看包有多少協議Protocol Hierarchy(協議分級) 搜了一下TCP協議,是互聯網最基本的協議&#xff0…

docker-Dify外接Fastgpt知識庫

參考地址:https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 總體步驟 部署fda(fastgpt-dify-adapter)docker 部署dify,fastgpt在fastgpt創建open apikey,復制知識庫id;在dify外接fastgpt知識庫; docker安裝 下載…

藍橋杯 之 圖論基礎+并查集

文章目錄 習題聯盟X藍橋幼兒園 圖論基礎 并查集 并查集,總的來說,操作分為三步初始化(每一個節點的父親是自己),定義union(index1,index2)函數,定義find(index)函數 并查集詳細內容博客 習題 聯盟X 聯盟X 典型的求解連通分支…

JavaScript運算符與邏輯中斷

目錄 JavaScript運算符 一、運算符分類與優先級 1. 運算符優先級表 二、算術運算符 1. 基礎算術運算 2. 自增/自減運算符 三、比較運算符 1. 基礎比較 2. 相等性判斷 四、邏輯運算符 1. 基礎邏輯運算 2. 短路求值(Short-Circuiting) 3. 邏輯…

Unity頂點優化:UV Splits與Smoothing Splits消除技巧

一、頂點分裂問題概述 1. 什么是頂點分裂 頂點分裂(Vertex Splits)是3D渲染中常見的性能問題,當模型需要為同一頂點位置存儲不同屬性值時,會創建多個頂點副本。主要分為兩類: UV Splits:由UV不連續引起 Smoothing Splits&#…

OpenCV、YOLO與大模型的區別與關系

OpenCV、YOLO 和大模型的區別與關系 1. OpenCV(Open Source Computer Vision Library) 定位:開源的計算機視覺基礎庫。功能:提供傳統的圖像處理算法(如圖像濾波、邊緣檢測、特征提取)和基礎工具&#xff…

CentOS 7 掛載與卸載文件系統筆記

掛載文件系統 掛載的基本概念 掛載是將存儲設備(如硬盤分區、U 盤、光盤等)連接到 Linux 文件系統的特定目錄(掛載點),使得系統能夠訪問存儲設備上的數據。 查看已掛載的文件系統 命令:mount 或 df -h mo…

Git項目要改變倉庫地址

去掉原倉庫git地址和清除原項目的git版本信息的方法 場景需求: 如果是使用自己以前的項目、或者拉取了別人的項目到自己本地。想在此基礎上重新開發、初始化項目的話,最好先刪掉以前的git信息。 因為如果不刪除的話: 1.看著不舒服。根本不需要保留原來的版本信息。 2.我們…

NC,GFS、ICON 數據氣象信息可視化--降雨量的實現

隨著氣象數據的快速發展和應用,氣象信息的可視化成為了一項不可或缺的技術手段。它不僅能幫助氣象專家快速解讀數據,還能為公眾提供直觀的天氣預報信息。今天,我們將從降雨量的可視化出發,帶大家一起了解如何實現氣象數據的可視化…

質量工程師的2025:從“找bug“到“造質量“的職業進化

想象一下,2025年的某天:閱讀原文 早晨,AI測試助手已經自動運行了夜間回歸測試,并將可疑問題標記出來 你喝著咖啡,通過質量數據看板分析系統健康度 下午的會議上,你正用業務語言向產品經理解釋&#xff1a…

Python實現將字典中鍵相同的值合并

在Python字典中鍵是唯一的,但是業務需求是將不同的數據傳遞到不同的接口,接口列表中存在3個相同的接口,需要將3個接口對應的數據合并一同發送,邏輯實現如下 merge_dict {}for file in files:path os.path.join(folder_path, fil…

數據大屏點亮工業互聯網的智慧之眼

在當今數字化飛速發展的時代,數據已成為企業決策的核心依據,而數據大屏作為數據可視化的重要工具,正逐漸成為工業互聯網領域不可或缺的一部分。通過直觀、動態的可視化展示,數據大屏能夠將復雜的數據轉化為易于理解的圖表和圖形&a…