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

news2024/12/27 12:14:27

大模型相关目录

大模型,包括部署微调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预处理

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脚本并运行

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可处理格式

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 content
    except 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_string
    
    for alt_text, image_url in matches:
        # 获取原始图片文件名
        original_filename = image_url.split('/')[-1]
        
        # 构造新的图片URL
        new_image_url = new_base_url + original_filename
        
        # 替换原始URL为新URL
        old_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:

(base) super@super-SYS-420GP-TNR:~/lyq/PDF-Extract-Kit/temp_out/magic-pdf$

python3 -m http.server --directory=. 6007

效果

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

import subprocess
from PyPDF2 import PdfReader, PdfWriter
import os
import re
from fastapi import FastAPI, HTTPException, Depends


app = 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_string
    
    for alt_text, image_url in matches:
        # 获取原始图片文件名
        original_filename = image_url.split('/')[-1]
        
        # 构造新的图片URL
        new_image_url = new_base_url + original_filename
        
        # 替换原始URL为新URL
        old_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 content
    except 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_name

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.")

@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 uvicorn
    uvicorn.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.coloradmin.cn/o/2036260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows Server 2008至2016远程桌面_SSL/TLS漏洞(CVE-2016-2183)修复步骤详解

文章目录 Windows Server 2008至2016远程桌面_SSL/TLS漏洞(CVE-2016-2183)修复步骤详解1 漏洞说明2 修复办法2.1 打开“本地组策略编辑器”2.2 编辑“SSL密码套件顺序”2.3 修改SSL密码套件算法2.4 重启服务器 Windows Server 2008至2016远程桌面_SSL/TL…

万字详述haproxy高可用

目录 写在前面 1、Haproxy简介 2、Haproxy的安装和基本配置信息 2.1、haproxy的安装 2.2haproxy的基本配置信息 2.2.1基本配置文件global参数 2.2.2基本配置文件proxys的相关参数 2.2.2.1 default的相关参数 2.2.2.2 frontend的相关配置 2.2.2.3 backend的相关配置 …

bert-base-chinese模型的完整训练、推理和一些思考

前言 使用google-bert/bert-base-chinese模型进行中文文本分类任务,使用THUCNews中文数据集进行训练,训练完成后,可以导出模型,进行预测。 项目详细介绍和数据下载 数据集下载地址 Github完整代码 现记录训练过程中的一些感悟…

Android之ProGuard使用

目录 1. 启用 ProGuard2.创建 ProGuard 配置文件3.配置 ProGuard 规则4.常见的 ProGuard 规则5.构建项目6.检查混淆结果7.调试和修复问题 ProGuard 是一种代码混淆和优化工具,通常用于减小 APK 文件大小并保护源代码不被反编译。 1. 启用 ProGuard 在 Android 项目…

Vue.js 3.x 必修课|011|组件属性:提高代码复用性和可维护性(必读+实操)

欢迎关注公众号:CodeFit。 你还没有订阅吗?快动动你的手指,点击订阅《Vue 3.x 必修课| 2024》:http://t.csdnimg.cn/hHRrM,目前持续更新中~🚀🚀🚀 精品内容🥇🥇🥇,物超所值🔥🔥🔥(9.9 元!20+篇内容!)。 Vue3 作为现代前端框架的佼佼者,其组件系…

“想提高网站排名?前端代码优化就是关键!“(SEO)

什么是SEO 搜索引擎优化(Search engine optimization,简称SEO),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的…

2024年,最新前端趋势

随着技术的不断发展,前端开发领域在2024年迎来了新的趋势和挑战。对于开发者来说,紧跟这些趋势不仅能提升技术水平,还能在激烈的市场竞争中脱颖而出。今天,我想向大家介绍一款在这波趋势中脱颖而出的开发神器——MemFire Cloud。这…

【视频讲解】滚动回归Rolling Regression、ARIMAX时间序列预测Python、R实现应用

原文链接: https://tecdat.cn/?p37338 原文出处:拓端数据部落公众号 分析师:Jixin Zhong 本文将通过视频讲解,展示如何用滚动回归预测,并结合一个R语言多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分…

Unity游戏开发

Unity游戏开发 系列文章的目录: 第一章:Hello,Unity! “好读书,不求甚解;每有会意,便欣然忘食。” 本文目录: Unity游戏开发 Unity游戏开发前言今天我们来体验一下unity开发创建第一…

树莓派neo4j在noe4j中将csv文件添加节点

参考前序教程:Raspberry Pi上使用pip来安装py2neo,pip install py2neoerror: externally-managed-environment-CSDN博客 再次进入时 激活虚拟环境: 进入您创建的虚拟环境目录: cd venv然后激活环境: source bin/activa…

【学习笔记】Day 12

一、进度概述 1、《地震勘探原理》第五章 二、详情 个人感觉第五,六,八章的解释更倾向于地质学那边负责的,但是多了解相关原理,肯定是有利于 DL-FWI 的相关研究的,所以这里只是做一个粗略的归纳,相关内容详…

原来这就是KEEPALIVED(高可用集群大讲解)

keepalived可用来解决haproxy挂掉后集群无法使用的问题 一.高可用集群 1.1 集群类型 LB:Load Balance 负载均衡 (lvs和haproxy解决的) LVS/HAProxy/nginx(http/upstream, stream/upstream) HA:High Av…

LTspice 仿真电容阻抗频率特性曲线

一、仿真原理图如图所示,有一个电压源和10uf的电容C1。 二、信号源参数: 三、电容参数,其中包含了耐压值6.3V,ESR,ESL。 四、执行参数为 .ac dec 1000 1 1000Meg,扫频模式。 五、开始仿真,然后设置曲线为下…

【网盘源码】百度云盘手动cookie获取,添加到扫码系统管理平台v3.0版本。

大家好,今天来给大家介绍如何购买适合自己的网盘系统! 角色定位 技术小白 特点: 对技术了解有限,想快速搭建网盘平台。 目的: 单一卖自己的网盘业务,不想投入太多精力在技术维护上。 推荐: 租赁…

基于 Fluent 和深度学习算法驱动的流体力学计算与应用

在深度学习与流体力学融合的背景下,科研边界不断拓展,创新成果层出不穷。从物理模型融合到复杂流动模拟,从数据驱动研究到流场智能分析,深度学习正以前所未有的力量重塑流体力学领域。 目前在 Nature和Science杂志上发表的深度学…

【C++】多源BFS问题和拓扑排序

目录 多源BFS介绍 单源BFS和多源BFS的区别 SO如何解决多源BFS问题 多源之核心 矩阵 算法思路 代码实现 飞地的数量 算法思路 代码实现 地图中的最高点 算法思路 代码实现 地图分析 算法思路 代码实现 拓扑排序介绍 有向无环图 ​编辑 如何解决这类问题 课…

【基础解读】神奇宝贝多分类——Logistic Classification

Classification的三步走 交叉熵损失函数 逻辑回归与线性回归的三步走对比 CE和SE对比 Discriminative与Generative对比 多分类问题 逻辑回顾的限制 特征转换

OneAPI配置自己的令牌并实现python调用

1、登录OneAPI账户(初始账户密码为 账号:root 密码:123456) 2、第一次登录会提示修改密码 3、点击网页渠道 可以配置自己大模型的渠道 4、OneAPI支持多家厂商进行渠道配置,选择不同厂商就可以调用对应大模型 5、渠…

基于Linux对 【进程地址空间】的详细讲解

研究背景: ● kernel 2.6.32 ● 32位平台 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀– 在学习操作系统中想必大家肯定都见过下面这…

如何防止员工私自拷贝公司内部文件?安企神帮你解决泄密之忧

在企业运营中,保护公司的机密信息至关重要。员工私自拷贝公司内部文件不仅可能导致商业秘密泄露,还可能损害公司的声誉和经济利益。下面我们将介绍一些有效的方法来防止这种情况的发生,并以“安企神”软件为例进行详细说明。 1. 明确规章制度…