MaxKB+MinerU:通過API實現PDF文檔解析并存儲至知識庫

MinerU是一款開源的高質量數據提取工具,能夠將PDF文檔轉換為Markdown和JSON格式。2025年6月13日,MinerU發布了v2.0版本,相較于v1.0版本實現了架構和功能的全面重構與升級。在優化代碼結構和交互方式的同時,v2.0版本還集成了小參數量、高性能多模態文檔解析模型,能夠實現端到端的高速、高精度文檔理解。實際測試表明,新版本對復雜圖表的解析效果較上一版本有明顯提升,目前已經能夠滿足90%以上的復雜文檔解析需求。

值得一提的是,MinerU出色的PDF文檔解析能力特別適合與MaxKB開源項目配合使用。通過"MinerU+MaxKB"的組合方案,用戶不僅能夠獲得高質量的文檔解析效果,還能顯著提升知識庫問答系統的性能。為方便用戶集成,MinerU項目現已提供API對接服務(https://mineru.net/apiManage)。接下來,本文將詳細介紹如何通過MinerU在線API實現與MaxKB的對接。

一、實現方法

當用戶提供文件地址后,系統會將該地址賦值給file_url變量,并作為參數傳遞給MinerU文件解析服務。MinerU在完成文件解析后,會返回一個任務ID(task_id)。系統會將其傳入MinerU的查詢接口,當檢測到任務處理完成時,自動獲取結果文件的下載鏈接(full_url)。隨后,系統執行文件下載操作,將結果文件保存到MaxKB容器的/opt/maxkb/download目錄下。最后,系統會自動完成文件上傳和智能分段處理,將內容存儲到知識庫中。
在這里插入圖片描述

二、MaxKB函數創建

我們需要在MaxKB的函數庫中創建四個核心功能函數,其用途分別為:

1.調用MinerU單個文件解析;

2.從MinerU獲取任務結果;

3.通過URL鏈接下載文件至服務器;

4.將解析后的ZIP文件上傳至知識庫。

相關的代碼說明如下:

■ MinerU單個文件解析函數:負責調用MinerU的單文件解析服務,通過傳入PDF文檔的在線地址來創建解析任務,并返回對應的task_id;

import requestsdef create_task(file_url):url = 'https://mineru.net/api/v4/extract/task'token = '自己申請的 Token'header = {'Content-Type': 'application/json','Authorization': f'Bearer {token}'}data = {'url': file_url,'is_ocr': True,  #是否啟動 ocr 功能,默認 false'enable_formula': True,  #是否開啟公式識別,默認 true'enable_table': True,    #是否開啟表格識別,默認 true'language': "ch",    #指定文檔語言,默認 ch,可以設置為auto'model_version': "v2",  #mineru模型版本,兩個選項:v1、v2,默認v1。}res = requests.post(url,headers=header,json=data,timeout=5)res_data = res.json()task_id_data = res_data["data"]["task_id"]return task_id_data

在這里插入圖片描述

■ MinerU獲取任務結果函數:用于查詢任務狀態,通過傳入task_id獲取解析結果,成功后將返回ZIP格式解析文件的下載地址;

import time
import requests
def querybyid(task_id,max_retries=100,retry_interval=5):url = f'https://mineru.net/api/v4/extract/task/{task_id}'token = '申請的Token'header = {'Content-Type': 'application/json','Authorization': f'Bearer {token}'}retries = 0while retries < max_retries:try:res = requests.get(url, headers=header, timeout=5)res.raise_for_status()  # 檢查請求是否成功data = res.json()if "data" in data and "full_zip_url" in data["data"] and data["data"]["full_zip_url"]:return data["data"]["full_zip_url"]else:print(f"full_zip_url 為空,正在等待任務完成。已重試 {retries + 1} 次,共 {max_retries} 次。")time.sleep(retry_interval)retries += 1except requests.exceptions.RequestException as e:print(f"請求失敗,錯誤信息:{e}。正在重試...")time.sleep(retry_interval)retries += 1raise Exception(f"在 {max_retries} 次重試后,仍未獲取到有效的 full_zip_url。")

在這里插入圖片描述

■ 文件下載函數:根據提供的ZIP文件下載鏈接,將文件保存至容器內的/opt/maxkb/download目錄。需要注意的是,MaxKB默認使用sandbox用戶運行,需確保該用戶對/opt/maxkb/download目錄有讀寫權限;

import os
import requests
from urllib.parse import urlparsedef download_file(download_url, save_dir='/opt/maxkb/download'):os.makedirs(save_dir, exist_ok=True)# 獲取文件名parsed_url = urlparse(download_url)filename = os.path.basename(parsed_url.path)save_path = os.path.join(save_dir, filename) # 文件下載后保存的目錄,需要默認用戶對此目錄有讀寫權限# 下載文件try:response = requests.get(download_url, stream=True)response.raise_for_status()  # 檢查請求是否成功total_size = int(response.headers.get('content-length', 0))block_size = 1024  # 1KBprogress = 0print(f"開始下載 {filename} 到 {save_dir}")with open(save_path, 'wb') as f:for data in response.iter_content(block_size):f.write(data)progress += len(data)# 打印下載進度print(f"下載進度: {progress / total_size * 100:.2f}%", end='\r')print(f"\n下載完成: {save_path}")return save_pathexcept requests.exceptions.RequestException as e:print(f"下載失敗: {e}")return None

在這里插入圖片描述

■ ZIP文件上傳至知識庫:通過MaxKB API將服務器上的ZIP解析文件上傳至知識庫存儲。

import json
import logging
import requests
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def initialize(file_path):config = {# MaxKB API密鑰'authorization_apikey': 'user-ac86ec515de17969f2f8a9c8ab21e52f',    # 文件分段處理的API地址'split_url': 'http://10.1.11.58:8080/api/dataset/document/split',# 目標知識庫的API地址'upload_url': 'http://10.1.11.58:8080/api/dataset/3d1d5d4e-5576-11f0-bc5c-0242ac120003/document/_bach','file_path': rf'{file_path}','file_name': '函數庫上傳文檔分段'}return configdef upload_file(config):headers = {'accept': 'application/json','AUTHORIZATION': f'{config["authorization_apikey"]}'}try:files = {'file': open(config["file_path"], 'rb')}response = requests.post(config["split_url"], headers=headers, files=files)response.raise_for_status()response_data = response.json()map_content = {}for item in response_data.get("data", []):for content_item in item.get("content", []):map_content[content_item.get("title", "")] = content_item.get("content", "")return map_contentexcept requests.exceptions.RequestException as e:logging.error(f"文件分段上傳失敗: {e}")return {}except Exception as e:logging.error(f"處理文件內容時出錯: {e}")return {}def send_post_request(config, map_content):headers = {"Content-Type": "application/json","Authorization": f'{config["authorization_apikey"]}'}paragraphs = [{"title": key, "content": value} for key, value in map_content.items()]document_wrapper = {"name": config["file_name"],"paragraphs": paragraphs}json_body = json.dumps([document_wrapper])try:response = requests.post(config["upload_url"], headers=headers, data=json_body)response.raise_for_status()logging.info(f"上傳文件響應: {response.text}")return Trueexcept requests.exceptions.RequestException as e:logging.error(f"上傳文件失敗: {e}")return Falsedef main(file_path):config = initialize(file_path)map_content = upload_file(config)if not map_content:logging.error("文件分段上傳失敗或內容為空,程序終止")return Falseif not send_post_request(config, map_content):logging.error("文件上傳失敗,程序終止")return Falsereturn "文件已上傳成功,并保持在知識庫中"

在這里插入圖片描述

三、在MaxKB中創建應用

在上述四個函數創建完成后,我們可以在MaxKB中嘗試創建高級應用。輸入或提取上傳文件的鏈接后,按照前文順序依次添加MinerU單個文件解析函數節點→從MinerU獲取任務結果函數節點→下載文件函數節點→文件上傳函數節點。
在這里插入圖片描述

小助手提示“文件上傳成功”,即可回到知識庫頁面,在目標知識庫中看到新上傳的文檔。
在這里插入圖片描述
在這里插入圖片描述

總結來說,MinerU v2.0是一款開源、高性能的PDF文檔解析工具,具備強大的多模態處理能力。通過MaxKB與MinerU的深度聯動,可以基于函數調用構建清晰高效的 “文件地址→解析→下載→上傳” 自動化流程,無縫銜接原始文檔與結構化知識庫的構建。

“MinerU+MaxKB”的組合方案,不僅可以顯著提升文檔解析的精度與效率,更能大幅增強知識庫問答系統的能力與效果。

如果您對我們的項目感興趣,歡迎下載并體驗MaxKB!

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

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

相關文章

一文了解 `package.json` 和 `package-lock.json`文件

所有使用 npm 或 yarn&#xff08;部分場景&#xff09;管理依賴的 JavaScript/Node.js 項目都會存在**的核心文件–package.json 和 package-lock.json&#xff0c;無論項目類型是 Vue、React、Angular&#xff0c;還是純 Node.js 后端項目、普通 JavaScript 工具庫等。 所以這…

【AI論文】大語言模型量化的幾何原理:將GPTQ視為Babai最近平面算法

摘要&#xff1a;將大型語言模型&#xff08;LLMs&#xff09;的權重從16位量化到更低位寬&#xff0c;是實際部署大規模Transformer模型到更具性價比的加速器上的通用方法。GPTQ已成為大語言模型規模下一站式訓練后量化的標準方法之一。然而&#xff0c;其內部工作原理被描述為…

數據處理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 數據清洗 特征可視化 Kaggle數據集實操 讀者收獲&#xff1a;1周內具備數據預處理能力 數…

計算機系統層次結構

計算機系統通過多層抽象&#xff0c;平衡硬件效率與軟件靈活性&#xff0c;各層以獨立語言和功能構成有機整體。一、層次劃分&#xff08;從底層到頂層&#xff09;層級名稱特點實現方式第1級微程序機器層硬件直接執行微指令&#xff08;如微操作控制信號&#xff09;。物理硬件…

04 基于sklearn的機械學習-梯度下降(上)

梯度下降一 、為什么要用到梯度下降&#xff1f;正規方程的缺陷&#xff1a;非凸函數問題&#xff1a;損失函數非凸時&#xff0c;導數為0會得到多個極值點&#xff08;非唯一解&#xff09;計算效率低&#xff1a;逆矩陣運算時間復雜度 O(n3)&#xff0c;特征量翻倍時計算時間…

淘寶 API HTTP/2 多路復用與連接優化實踐:提升商品數據采集吞吐量

一、引言?隨著電商行業的蓬勃發展&#xff0c;對淘寶平臺商品數據的采集需求日益增長。無論是市場調研公司分析市場趨勢、電商平臺整合商品資源&#xff0c;還是商家進行競品分析&#xff0c;都需要高效、穩定地獲取大量淘寶商品數據。然而&#xff0c;傳統的 HTTP 協議在面對…

javascript中call、apply 和 bind 的區別詳解

文章目錄深入淺出&#xff1a;JavaScript 中的 call、apply 和 bind一、三位魔法師的共同使命二、各顯神通的魔法師們1. call - 即時通訊專家2. apply - 批量處理高手3. bind - 預約服務大師三、魔法師們的對比表格四、魔法師們的實際應用1. 借用方法2. 函數柯里化3. 事件處理五…

【PHP】接入百度AI開放平臺人臉識別API,實現人臉對比

目錄 一、需求 二、準備工作 1、申請服務 2、創建應用&#xff0c;獲取開發密鑰 3、官方開發文檔 4、測試人像圖片 三、PHP接入 1、鑒權&#xff0c;獲取access_token 2、人臉對比 四、完整代碼 一、需求 現在人臉識別、人臉對比技術越來越成熟&#xff0c;使用越來越…

【東楓科技】DreamHAT+

DreamHAT 是一款頂部附加硬件 (HAT) 套件&#xff0c;可為 Raspberry Pi 提供 60GHz 毫米波雷達供您使用。 全尺寸 HAT 包含一個英飛凌 BGT60TR13C 芯片&#xff0c;具有單個發射天線和三個接收器&#xff08;TX/RX&#xff09;&#xff0c;通過 GPIO 引腳和 SPI 連接到 Raspbe…

Spring Boot + MongoDB:從零開始手動配置 MongoConfig 實戰

前言 你以為只要寫上 spring.data.mongodb.*,就能一勞永逸,MongoDB 立馬聽話?別天真,這只是入門級操作,像是拿個自動擋鑰匙,開個小車溜達溜達,遠遠算不上高手操作。當項目需求變得復雜,連接字符串需要靈活配置,或者多數據源并行作戰時,自動配置的魔法顯得捉襟見肘。…

建筑節能目標下,樓宇自控系統以高效運行助力節能減碳

隨著全球氣候變化問題日益嚴峻&#xff0c;節能減排已成為各國政府和企業的重要任務。在建筑領域&#xff0c;樓宇自控系統&#xff08;Building Automation System, BAS&#xff09;作為實現建筑節能目標的關鍵技術&#xff0c;正發揮著越來越重要的作用。根據中國政府發布的《…

LOVON——面向足式Open-Vocabulary的VLN導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作,且解決動態模糊

前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

在線免費的AI文本轉語音工具TTSMaker介紹

TTSMaker是一個在線的文本轉語音工具&#xff0c; 支持多語言和中文方言&#xff0c;不同的語言和方言單次轉換的字符上限從200-10000 不同&#xff0c;轉換的效果還不錯&#xff0c;聽不出明顯的AI痕跡。 工具的網址是&#xff1a;https://ttsmaker.cn/。 工具的界面如上&…

【AI問答】PromQL中interval和rate_interval的區別以及Grafana面板的配置建議

問題1&#xff1a;interval和rate_interval的區別 在PromQL中確實有 $__rate_interval 這個特殊的變量&#xff0c;它與 $__interval 有不同的用途和計算方式。 $__interval vs $__rate_interval 1. $__interval 含義&#xff1a;Grafana計算出的基本時間間隔計算方式&#xff…

STM32學習記錄--Day5

今天了解了&#xff1a;中斷中斷有多個類別包括&#xff1a;USART中斷&#xff0c;I2C中斷等&#xff1b;并通過NVIC來分配中斷的優先級EXTIEXTI的內部結構&#xff1a;EXTI線&#x1f527; ??一、EXTI系統核心架構??1. ??中斷源輸入&#xff08;左上區域&#xff09;??…

CentOS7下同步時間的幾種方式(NTP 、Chrony和systemd-timesyncd)

文章目錄前言一、NTP (Network Time Protocol) & ntpd1.原理2. 安裝與配置(ntp 包)3.NTPd 優缺點對比二、Chrony1.原理2.安裝與配置 (chrony 包)3. 優點4. 缺點三、systemd-timesyncd1.原理2.安裝與配置 (systemd 自帶)3. 優點4. 缺點四、手動同步工具1.ntpdate(已廢棄&…

Web3:在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境

相關文章推薦鏈接Web3專欄https://blog.csdn.net/qq_42392981/category_13016259.html在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境引言1. 開發環境準備&#xff08;Windows&#xff09;1.1 安裝 VSCode1.2 安裝推薦插件1.3 安裝 Foundry1.4 驗證 Forge 和…

Implement recovery based on PITR using dump file and binlog

模擬生產場景中需要基于某個事務點的恢復&#xff0c;使用存量備份與存量binlog 生成測試數據 (rootlocalhost) [(none)]> create database NanJing; Query OK, 1 row affected (0.01 sec) (rootlocalhost) [test]> use NanJing; Database changed (rootlocalhost) [NanJ…

HTML-取消div,a等標簽點擊效果

一、背景當標簽被設置onclick事件之后&#xff0c;在有些手機瀏覽器中&#xff0c;點擊這些標簽&#xff0c;會有點擊變色效果。想要取消點擊變色效果。通過為div和標簽元素添加-webkit-tap-highlight-color樣式屬性&#xff0c;可以有效地解決這一問題二、解決方案已a標簽示例…

VR 三維重建:開啟沉浸式體驗新時代

在科技飛速發展的今天&#xff0c;VR&#xff08;虛擬現實&#xff09;技術已經逐漸滲透到我們生活的各個領域&#xff0c;為我們帶來了前所未有的沉浸式體驗。而 VR 三維重建作為 VR 技術的重要應用之一&#xff0c;更是讓人們能夠身臨其境地感受各種場景&#xff0c;無論是旅…