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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;无论是旅…