DIfy中集成magic-pdf实现文档解析agent与多模态大模型图文问答

embedded/2024/9/18 12:09:49/ 标签: pdf, 人工智能, 大模型, LLM, python, 文档智能, 图文RAG

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)
  2. 多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)
  3. 多模态大模型Internvl-2-26B的OCR赋能方案(附代码)
  4. miniconda+xinference的大模型推理部署指南
  5. Mem0:大模型最强赋能“有记忆的LLM
  6. 再谈Agent:Dify智能体实现Txet2SQL
  7. Moe模式:或将是最好的大模型应用开发路径
  8. 一文带你了解大模型RAG
  9. 详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)
  10. DIfy中集成magic-pdf实现文档解析agent与多模态大模型图文问答

文章目录

  • 大模型相关目录
  • 前言
  • 技术方案
  • 效果


前言

Dify 是一款开源的大语言模型(LLM)应用开发平台。它结合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者能够快速构建生产级的生成式 AI 应用。Dify 提供了内置的模型支持、Prompt 编排、RAG 引擎、Agent 框架、流程编排等技术栈,以及易用的界面和 API,支持自部署和数据控制。这个平台特别适合于创业公司快速将 AI 应用创意变为现实,也适用于将 LLM 集成到现有业务中,或作为企业级的 LLM 基础设施。

Magic-PDF 是一款将 PDF 转化为 markdown 格式的工具。支持多种前端模型输入;删除页眉、页脚、脚注、页码等元素;符合人类阅读顺序的排版格式;保留原文档的结构和格式,包括标题、段落、列表等;提取图像和表格并在markdown中展示;将公式转换成latex。

本文旨在在dify平台中集成Magic-PDF的pdf转markdown功能,实现文档解析智能体,此外在问答中实现图文对话功能。

技术方案

在这里插入图片描述

pdf预处理

python">def save_first_ten_pages(pdf_path):# 创建一个PdfReader对象input_pdf = PdfReader(pdf_path)# 创建一个PdfWriter对象output_pdf = PdfWriter()# 获取PDF文件的总页数num_pages = len(input_pdf.pages)# 将前10页(或更少,如果PDF不足10页)添加到输出PDF中for page_num in range(min(10, num_pages)):output_pdf.add_page(input_pdf.pages[page_num])# 获取原始PDF文件的名称pdf_file_name = os.path.basename(pdf_path)# 创建新文件的名称,只包含文件名,不包含路径new_file_ab_name = '/home/super/lyq/PDF-Extract-Kit/file_folder/'+f"first_ten_pages_{pdf_file_name}"new_file_name = f"first_ten_pages_{pdf_file_name}"# 写入新的PDF文件with open(new_file_ab_name, "wb") as output_file:output_pdf.write(output_file)return new_file_ab_name

生成sh脚本并运行

python">def write_to_script(file_path):script_content = f"""
source activate
conda deactivate
conda activate pdf_e_k
magic-pdf pdf-command --pdf "{file_path}" --inside_model true
echo 'deal success'
"""with open("/home/super/lyq/pdf-kit-dify/test.sh", "w",encoding='utf-8') as file:file.write(script_content)def run_bash_script(script_path):try:# 运行bash脚本subprocess.run(['bash', script_path], check=True)print(f"Script '{script_path}' executed successfully.")except subprocess.CalledProcessError as e:print(f"An error occurred while executing '{script_path}': {e}")except FileNotFoundError:print(f"Script '{script_path}' not found.")

读取markdown数据并后处理为dify可处理格式

python">def read_markdown_file(file_path):"""读取Markdown文件并返回其内容。参数:file_path (str): Markdown文件的路径。返回:str: Markdown文件的内容。"""try:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()return contentexcept FileNotFoundError:return "文件未找到,请检查路径是否正确。"except Exception as e:return f"读取文件时发生错误: {e}"def url_deal(md_string: str,input_file_name) -> dict:new_base_url: str = f"http://172.20.32.127:6007/{input_file_name}/auto/images/"# 定义Markdown图片语法的正则表达式模式pattern = r'!\[(.*?)\]\((.*?)\)'# 使用正则表达式查找所有匹配项matches = re.findall(pattern, md_string)# 用于存储修改后的字符串modified_string = md_stringfor alt_text, image_url in matches:# 获取原始图片文件名original_filename = image_url.split('/')[-1]# 构造新的图片URLnew_image_url = new_base_url + original_filename# 替换原始URL为新URLold_image_syntax = f'![{alt_text}]({image_url})'new_image_syntax = f'![{alt_text}]({new_image_url})'modified_string = modified_string.replace(old_image_syntax, new_image_syntax)return {"result": modified_string,}

值得注意的是,要使dify能够解析图文,需配合代码在指定路径下启动一个server:

python">(base) super@super-SYS-420GP-TNR:~/lyq/PDF-Extract-Kit/temp_out/magic-pdf$python3 -m http.server --directory=. 6007

效果

汇总代码,上述工具汇总为执行函数并以fastapi形式启动。

python">import subprocess
from PyPDF2 import PdfReader, PdfWriter
import os
import re
from fastapi import FastAPI, HTTPException, Dependsapp = FastAPI()def url_deal(md_string: str,input_file_name) -> dict:new_base_url: str = f"http://172.20.32.127:6007/{input_file_name}/auto/images/"# 定义Markdown图片语法的正则表达式模式pattern = r'!\[(.*?)\]\((.*?)\)'# 使用正则表达式查找所有匹配项matches = re.findall(pattern, md_string)# 用于存储修改后的字符串modified_string = md_stringfor alt_text, image_url in matches:# 获取原始图片文件名original_filename = image_url.split('/')[-1]# 构造新的图片URLnew_image_url = new_base_url + original_filename# 替换原始URL为新URLold_image_syntax = f'![{alt_text}]({image_url})'new_image_syntax = f'![{alt_text}]({new_image_url})'modified_string = modified_string.replace(old_image_syntax, new_image_syntax)return {"result": modified_string,}def read_markdown_file(file_path):"""读取Markdown文件并返回其内容。参数:file_path (str): Markdown文件的路径。返回:str: Markdown文件的内容。"""try:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()return contentexcept FileNotFoundError:return "文件未找到,请检查路径是否正确。"except Exception as e:return f"读取文件时发生错误: {e}"
def save_first_ten_pages(pdf_path):# 创建一个PdfReader对象input_pdf = PdfReader(pdf_path)# 创建一个PdfWriter对象output_pdf = PdfWriter()# 获取PDF文件的总页数num_pages = len(input_pdf.pages)# 将前10页(或更少,如果PDF不足10页)添加到输出PDF中for page_num in range(min(10, num_pages)):output_pdf.add_page(input_pdf.pages[page_num])# 获取原始PDF文件的名称pdf_file_name = os.path.basename(pdf_path)# 创建新文件的名称,只包含文件名,不包含路径new_file_ab_name = '/home/super/lyq/PDF-Extract-Kit/file_folder/'+f"first_ten_pages_{pdf_file_name}"new_file_name = f"first_ten_pages_{pdf_file_name}"# 写入新的PDF文件with open(new_file_ab_name, "wb") as output_file:output_pdf.write(output_file)return new_file_ab_namedef write_to_script(file_path):script_content = f"""
source activate
conda deactivate
conda activate pdf_e_k
magic-pdf pdf-command --pdf "{file_path}" --inside_model true
echo 'deal success'
"""with open("/home/super/lyq/pdf-kit-dify/test.sh", "w",encoding='utf-8') as file:file.write(script_content)def run_bash_script(script_path):try:# 运行bash脚本subprocess.run(['bash', script_path], check=True)print(f"Script '{script_path}' executed successfully.")except subprocess.CalledProcessError as e:print(f"An error occurred while executing '{script_path}': {e}")except FileNotFoundError:print(f"Script '{script_path}' not found.")@app.get("/deal_pdf")
def exe(file_path):new_file_path = save_first_ten_pages(file_path)write_to_script(new_file_path)# 脚本路径bash_script_path = '/home/super/lyq/pdf-kit-dify/test.sh'# 调用函数来运行bash脚本run_bash_script(bash_script_path)name_str = file_path.split('/')[-1].split('.')[0]return f'/home/super/lyq/PDF-Extract-Kit/temp_out/magic-pdf/first_ten_pages_{name_str}/auto/'
@app.get("/tw_content")
def exe2(file_path):name_str = file_path.split('/')[-1].split('.')[0]# 示例用法(假设有一个名为 "example.md" 的Markdown文件)mid_path = f'/home/super/lyq/PDF-Extract-Kit/temp_out/magic-pdf/first_ten_pages_{name_str}/auto/first_ten_pages_{name_str}.md'file_content = read_markdown_file(mid_path)#print(url_deal(file_content))return url_deal(file_content,f'first_ten_pages_{name_str}')if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=6008)
# # Example usage
# file_path = "/home/super/lyq/PDF-Extract-Kit/半年项目创新点总结.pdf"
# print(exe(file_path))
# print(exe2(file_path))

效果如图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此外用户通过局域网也可以访问服务器文件夹进行结果下载、处理。
在这里插入图片描述


http://www.ppmy.cn/embedded/94908.html

相关文章

rustrover打开会报Error: Invalid toolchain

如果 cargo --version 正常输出,但在使用 RustRover 时出现“Invalid toolchain”错误,可能是由于 RustRover 工具链配置有问题或路径指向错误。 解决步骤: 1. 检查 RustRover 的工具链配置 打开 RustRover,进入 Preferences 或…

代码随想录算法训练营第十一天

力扣题部分: 150. 逆波兰表达式求值 题目链接:. - 力扣(LeetCode) 题面: 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 …

力扣面试经典100题

进阶,其他解法 数组 88. 合并两个有序数组 - 力扣(LeetCode) 1、按非递减顺序合并两个数组 从末尾开始,用while分没到两个数组头,到第一个数组头,到第二个数组头三种情况 class Solution { public:voi…

有趣的的rce漏洞复现分析

目录 无字母数字绕过正则表达式 解读代码 解题思路 异或 或 取反 无字母数字绕过正则表达式 首先我们依然是搭建环境&#xff08;环境依然是Ubuntu下部署&#xff0c;和之前的漏洞环境一样&#xff09; <?php error_reporting(0); highlight_file(__FILE__); $code…

ECharts数据可视化 数据集与事件 入门基础知识【2】

echarts一个基于 JavaScript 的开源可视化图表库。其有丰富的图表类型、强大的渲染引擎、专业多维度的数据分析、灵活配置的可视化设计。关于echarts的下载安装以及在项目中使用的基础知识我们前面已经回顾过了&#xff1a; ECharts 数据可视化 入门基本知识 下载安装常用的图表…

NT35510的LCD函数详解02(洋桃电子-触摸屏开发者笔记)

NT35510的LCD函数详解02&#xff08;洋桃电子-触摸屏开发者笔记&#xff09; 矢量图形绘制函数 绘制单点函数 void LCD_Vector_Point(uint16_t x,uint16_t y){//绘制单像素点&#xff08;参数&#xff1a;X坐标&#xff0c;Y坐标&#xff09;LCD_Write_Cursor(x,y);//设置光标…

安装部署vCenter6.5

一、部署vCenter6.5的要求 从vCenter Server 5.5版本开始&#xff0c;vCenter Server对硬件以及操作系统提出了新的要求。比如Windows版vCenter Server 6.0 要求内核若小于8GB会终止安装&#xff1b;Linux版vCenter Server 6.5 配置要求内存超过10GB。 一&#xff09;Windows版…

Web语义化及实际应用

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注&#xff01;今天一起了解下Web语义化及其应用吧&#xff01; 是什么&#xff1f; 使用合适的标签、属性&#xff0c;让页面能“说话“&#xff0c;让人和机器都能快速理解网页内容。 为什么&#xff1f; 有…

JavaScript Date对象

JavaScript Date对象 js 算术 数学对象&#xff1a;用于算术运算 Math.PI&#xff1a;返回圆周率&#xff08;约等于3.14159&#xff09;。 Math.E&#xff1a;返回算术常量 e&#xff0c;即自然对数的底数&#xff08;约等于2.718&#xff09;。 Math.LN2&#xff1a;返回…

漏洞复现-通达OA v11.6 report_bi.func.php SQL注入

看漏洞成因 在自定义函数内首先查找了第一个单引号出现位置然后将出现位置的字符串长度给加到了pos这个变量内 然后循环使用substr截取长度为pos拼接到clean内 然后进入另外一个循环查找单引号和注释符直到没有查找到后跳出循环 最后返回的语句 只要没有跳出循环 clean就继续…

无人机企业甲级服务能力等级证书作用分析

在无人机行业蓬勃发展的今天&#xff0c;企业之间的竞争日益激烈&#xff0c;如何在众多竞争者中脱颖而出&#xff0c;成为行业内的佼佼者&#xff0c;是每个无人机企业都需深思的问题。无人机企业甲级服务能力等级证书&#xff0c;作为行业权威认证&#xff0c;不仅是对企业综…

【Java】文件IO

文章目录 一、什么是文件二、硬盘1. 机械硬盘2. 固态硬盘 三、文件路径四、文件类型 文件 硬盘 系统管理文件&#xff0c;引入一个额专门的模块&#xff0c;“文件系统”&#xff0c;每个文件都有一个“路径”描述文件所在位置 一、什么是文件 此处谈到的文件&#xff0c;本…

缓解新手 R Packages 安装焦虑

文章目录 前言安装 pak安装、更新 CRAN 或 Bioconductor 的工具Reinstall升级更新 R Rackages 从 GitHub 安装从 URL 安装安装本地工具及其依赖项查找、解释依赖 pak 官方文档&#xff1a; 前言 对于一个刚学习生信和使用R的同学来说&#xff0c;安装 R Packages 可能算是一个小…

ChatMoneyAI菜谱大全告诉你如何烹饪

本文由 ChatMoney团队出品 在这个充满科技感的时代&#xff0c;人工智能技术正逐渐渗透到我们生活的方方面面。特别是在烹饪领域&#xff0c;AI菜谱的出现为厨艺不精的人们带来了一线希望。就近发现ChatMoneyAI的全能AI知识库系统就有AI菜谱的功能&#xff0c;以其便捷、智能的…

人工智能GPU算力评估分析

GPU算力评估 一、 关于训练GPU的带宽 大模型训练算力需求&#xff1a;总算力(Tlops)6倍模型参数量训练数据token量&#xff0c;精准高效满足大规模训练需求。 需要把那么计算量和通信量的比例是多少&#xff1f; 3&#xff1a;指的是一次正向两次反向&#xff0c;反向是梯度…

后台管理权限自定义按钮指令v-hasPermi

第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…

Linux笔记 --- 标准IO

系统IO的最大特点一个是更具通用性&#xff0c;不管是普通文件、管道文件、设备节点文件、接字文件等等都可以使用&#xff0c;另一个是他的简约性&#xff0c;对文件内数据的读写在任何情况下都是带任何格式的&#xff0c;而且数据的读写也都没有经过任何缓冲处理&#xff0c;…

Linux下ETCD安装、配置、命令

目录 1. ETCD简介 2. ETCD的安装 2.1 准备环境 2.2 下载ETCD 2.3 解压和移动文件 2.4 验证安装 3. ETCD的配置 3.1 基本配置 3.2 配置文件 3.3 集群配置 4. ETCD的常用命令 4.1 插入键值对 4.2 读取键值对 4.3 删除键值对 4.4 监视键的变化 4.5 列出所有键值 …

Java实现pdf/word文字识别,调用OCR提取图片文字聚合

Tag(name "pdf/word/图片文字识别") public class OcrController extends BaseController {Autowiredprivate OcrService ocrService;Autowiredprivate BaiduOcrServiceImpl baiduOcrService;/*** pdf/word文字识别** param file* return*/PostMapping("/recog…

鸿蒙(API 12 Beta3版)【音频编码】

开发者可以调用本模块的Native API接口&#xff0c;完成音频编码&#xff0c;即将音频PCM编码压缩成不同的格式。 接口不限制PCM数据的来源&#xff0c;开发者可以调用麦克风录制获取、也可以导入编辑后的PCM数据&#xff0c;通过音频编码&#xff0c;输出对应格式的码流&…