Langchain1.0实战:OCR 多模态PDF解析系统(集成MinerU、DeepSeek-OCR、PaddleOCR)

部署运行你感兴趣的模型镜像

Langchain1.0实战:OCR 多模态PDF解析系统

本文将带你完整了解:

  1. 多模态 OCR 的核心诉求与落地权衡
  2. 热门开源 OCR 项目横向对比
  3. 实战:基于 Langchain 1.0 的 多模态PDF解析系统,其中集成了 PaddleOCR、MinerU、DeepSeek-OCR 三大热门 OCR 项目(找 小助理 免费领取完整项目源码)
    演示视频:

多模态文档解析演示视频

一、多模态 OCR 的核心诉求与落地权衡

目前企业在做的大部分业务场景都是以正确识别不同文档类型的内容为前提,比如处理 图片/PDF 等 格式的发票、合同、财报、收据,通过 OCR 把这些文档转换为结构化的数据,为后续的存储、检索、分析做支撑。

就目前的发展来看,单纯“图像 → 文本”的简单转换远远不够的,而是要做到同时理解 视觉(图像)、语言(文本)、版面结构(布局)、场景环境(上下文) 等多模态信息。

对于复杂的 PDF 或图像文档,系统需要能同时识别文字、图像、表格、公式,甚至页面的逻辑结构与阅读顺序。正因如此,企业在落地多模态 OCR 项目时,往往需要在“性能”“生态”“资源开销”“易集成性”等维度之间做权衡。

二、热门开源 OCR 项目对比

MinerU

MinerU:点击进入

MinerU 提供在线 Demo 。试用地址:https://opendatalab.com/OpenSourceTools/Extractor/PDF/

MinerU 由 OpenDataLab(上海人工智能实验室团队)发起,目标是将复杂 PDF 转换为可机读的结构化格式(Markdown / JSON)。其设计并非传统意义上的“OCR 识字”,而是“完整复现文档结构”。

MinerU 的核心价值在于它提供了一条完整的处理管线:

  • 文档预处理:检测语言、页面、扫描状态
  • 内容解析:区分文本、表格、图像与公式(支持公式 LaTeX 输出)
  • 版面还原:修复元素重叠,重建自然阅读顺序
  • 结构化输出:统一导出 Markdown / JSON

MinerU 的主要工作流程分为以下几个阶段:

  1. 输入:接收PDF 格式文本,可以是简单的纯文本,也可以是包含双列文本、公式、表格或图等多模态PDF文件;
  2. 文档预处理(Document Preprocessing):检查语言、页面大小、文件是否被扫描以及加密状态;
  3. 内容解析(Content Parsing)
    • 局分析:区分文本、表格和图像。
    • 公式检测和识别:识别公式类型(内联、显示或忽略)并将其转换为 LaTeX 格式。
    • 表格识别:以 HTML/LaTeX 格式输出表格。
    • OCR:对扫描的 PDF 执行文本识别。
  4. 内容后处理(Content Post-processing):修复文档解析后可能出现的问题。比如解决文本、图像、表格和公式块之间的重叠,并根据人类阅读模式重新排序内容,确保最终输出遵循自然的阅读顺序。
  5. 格式转换(Format Conversion):以 MarkdownJSON 格式生成输出。
  6. 输出(Output):高质量、结构良好的解析文档。

MinerU 实现了三个不同的处理后端,每个后端针对不同的用例和硬件配置进行了优化。其中Pipeline后端是默认的,也是最通用的后端

MinerU 后端默认模型配置

后端类型默认模型适用场景资源需求
VLM-TransformerMinerU2.5-2509-1.2B高精度解析中等 GPU
VLM-SGLangMinerU2.5-2509-1.2B高速推理高端 GPU
PipelinePDF-Extract-Kit-1.0轻量部署CPU 友好

在部署和使用方面,MinerU 支持LinuxWindowsMacOS 多平台部署的本地部署,并且其中用的到布局识别模型OCR 模型公式识别模型表格识别模型都是开源的,我们可以直接下载到本地进行使用。而且,MinerU 项目是完全支持华为昇腾系列芯片的,可适用性非常广。

PaddleOCR-VL

PaddleOCR:点击进入

PaddleOCR 由百度团队基于 PaddlePaddle 框架构建,是生态最成熟的 OCR 工具箱之一。

其最新模块 PaddleOCR-VL 引入了视觉-语言模型(VLM)架构,能够在解析过程中综合考虑图像与文本两种信息。

在解析多模态数据方面,PaddleOCR将这项工作分为个阶段:

  1. 首先检测并排序布局元素。
  2. 使用紧凑的视觉语言模型精确识别每个元素。

第一阶段是执行布局分析(PP-DocLayoutV2),此部分标识文本块、表格、公式和图表。它使用:

  • RT-DETR 用于物体检测(基本上是边界框 + 类标签)。
  • 指针网络 (6 个转换器层)可确定元素的读取顺序 ,从上到下、从左到右等。

最终输出统一模式的图片标注数据,如下图所示:

第二阶段则是元素识别(PaddleOCR-VL-0.9B),这就是视觉语言模型发挥作用的地方。它使用:

  • NaViT 风格编码器 (来自 Keye-VL),可处理动态图像分辨率。无平铺,无拉伸。
  • 一个简单的 2 层 MLP, 用于将视觉特征与语言空间对齐。
  • ERNIE-4.5–0.3B 作为语言模型,该模型规模虽小但速度很快,并且采用 3D-RoPE 进行位置编码

最终模型输出结构化 Markdown 或 JSON 格式的文件用于后续的处理。

这种“布局 + 识别”分离的架构使得 PaddleOCR-VL 比通常的一体化系统更快、更稳定。

另外在多语言支持方面,PaddleOCR 已覆盖 100+ 语种,是国际化项目的常用选择。

DeepSeek-OCR

DeepSeek-OCR:点击进入

DeepSeek 团队在 2025 年推出的 DeepSeek-OCR 聚焦于“以最小资源消耗实现高精度识别”。
模型仅需 7GB 显存即可运行,支持表格、公式、图像文字及图表语义识别。

DeepSeek-OCR 提供基于 Transformers 与 vLLM 的启动示例,可轻松嵌入现有解析管线中。
其提出”光学上下文压缩“技术,达到用远少于传统模型的“视觉 tokens”达到类似或更好的表现。

dots.ocr

dots.ocr:点击进入

由 rednote-hilab 开发的 dots.ocr 采用了单一 VLM 模型(约 1.7B 参数)完成布局检测 + 内容识别 + 阅读顺序排序三合一任务。
用户可通过 prompt 控制模型行为,例如输出版式元素的类别、边界框与文本内容。

这种“Prompt + VLM”模式使系统在多语言、多版式文档中具有极强的通用性。
不过在极复杂表格(跨页、合并单元格)或特殊排版中仍存在一定局限。

综合对比

从企业落地视角来看,这四个项目并无绝对的“优劣之分”,选型应该根据实际需求与资源条件进行评估

项目核心特点
MinerU多模块全流程解析
PaddleOCR-VL双阶段视觉语言模型
DeepSeek-OCR光学上下文压缩技术
dots.ocrPrompt 驱动统一模型

三、实战:基于 Langchain 1.0 的 多模态PDF解析系统

完整项目代码添加 小助理 免费领取,还有更多Agent、数据分析等课程,等你来学

项目基于 Langchain 1.0 框架,集成了 PaddleOCR、MinerU、DeepSeek-OCR 三大热门 OCR 项目

项目演示视频:

MinerU 项目概览与 vLLM 服务接口

本文是在Linux系统下安装MinerU项目并进行文档解析实战。

其他操作系统可以参考如下链接进行自行实践:Windows 10/11 + GPU Docker 部署 ,

1 MinerU 源码安装

CUDA 版本检查

Linux 系统下,通过 nvidia-smi 命令查看 CUDA 版本

CUDA Version 显示的版本号必须 >= 12.1,如显示的版本号小于12.1,请自行升级CUDA 版本。

下载MinerU源码文件

截止目前最新的MinerU项目源码版本为是:2.6.4-released,但当前版本的源码在使用MCP Server时存在一些Bug,所以我们针对源码做了一些修改。因此大家一定要找 小助理 免费领取网盘中的源码文件进行部署和使用。下载后上传至服务器中,解压文件,并进入解压后的文件夹

# 解压
unzip MinurU-master.zip

创建并激活虚拟环境

    cd MinerU-master
    conda create --name mineru_2.5 python==3.11 -y
    conda activate mineru_2.5

安装 MinerU 项目依赖

    pip install -e .[all] -i https://mirrors.aliyun.com/pypi/simple

检查 MinerU 安装

pip show mineru

输出版本号则说明安装成功

下载 MinerU 中用到的模型文件

运行一键下载所有模型文件的脚本

    mineru-models-download

执行该命令需要我们根据自己的需求灵活的选择要下载到本地的模型。其中modelscopehuggingface 是两个不同的模型下载源,我们只需要选择其中一个即可。pipeline指的是用于文档解析的一系列模型,而vlm指的是用于视觉语言模型的模型,即MinerU2.0-2505-0.9B 模型。如果是all,则会全部下载。

MinerU 配置参考

等待下载完成后,所有模型文件的默认存储路径是:

    /root/.cache/modelscope/hub/models/OpenDataLab
2. MinerU 启动vLLM API 推理服务

接下来新打开一个终端,启动mineru-api 服务:

    export MINERU_MODEL_SOURCE=local  # 注意:这里需要将模型源设置为本地
    export CUDA_VISIBLE_DEVICES=3  # 使用 哪一块GPU
    mineru-api --host 192.168.110.131 --port 50000 # 这里换为你的IP
3. MinerU vLLM API服务连接测试及项目实现

下面我们通过一个完整的代码示例,来演示如何调用 OCR 服务。

#!/usr/bin/env python3
"""
测试 MinerU API 的不同 backend
通过 50000 端口调用,传递不同的 backend 参数来使用不同的模型
"""

import requests
import sys
from pathlib import Path

def test_mineru_api(pdf_path: str, backend: str = "pipeline"):
    """
    测试 MinerU API

    Args:
        pdf_path: PDF 文件路径
        backend: 后端类型,可选值:
                - "pipeline" (默认,使用本地 PyTorch)
                - "vlm-vllm-async-engine" (使用 vLLM 加速)
    """
    api_url = "http://192.168.130.4:50000/file_parse"

    print(f"\n{'='*60}")
    print(f"测试 MinerU API with backend: {backend}")
    print(f"{'='*60}")
    print(f"API URL: {api_url}")
    print(f"PDF 文件: {pdf_path}")
    print(f"Backend: {backend}")
    print()

    # 检查文件是否存在
    if not Path(pdf_path).exists():
        print(f"错误: 文件不存在 - {pdf_path}")
        return None

    try:
        # 打开文件并发送请求
        with open(pdf_path, 'rb') as f:
            files = [('files', (Path(pdf_path).name, f, 'application/pdf'))]
            data = {
                'backend': backend,
                'parse_method': 'auto',
                'lang_list': 'ch',
                'return_md': 'true',
                'return_middle_json': 'false',
                'return_model_output': 'false',
                'return_content_list': 'false',
                'start_page_id': '0',
                'end_page_id': '1',  # 只处理前2页,快速测试
            }

            print("发送请求...")
            response = requests.post(
                api_url,
                files=files,
                data=data,
                timeout=300
            )

        # 检查响应
        if response.status_code != 200:
            print(f"请求失败: HTTP {response.status_code}")
            print(f"响应: {response.text[:500]}")
            return None

        # 解析 JSON 响应
        result = response.json()

        # 提取信息
        backend_used = result.get('backend', 'unknown')
        version = result.get('version', 'unknown')
        results = result.get('results', {})

        print(f"请求成功!")
        print(f"   使用的 backend: {backend_used}")
        print(f"   版本: {version}")
        print(f"   结果数量: {len(results)}")

        # 提取 markdown 内容
        if results:
            file_key = list(results.keys())[0]
            md_content = results[file_key].get('md_content', '')

            print(f"\nMarkdown 内容预览 (前500字符):")
            print("-" * 60)
            print(md_content[:500])
            print("-" * 60)

            # 保存 markdown 到文件
            output_file = f"output_{backend}.md"
            with open(output_file, 'w', encoding='utf-8') as f:
                f.write(md_content)
            print(f"\n完整 Markdown 已保存到: {output_file}")

            return md_content
        else:
            print("未找到结果")
            return None

    except Exception as e:
        print(f"测试失败: {e}")
        import traceback
        traceback.print_exc()
        return None
def main():
    # 默认测试文件
    pdf_path = "./2507.05595v1.pdf"


    print(f"\n开始测试 MinerU API 的不同 backend")
    print(f"测试文件: {pdf_path}\n")

    # 测试 1: pipeline backend (本地 PyTorch)
    print("\n" + "="*60)
    print("测试 1: pipeline backend (本地 PyTorch)")
    print("="*60)
    result_pipeline = test_mineru_api(pdf_path, backend="pipeline")

    # 测试 2: vLLM backend (vLLM 加速)
    print("\n" + "="*60)
    print("测试 2: vlm-vllm-async-engine backend (vLLM 加速)")
    print("="*60)
    result_vllm = test_mineru_api(pdf_path, backend="vlm-vllm-async-engine")

    # 总结
    print("\n" + "="*60)
    print("测试总结")
    print("="*60)
    print(f"Pipeline backend: {'成功' if result_pipeline else '失败'}")
    print(f"vLLM backend: {'成功' if result_vllm else '失败'}")

    if result_pipeline and result_vllm:
        print("\n所有测试通过! MinerU 可以通过 backend 参数切换不同模型")

    print("\n💡 提示:")
    print("  - pipeline: 使用本地 PyTorch,适合调试")
    print("  - vlm-vllm-async-engine: 使用 vLLM 加速,速度更快")


if __name__ == "__main__":
    main()

项目中 MinerU 的核心代码逻辑:

MinerU 配置参考

完整项目代码添加 小助理 免费领取,还有更多Agent、数据分析课程,等你来学

PaddleOCR-VL 部署与 vLLM 服务启动

1. 安装 PaddleOCR-VL 并启动 vLLM 服务

创建并激活虚拟环境

    conda create -n ppocr-vllm python=3.11 -y
    conda activate ppocr-vllm

安装 PaddleOCR 工具框架

这里安装 PaddlePaddle 3.2.0 版本。执行如下命令:

    python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/

接下来要重点关注的是:PaddleOCR-VL 使用 safetensors 格式存储模型权重,需要额外安装,同时需要安装指定版本的,执行如下命令

    python -m pip install https://paddle-whl.bj.bcebos.com/nightly/cu126/safetensors/safetensors-0.6.2.dev0-cp38-abi3-linux_x86_64.whl

通过 modelscope 下载PaddleOCR-VL模型

    pip install modelscope

新建一个 download_paddleocr_vl.py 文件,写入如下代码:

    from modelscope import snapshot_download

    # 下载完整模型(包含 PaddleOCR-VL-0.9B 和 PP-DocLayoutV2)
    model_dir = snapshot_download('PaddlePaddle/PaddleOCR-VL', local_dir='.')

运行新建的 download_paddleocr_vl.py 文件,执行如下命令:

   python download_paddleocr_vl.py

下载完成后的模型目录结构如下所示:

安装依赖包

    python -m pip install "paddleocr[doc-parser]"

然后,使用 PaddleOCR CLI 安装 vLLM 的推理加速服务依赖:

    paddleocr install_genai_server_deps vllm

安装 flash-atten 编译包:

    pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu12torch2.8cxx11abiFALSE-cp311-cp311-linux_x86_64.whl

启动vLLM 服务器服务器了。如下代码所示:

    paddlex_genai_server \
    --model_name PaddleOCR-VL-0.9B \
    --backend vllm \
    --host 0.0.0.0 \
    --port 8118

vLLM 服务启动后,保持这个终端窗口运行,不要关闭。同时打开一个新的终端,使用paddlex连接启动的paddleocr-vl服务,首先进行初始化服务配置:

    paddlex --install serving

然后生成 .yaml 配置文件:

    paddlex --get_pipeline_config PaddleOCR-VL

找到 genai_config 配置项,修改为如下所示:

最后,启动 PaddleOCR API 服务:

    paddlex --serve --pipeline PaddleOCR-VL.yaml --port 10800 --host 192.168.110.131 --paddle_model_dir /home/MuyuWorkSpace/02_OcrRag
2. PaddleOCR vLLM API服务连接测试及项目实现

下面我们通过一个完整的代码示例,来演示如何调用 OCR 服务。

import base64
import json
import requests
import os

# === 1. 服务端地址 ===
SERVER_URL = "http://192.168.130.4:10800/layout-parsing"

# === 2. 待处理文件路径 ===
input_path = "./course.pdf"   # 也可以是 test.png
output_md = "result.md"

# === 3. 读取文件并转为 Base64 ===
with open(input_path, "rb") as f:
    file_base64 = base64.b64encode(f.read()).decode("utf-8")

# === 4. 构造 JSON 请求体 ===
payload = {
    "file": file_base64,
    "fileType": 0 if input_path.lower().endswith(".pdf") else 1,
    "prettifyMarkdown": True,
    "visualize": False,
}

headers = {"Content-Type": "application/json"}

# === 5. 发送请求 ===
resp = requests.post(SERVER_URL, headers=headers, data=json.dumps(payload))

# === 6. 解析响应 ===
if resp.status_code == 200:
    data = resp.json()
    if data.get("errorCode") == 0:
        # PDF 的结果在 layoutParsingResults 数组中
        results = data["result"]["layoutParsingResults"]
        md_text = ""
        for i, page in enumerate(results, 1):
            md_text += f"\n\n# Page {i}\n\n"
            md_text += page["markdown"]["text"]

        with open(output_md, "w", encoding="utf-8") as f:
            f.write(md_text)
        print(f"成功生成 Markdown:{output_md}")
    else:
        print(f"服务端错误:{data.get('errorMsg')}")
else:
    print(f"HTTP 错误:{resp.status_code}")
    print(resp.text)

项目中PaddleOCR 的核心代码逻辑:

MinerU 配置参考

DeepSeek-OCR 部署与 vLLM 服务启动

1. DeepSeek-OCR模型下载

创建并激活虚拟环境

    conda create --name deepseek-ocr-vllm python==3.10
    conda activate deepseek-ocr-vllm

接下来,在ModelScope 平台下载 DeepSeek-OCR 模型文件。

    pip install modelscope

新建 download_deepseek_ocr.py 文件,内容如下:

    from modelscope import snapshot_download
    model_dir = snapshot_download('deepseek-ai/DeepSeek-OCR',local_dir='.')

接下来执行如下代码进行模型权重安装:

   python download_deepseek_ocr.py
2. Deepseek-OCR vLLM 项目文件

DeepSeek-OCR通过 vLLM 平台启动,我们是借助DeepSeek-OCR官方提供的项目代码,并做了一些优化和调整,其官方源码下载地址:https://github.com/deepseek-ai/DeepSeek-OCR/tree/main/DeepSeek-OCR-master/DeepSeek-OCR-vllm
小助理 免费领取网盘中的源码文件

其中deepseek_ocr.pyflash_attn-2.7.3+cu12torch2.6cxx11abiFALSE-cp310-cp310-linux_x86_64.whl 使我们给大家提供的两个核心文件,一个用于封装 DeepSeek OCR API 接口,另一个则是离线安装的 fla_ttn 的离线安装包。

pip install flash_attn-2.7.3+cu12torch2.6cxx11abiFALSE-cp310-cp310-linux_x86_64.whl

安装 vLLM 运行 DeepSeek-OCR的依赖包:

pip install -r requirements.txt

启动命令如下:

    python ocr_client.py --model-path /home/data/nongwa/workspace/model/OCR/DeepSeek-OCR --gpu-id 3 --port 8797 --host 192.168.110.131
3. DeepSeek-OCR API 连接测试及项目实现

下面我们通过一个完整的代码示例,来演示如何调用 OCR 服务。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试 DeepSeek-OCR API
直接调用 API 并保存返回的 markdown 和图像数据
"""

import requests
import json
import sys
from pathlib import Path


def test_deepseek_ocr(pdf_path: str, output_dir: str = "./test_output"):
    """
    测试 DeepSeek-OCR API

    Args:
        pdf_path: PDF 文件路径
        output_dir: 输出目录
    """
    # API 配置
    api_url = "http://192.168.130.4:8797/ocr"

    # 确保输出目录存在
    output_path = Path(output_dir)
    output_path.mkdir(parents=True, exist_ok=True)

    print(f"测试文件: {pdf_path}")
    print(f"API 地址: {api_url}")
    print(f"输出目录: {output_dir}")
    print("-" * 60)

    # 读取 PDF 文件
    try:
        with open(pdf_path, 'rb') as f:
            files = {'file': (Path(pdf_path).name, f, 'application/pdf')}

            # API 参数
            data = {
                'enable_description': 'false',  # 是否生成图片描述
            }

            print("发送请求到 DeepSeek API...")

            # 发送请求
            response = requests.post(
                api_url,
                files=files,
                data=data,
                timeout=300
            )

            if response.status_code != 200:
                print(f"API 返回错误: {response.status_code}")
                print(f"错误信息: {response.text[:500]}")
                return False

            # 解析响应
            result = response.json()

            print(f"API 响应成功")
            print(f"响应包含的字段: {list(result.keys())}")
            print("-" * 60)

            # 提取数据
            markdown_content = result.get("markdown", "")
            page_count = result.get("page_count", 0)
            images_data = result.get("images", {})

            print(f"Markdown 长度: {len(markdown_content)} 字符")
            print(f"页数: {page_count}")
            print(f"图像数量: {len(images_data)}")

            if images_data:
                print(f"图像列表:")
                for img_key in list(images_data.keys())[:10]:
                    img_size = len(images_data[img_key])
                    print(f"   - {img_key}: {img_size} 字符 (base64)")

            print("-" * 60)

            # 保存 Markdown
            md_file = output_path / f"{Path(pdf_path).stem}_deepseek.md"
            with open(md_file, 'w', encoding='utf-8') as f:
                f.write(markdown_content)
            print(f"Markdown 已保存: {md_file}")

            # 保存完整响应
            json_file = output_path / f"{Path(pdf_path).stem}_response.json"
            with open(json_file, 'w', encoding='utf-8') as f:
                # 为了避免文件过大,只保存图像的部分信息
                simplified_result = {
                    "markdown": markdown_content,
                    "page_count": page_count,
                    "images_count": len(images_data),
                    "image_keys": list(images_data.keys())
                }
                json.dump(simplified_result, f, ensure_ascii=False, indent=2)
            print(f"响应摘要已保存: {json_file}")

            # 保存图像数据(可选,如果需要)
            if images_data:
                images_file = output_path / f"{Path(pdf_path).stem}_images.json"
                with open(images_file, 'w', encoding='utf-8') as f:
                    json.dump(images_data, f, ensure_ascii=False, indent=2)
                print(f"图像数据已保存: {images_file}")

            # 统计信息
            print("-" * 60)
            print("统计信息:")

            # 统计表格数量
            import re
            table_count = len(re.findall(r'<table>', markdown_content, re.IGNORECASE))
            print(f"   - HTML 表格: {table_count} 个")

            # 统计图片引用
            img_ref_count = len(re.findall(r'!\[.*?\]\(.*?\)', markdown_content))
            print(f"   - Markdown 图片引用: {img_ref_count} 个")

            # 统计行数
            line_count = len(markdown_content.split('\n'))
            print(f"   - Markdown 行数: {line_count} 行")

            print("-" * 60)
            print("测试完成!")

            return True

    except FileNotFoundError:
        print(f"文件不存在: {pdf_path}")
        return False
    except requests.exceptions.Timeout:
        print(f"请求超时")
        return False
    except Exception as e:
        print(f"发生错误: {e}")
        import traceback
        traceback.print_exc()
        return False


def main():
    """主函数"""


    success = test_deepseek_ocr(
        pdf_path='./course.pdf', 
        output_dir='./')


if __name__ == "__main__":
    main()

项目中DeepSeek-OCR 的核心代码逻辑:

MinerU 配置参考

OCR 多模态解析系统

后端服务启动

需要依次执行如下操作:
配置环境变量 (.env 文件)

    # Server Configuration
    PORT=8000
    HOST=0.0.0.0
    DEBUG=True

    # MinerU Configuration
    MINERU_API_URL=http://192.168.110.131:50000/file_parse
    VLLM_SERVER_URL=http://192.168.110.131:40000
    MINERU_BACKEND=vlm-vllm-async-engine
    MINERU_TIMEOUT=600
    MINERU_VIZ_DIR=/home/MuyuWorkSpace/05_OcrProject/backend/mineru_visualizations

    # DeepSeek OCR Configuration
    DEEPSEEK_OCR_API_URL=http://192.168.110.131:8797/ocr

    # PaddleOCR Configuration
    PADDLEOCR_API_URL=http://192.168.110.131:10800/layout-parsing

    # File Upload Limits
    MAX_FILE_SIZE=10485760
    ALLOWED_FILE_TYPES=application/pdf,image/png,image/jpeg,image/jpg,image/webp

    # CORS Settings
    ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173

启动后端服务

    cd backend

    # 创建并激活虚拟环境
    python -m venv venv
    source venv/bin/activate  # Linux/Mac
    # 或
    venv\Scripts\activate     # Windows

    # 安装依赖
    pip install -r requirements.txt
    # 启动服务
    python main.py

其中:

配置说明

配置项说明
MINERU_BACKENDpipeline: 使用本地 PyTorch
vlm-vllm-async-engine: 使用 vLLM 加速
VLLM_SERVER_URLvLLM 服务器地址(仅在使用 vLLM 时需要)
MINERU_API_URLMinerU API 服务地址
前端服务启动

需要依次执行如下操作:

    # 1. 进入前端目录
    cd frontend

    # 2. 安装依赖
    npm install

    # 3. 启动开发服务器
    npm run dev

启动成功后,即可通过http://localhost:3000访问应用。

您可能感兴趣的与本文相关的镜像

Vllm-v0.11.0

Vllm-v0.11.0

Vllm

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务,可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「PagedAttention」,有效地管理注意力键和值

<think>我们正在讨论使用 DeepSeek-VL 或其他多模态模型进行 PDF 图片解析的方法。用户的需求很明确:由于 DeepSeek-R1 不支持多模态输入(如图像),因此需要借助 DeepSeek-VL 等视觉语言模型来解析 PDF 中的图像内容。 根据引用内容,DeepSeek-VL 系列(特别是 DeepSeek-VL2)是一个强大的多模态模型,它在文档理解(如 DocVQA、ChartQA 等)方面表现优异。同时,引用[4]提到了 DeepSeek-OCR,这是一个专注于文档解析OCR 模型,采用“上下文光学压缩”的设计思路。 以下是分步骤的解析方法说明: --- ### 🧠 方法一:使用 DeepSeek-VL 进行端到端 PDF 图片解析 DeepSeek-VL 支持图像和文本的联合输入,可以直接对 PDF 转成的图像进行内容理解: 1. **PDF 转图像** 使用工具(如 PyMuPDFpdf2image)将 PDF 每一页转为图像(PNG/JPEG格式): ```python from pdf2image import convert_from_path images = convert_from_path("document.pdf", dpi=300) # 高分辨率确保文字清晰 ``` 2. **调用 DeepSeek-VL API 解析图像** 通过官方 API 发送图像并获取解析结果(当前 DeepSeek-VL 尚未开放 API,但可参考开源实现[^2]): ```python from PIL import Image import requests # 使用开源 HuggingFace 镜像站提供的模型(示例) API_URL = "https://ai.gitcode.com/hf_mirrors/deepseek-ai/deepseek-vl2" headers = {"Authorization": "Bearer YOUR_TOKEN"} def query_vl(image_path, question="解析图片中的文字和图表"): with open(image_path, "rb") as f: image_data = f.read() response = requests.post( API_URL, headers=headers, files={"image": image_data}, data={"question": question} ) return response.json() # 解析第一页 result = query_vl("page1.png") print(result["answer"]) ``` 3. **处理复杂文档** - 对于多页文档:逐页处理并合并结果 - 针对表格/图表:使用特定 prompt 增强解析效果,例如: > "请将下图中的表格转换为 Markdown 格式,并解释柱状图趋势" --- ### ⚙️ 方法二:结合 DeepSeek-OCR 进行高精度文本提取 引用[4]提到 DeepSeek-OCR 采用 **上下文光学压缩(Contextual Optical Compression)** 技术,适合处理复杂版式文档1. **文本检测与识别** 使用 DeepSeek-OCR 提取 PDF 图像中的文本和位置信息: ```python # 伪代码示例(等待官方开源) from deepseek_ocr import DeepSeekOCR ocr = DeepSeekOCR() results = ocr.recognize("page1.png") # 输出结构化的文本块(含坐标和内容) for block in results: print(f"位置: {block['bbox']}, 文本: {block['text']}") ``` 2. **与 LLM 协同工作流** 将 OCR 结果输入 DeepSeek-R1 进行语义理解: ```mermaid graph LR A[PDF转图像] --> B[DeepSeek-OCR提取文本] B --> C{是否需要深度解析?} C ----> D[构造Prompt+文本送入DeepSeek-R1] C ----> E[直接输出结构化文本] ``` --- ### 📊 性能对比:DeepSeek-VL vs. 其他方案 | 模型 | 优势 | 适用场景 | |--------------------|-----------------------------|----------------------------| | **DeepSeek-VL** | 端到端理解图文混合内容 | 需同时解析文字和图表语义的场景 | | **DeepSeek-OCR** | 高精度文字定位、复杂版式处理 | 法律合同/学术论文的格式还原 | | PaddleOCR-VL | 中文场景优化、部署轻量化 | 移动端/嵌入式设备文档识别 | > 💡 提示:对于纯文本 PDF,优先使用 `PyPDF2` 或 `pdfplumber` 直接提取,效率更高。 --- ### 🚀 部署建议 1. **云服务方案** 等待 DeepSeek 开放官方 VL API(预计2024 Q3),届时可直接调用。 2. **本地部署** 若需立即使用,可通过以下渠道: - DeepSeek-VL2 开源地址:[https://ai.gitcode.com/hf_mirrors/deepseek-ai/deepseek-vl2](https://ai.gitcode.com/hf_mirrors/deepseek-ai/deepseek-vl2)[^2] - 硬件要求:至少 24GB VRAM(如 RTX 4090/A100) 3. **混合流程示例**(OCR + LLM) ```python # 使用 OCR 提取文本 extracted_text = run_ocr("document_page.png") # 构造解析指令 prompt = f"""请解析以下从PDF提取的文本,按章节整理为Markdown: {extracted_text} """ # 调用 DeepSeek-R1 完成结构化 response = client.chat.completions.create( model="deepseek-r1", messages=[{"role": "user", "content": prompt}] ) print(response.choices[0].message.content) ``` --- ### ❓ 相关问题 1. DeepSeek-VL 能否直接处理 PDF 文件而不需要转图像? 2. 如何提高 DeepSeek-OCR 对模糊扫描文档识别准确率? 3. 本地部署 DeepSeek-VL2 的最低硬件配置要求是什么? 4. 是否有现成的工具将 PDF 解析结果导出为 Word/Excel? 5. DeepSeek-VL解析数学公式时效果如何? > 最新进展请关注 [DeepSeek 开源社区](https://github.com/deepseek-ai)[^2] </think> 以下是使用 **DeepSeek-VL** 或其他多模态模型进行 **PDF 图片解析**的完整方法指南,结合引用内容和实际技术方案: --- ### 一、PDF 图片解析的核心挑战 PDF 中的内容可分为两类: 1. **文本型 PDF**:可直接通过 PDF 解析库(如 `PyPDF2`)提取文字。 2. **扫描件/图片型 PDF**:需先用 **OCR(光学字符识别)** 提取文字,再结合多模态模型理解图文语义[^4]。 > 由于 DeepSeek-R1 **不支持多模态输入**,需使用 **DeepSeek-VL** 或类似视觉语言模型(VLMs)解析图片内容。 --- ### 二、使用 DeepSeek-VL 解析 PDF 图片的流程 #### 步骤 1:将 PDF 转为图像 使用工具将 PDF 每页转为高清图像(PNG/JPG),确保文字清晰: ```python from pdf2image import convert_from_path images = convert_from_path("input.pdf", dpi=300) # 高分辨率防失真 for i, image in enumerate(images): image.save(f"page_{i+1}.png", "PNG") ``` #### 步骤 2:调用 DeepSeek-VL 解析图像内容 DeepSeek-VL 支持 **图像+文本联合输入**,可直接理解图中的文字、表格、图表等[^1][^3]。 **开源实现参考**(需本地部署或使用 HuggingFace): ```python from transformers import AutoProcessor, AutoModelForVision2Seq from PIL import Image # 加载 DeepSeek-VL 模型(以 deepseek-ai/deepseek-vl-1.3b 为例) processor = AutoProcessor.from_pretrained("deepseek-ai/deepseek-vl-1.3b") model = AutoModelForVision2Seq.from_pretrained("deepseek-ai/deepseek-vl-1.3b") # 解析图像 image = Image.open("page_1.png") prompt = "详细描述图片中的文字和图表内容,包括所有数据和表格结构" inputs = processor(text=prompt, images=image, return_tensors="pt") outputs = model.generate(**inputs, max_new_tokens=512) result = processor.decode(outputs[0], skip_special_tokens=True) print("解析结果:", result) ``` #### 步骤 3:处理复杂场景 - **表格提取**:追加 prompt `"将下图中的表格转换为 Markdown 格式,保留表头和数据"` - **图表分析**: `"解释此柱状图的趋势,并提取数值"` - **多页文档**:逐页解析后合并结果 --- ### 三、替代方案:DeepSeek-OCR + LLM 协同工作流 若需更高精度的文字提取,可先用专用 OCR 模型,再送入文本模型(如 DeepSeek-R1): ```mermaid graph LR A[PDF转图像] --> B[DeepSeek-OCR 提取文字] B --> C{是否需语义理解?} C ----> D[文字+问题 → DeepSeek-R1] C ----> E[直接输出结构化文本] ``` **优势**: - DeepSeek-OCR 采用 **上下文光学压缩技术**,对模糊/倾斜文本鲁棒性强 - 适合合同、发票等结构化文档 --- ### 四、其他多模态模型对比 | 模型 | 适用场景 | 部署难度 | PDF 解析效果 | |---------------------|----------------------------|-----------|-------------| | **DeepSeek-VL** | 图文混合理解、图表分析 | 中等 | ⭐⭐⭐⭐☆ | | **DeepSeek-OCR** | 高精度文字提取 | 低(API) | ⭐⭐⭐⭐⭐ | | LLaVA-Next | 开放域问答 | 高 | ⭐⭐⭐☆☆ | | PaddleOCR-VL | 中文文档/表格 | 低 | ⭐⭐⭐⭐☆ | > 💡 **推荐策略**: > - 通用解析:直接用 DeepSeek-VL > - 财务/法律文档DeepSeek-OCRDeepSeek-R1 --- ### 五、部署与优化建议 1. **硬件要求** - DeepSeek-VL-1.3B:至少 8GB VRAM(如 RTX 3080- DeepSeek-OCR:CPU 即可运行 2. **效果提升技巧** - 添加系统提示词: `"你是一名专业文档解析助手,需精确提取文字并描述图表"` - 对模糊图像使用超分辨率重建(如 Real-ESRGAN) 3. **PDF 解析完整工具链** ```python # 结合 OCRVL 的混合方案 from deepseek_ocr import extract_text from deepseek_vl import analyze_image def parse_pdf_page(image_path): text_data = extract_text(image_path) # OCR 提取 if contains_table(text_data): # 检测表格 return analyze_image(image_path, prompt="转换表格为CSV") else: return text_data ``` --- ### ❓ 相关问题 1. DeepSeek-VL 能否直接解析 **加密 PDF**? 2. 如何提高 DeepSeek-OCR 对 **手写体文档** 的识别率? 3. 本地部署 DeepSeek-VL 的 **最低硬件配置** 是什么? 4. 是否有现成工具将 PDF 解析结果导出为 **Word/Excel**? 5. DeepSeek-VL解析 **数学公式** 时效果如何? > 更多技术细节可参考 [DeepSeek-VL 开源地址](https://ai.gitcode.com/hf_mirrors/deepseek-ai/deepseek-vl2)[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值