之前汇总过:

这个领域优秀的项目层出不穷,根本学不完。

其他OCR工具/项目:ChineseOCR、TextMoneky、DocPedia、UReader、Pix2struct、Donut、DocTR、OcrLiteOnnx、Unstructured等。

run-llama

优秀的开源社区。

LlamaIndex

开源(GitHub,50.2K Star,7.6K Fork)领先的文档智能体和OCR平台。

AI驱动生成式文档解析技术,专为处理包含表格、图形等嵌入对象的复杂文档而设计。能够高效地解析和提取多种结构化和半结构化数据,从而使文档中的关键信息得以精准、便捷地提取并转化为可用于进一步处理的格式,官方文档

核心特性:

  • 数据连接器:支持130+数据格式和来源(API、PDF、文档、SQL等)
  • 索引与检索:提供向量索引、图索引等多种数据结构
  • 查询引擎:高级检索和查询接口
  • Agent系统:支持智能体和工作流构建

技术架构:

llama-index-core (核心包)
├── 数据加载模块
├── 索引构建模块
├── 检索查询模块
├── Agent系统
└── 集成接口

实战

示例

from llama_parse import LlamaParse
from llama_index.core import Settings
from llama_index.core import StorageContext
from llama_index.core import VectorStoreIndex
from llama_index.core.node_parser import MarkdownElementNodeParser
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.vector_stores.kdbai import KDBAIVectorStore
from llama_index.postprocessor.cohere_rerank import CohereRerank
from getpass import getpass
import os
import kdbai_client as kdbai
from openai import OpenAI

os.environ["LLAMA_CLOUD_API_KEY"] = (
    os.environ["LLAMA_CLOUD_API_KEY"]
    if "LLAMA_CLOUD_API_KEY" in os.environ
    else getpass("LLAMA CLOUD API key: ")
)

os.environ["OPENAI_API_KEY"] = (
    os.environ["OPENAI_API_KEY"]
    if "OPENAI_API_KEY" in os.environ
    else getpass("OpenAI API Key: ")
)

KDBAI_ENDPOINT = (
    os.environ["KDBAI_ENDPOINT"]
    if "KDBAI_ENDPOINT" in os.environ
    else input("KDB.AI endpoint: ")
)
KDBAI_API_KEY = (
    os.environ["KDBAI_API_KEY"]
    if "KDBAI_API_KEY" in os.environ
    else getpass("KDB.AI API key: ")
)
session = kdbai.Session(api_key=KDBAI_API_KEY, endpoint=KDBAI_ENDPOINT)
schema = [
        dict(name="document_id", type="str"),
        dict(name="text", type="str"),
        dict(name="embeddings", type="float32s"),
    ]
indexFlat = {
        "name": "flat",
        "type": "flat",
        "column": "embeddings",
        "params": {'dims': 1536, 'metric': 'L2'},
    }

db = session.database("default")

KDBAI_TABLE_NAME = "LlamaParse_Table"
try:
    db.table(KDBAI_TABLE_NAME).drop()
except kdbai.KDBAIException:
    pass
table = db.create_table(KDBAI_TABLE_NAME, schema, indexes=[indexFlat])

EMBEDDING_MODEL  = "text-embedding-3-small"
GENERATION_MODEL = "gpt-4o"
llm = OpenAI(model=GENERATION_MODEL)
embed_model = OpenAIEmbedding(model=EMBEDDING_MODEL)
Settings.llm = llm
Settings.embed_model = embed_model

pdf_file_name = './LLM_recall.pdf'

parsing_instructions = '''The document titled "LLM In-Context Recall is Prompt Dependent" is an academic preprint from April 2024, authored by Daniel Machlab and Rick Battle from the VMware NLP Lab. It explores the in-context recall capabilities of Large Language Models (LLMs) using a method called "needle-in-a-haystack," where a specific factoid is embedded in a block of unrelated text. The study investigates how the recall performance of various LLMs is influenced by the content of prompts and the biases in their training data. The research involves testing multiple LLMs with varying context window sizes to assess their ability to recall information accurately when prompted differently. The paper includes detailed methodologies, results from numerous tests, discussions on the impact of prompt variations and training data, and conclusions on improving LLM utility in practical applications. It contains many tables. Answer questions using the information in this article and be precise.'''

documents = LlamaParse(result_type="markdown", parsing_instructions=parsing_instructions).load_data(pdf_file_name)
print(documents[0].text[:1000])

node_parser = MarkdownElementNodeParser(llm=llm, num_workers=8).from_defaults()
nodes = node_parser.get_nodes_from_documents(documents)

client = OpenAI()

def embed_query(query):
    query_embedding = client.embeddings.create(
            input=query,
            model="text-embedding-3-small"
        )
    return query_embedding.data[0].embedding

def retrieve_data(query):
    query_embedding = embed_query(query)
    results = table.search(vectors={'flat':[query_embedding]},n=5,filter=[('<>','document_id','4a9551df-5dec-4410-90bb-43d17d722918')])
    retrieved_data_for_RAG = []
    for index, row in results[0].iterrows():
      retrieved_data_for_RAG.append(row['text'])
    return retrieved_data_for_RAG

def RAG(query):
  question = "You will answer this question based on the provided reference material: " + query
  messages = "Here is the provided context: " + "\n"
  results = retrieve_data(query)
  if results:
    for data in results:
      messages += data + "\n"
  response = client.chat.completions.create(
      model="gpt-4o",
      messages=[
          {"role": "system", "content": question},
          {"role": "user", "content": [{"type": "text", "text": messages}]}
      ],
      max_tokens=300,
  )
  content = response.choices[0].message.content
  return content

LiteParse

基于Rust、开源(GitHub,10.4K Star,682 Fork)跨平台本地文档解析工具,专注于快速轻量的空间文本提取;提供多种语言绑定,包括Node.js、TypeScript、Python、Rust和浏览器(WASM),官方文档

采用模块化架构,核心解析逻辑使用Rust实现,通过语言绑定暴露统一的API。其独特的网格投影算法能够精确重建文档布局,支持复杂的多列和表格结构。OCR系统采用选择性触发机制,仅在文本稀疏或检测到图像时运行,在准确性和性能之间取得平衡。

特点

  1. 极速解析:使用PDFium进行空间文本解析,提供高性能的文本提取能力
  2. OCR系统灵活
    • 内置Tesseract:零配置,开箱即用
    • HTTP OCR服务器:支持EasyOCR、PaddleOCR等外部引擎
    • 标准API:OCR API规范简单明了
  3. 精确的空间信息:为每个文本项提供精确的边界框坐标,保留文档的原始布局信息 。
  4. 多格式支持。自动转换多种文档格式:
    • PDF(原生支持)
    • Office文档(DOCX、XLSX、PPTX),需LibreOffice
    • 图片(PNG、JPG、WebP等),需ImageMagick
  5. 截图生成:生成高质量页面截图,为LLM代理提供视觉信息捕获能力。

实战

提供多种语言SDK安装方式:

npm i -g @llamaindex/liteparse
pip install liteparse
cargo install liteparse

使用

# 基本文本提取
lit parse document.pdf
# 输出结构化 JSON(包含边界框)
lit parse document.pdf --format json -o results.json
# 解析特定页面
lit parse document.pdf --target-pages "1-5,10"
# 为 LLM 代理生成截图
lit screenshot document.pdf -o ./screenshots

Python SDK集成:

from liteparse import LiteParse

parser = LiteParse()
result = parser.parse("document.pdf")
print(result.text)

LlamaParse

官网,开源(GitHub,4.3K Star,471 Fork)云端知识智能体,技术架构:结合Azure OpenAI和KDB AI向量数据库,优化语义检索。

定位:商业化的文档智能处理平台,专注于文档解析、提取和Agentic OCR。

产品矩阵:

  • Parse:Agentic OCR和文档解析(支持130+格式)
  • Extract:结构化数据提取
  • Index:文档摄取和RAG流水线
  • Split:大文档智能分割
  • Agents:端到端文档Agent构建

核心功能:

  • 解析含表格/图表的复杂PDF,输出Markdown、LaTeX、Mermaid图表
  • 支持生成知识图谱,企业级安全合规设计

优缺点:

  • 解析精度高,支持半结构化数据语义优化
  • 处理速度较慢,免费额度有限,需API密钥

对比

3个项目对比

维度 LlamaIndex LlamaParse LiteParse
性质 开源框架 商业平台 开源工具
核心功能 RAG/Agent开发 文档解析处理 轻量文档解析
目标用户 开发者、研究者 企业用户 个人开发者
定价 完全免费 免费额度+付费 完全免费
部署 本地/云 云服务为主 本地部署
复杂度 中高
扩展性 极高 中高
支持 社区支持 专业支持 社区支持
文档质量 优秀 卓越 良好
处理规模 可扩展 大规模 小规模

Parsr

AXA开源(GitHub,6.2K Star,324 Fork)的轻量级文档解析工具链,可将PDF、图像、Office文档、EML等多种格式的文档转换为可直接使用的结构化数据(如JSON、Markdown、CSV、Pandas DataFrame、纯文本)。平台侧重文档清洗与层级重建,输出包含标注的文本、段落、表格与元信息,便于下游的数据分析与自动化流水线部署。

适用于文档归档与检索预处理、发票与报表抽取、合同与合规审查、OCR后的结构化数据生成、以及任何需要将非结构化文档转为可分析数据的ETL场景。可在本地或受控私有环境中运行以满足合规与隐私要求。

特性

  • 多格式支持:处理PDF、扫描图像、Office文档与邮件等多种输入格式。
  • 文档清洗与重建:恢复行、段落与层次结构,检测标题、列表、页码、页眉/页脚与链接。
  • 表格与列表识别:提取表格为结构化CSV、PDF格式,支持复杂表格布局识别。
  • 部署友好:提供API、CLI、Docker镜像与可视化查看器,支持私有化部署。
  • 模块化处理链:由清洗、布局分析、OCR接入、表格解析与导出模块组成,易于扩展与替换组件。
  • 多引擎兼容:可接入Tesseract、PDF.js、Camelot等第三方组件以提升识别能力。
  • 可编程接口:提供REST API与Python客户端,方便与数据科学与流水线工具集成。

OpenDoc

复旦大学视觉与学习实验室开源(GitHub,1.4K Star,129 Fork)超轻量文档解析系统OpenDoc-0.1B,在权威基准OmniDocBench v1.5上拿下90.57%的高分。

采用两阶段架构:

  1. 版面分析:基于PP-DocLayoutV2,实现高精度文档元素定位和阅读顺序识别;
  2. 内容识别:采用自研超轻量统一识别算法UniRec-0.1B,支持文本、公式、表格的统一解析与识别。

基于分析得到的关键事实:绝大多数文档的主要内容是文本和公式。在OmniDocBench中,文本和公式区域占所有区域数量97.43%,这两种区域的识别占据87.90%的总解析耗时(使用MinerU2.5时)。

核心观点:如果仅考虑文本和公式识别这两种经典的OCR任务,目前1B-3B参数LLM属于超额配置。如果能采用一个专用小模型统一处理文本和公式识别,则能极大地提升文档解析的整体效率,且有望不牺牲精度。

UniRec40M:为了解决统一文本和公式识别的数据缺口,从Tex源码渲染、PyMuPDF提取数字原生PDF内容、公开数据三个方面构建包含近4000万样本的UniRec40M数据集,涵盖中英双语、多种文档场景(数字文档、扫描件、手写笔记等)和多内容类型(纯文本、公式、混合内容,以及单行、段落、多段内容),让模型在训练阶段就能接触到丰富的真实场景。为了平衡数据,对各场景数据进行重复采样或采样子集用于训练。

适用于内容识别任务两大关键策略

  • 层级监督训练(HST):文档内容天然存在字符、词语、行、段落等层级结构,HST通过插入层级标记,让模型精准理解行、段落、篇章的结构关系,而非只输出平铺文本;
  • 语义解耦分词器(SDT):传统多模态LLM的分词器不适合小模型识别任务,不仅词汇表庞大长尾分布严重,还容易出现语义混淆(如文本和公式里的同一符号含义不同)。SDT专门为文本和公式设计独立分词器,还把词汇表精简到56371个,既解决语义混淆问题,又降低模型训练难度,让小模型也能精准识别。

有了UniRec-0.1B的文本、公式识别能力,进一步拓展,把表格识别也纳入进来。通过构建大规模表格数据、优化分词器,重新训练出能统一识别文本、公式、表格的超轻量统一模型。最后将这款优化后的UniRec-0.1B与PP-DocLayoutV2版面分析结合,形成完整OpenDoc-0.1B文档解析系统。

EasyDoc

EasyLink推出的开源(GitHub,1.1K Star,13 Fork)文档解析工具,基于自研的视觉语义模型,旨在将复杂多样的非结构化数据转化为AI可读的高质量的JSON和Markdown格式。能实现语义理解,保留文档的逻辑和层级结构。能智能解析图片和表格,自动合并跨页内容,解决传统工具无法处理复杂多模态数据的痛点。体验地址

技术:

  • 语义分块: 传统的分块方法往往基于字数、标点或页数等规则,而EasyDoc则「基于语义识别进行分块」,例如将段落、表格、图表及其标题和注释视为独立的语义单元,并且能智能合并跨页或跨栏的内容,确保每个语义单元都是逻辑完整的 。
  • 上下文增强:通过提供层级结构,为每个语义单元赋予文档路径上下文,从而保留全局关联性。极大地提升检索的召回率与准确率,让LLM在理解文档时能够更好地把握其整体脉络。
  • 精准溯源:为了进一步增强LLM可靠性,提供页码和视觉坐标信息,支持LLM高效定位信息源,有效避免幻觉的产生,确保信息的可追溯性和准确性 。

性能:百页文档处理仅需52秒,准确率提高,超过部分通用模型。

优势:

  • 开发者友好:提供简单易用的API和清晰的JSON输出,开发者文档
  • 一键在线体验:无需编程,只需拖拽上传即可在线体验专业的文档解析功能。
  • 多维结果展示:支持JSON、Markdown和层次结构树三种视角全面呈现解析结果。
  • 生态整合:已上架Dify插件商城和华为云商店,方便用户将其集成到现有的AI工作流中,享受企业级服务的可靠保障 。提供完整的中文文档。

功能亮点:布局分析、文档层次结构分析、图像理解、表格理解、文本提取。跨页文本合并、跨页表格合并(输出JSON)、层次结构解析等方面表现出色。

三大解析模式:

  • Lite:适用于快速识别文档布局并提取基础文本结构的用户;
  • Pro:能够智能合并跨页内容,构建完整的文档层次结构,适合对文档结构有更高要求的场景 ;
  • Premium:提供深度解析图表表格的能力,输出更丰富的结构化数据,是处理复杂多模态文档的首选。Markdown输出,适合内容创作和二次编辑 。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐