告别OCR!无需OCR的开源文档提取神器:DocExt,VLM驱动,安全高效!

在日常工作中,我们经常需要从各种文档中提取结构化信息,如发票、护照、合同等。然而,传统的OCR技术在处理复杂文档时常常面临准确率低、格式混乱等问题。

为了解决这些痛点,NanoNets 团队开发了一个开源的本地化工具:Docext ,旨在解决传统OCR技术的局限性。

picture.image

它利用视觉语言模型(VLM)实现无需 OCR 的结构化信息提取,支持发票、护照等敏感文档。它通过本地部署(Linux/MacOS)保障数据隐私,提供自定义字段、表格提取、支持多页文档和REST API集成。

最重要的是开源、免费、灵活性高,你可以在本地无需 OCR、精准提取文档中的字段和表格信息,全面提升处理效率和数据安全性!

主要功能

  • 字段和表格提取 :支持从文档中提取关键字段信息和表格数据,保持原始结构。
  • 自定义和预建模板 :可根据需要定义自定义字段,或使用内置的常见文档类型模板,如发票、护照等。
  • 多页文档支持 :能够处理多页文档,无需分页处理。
  • 置信度评分支持 :为所有提取的信息提供置信度评分,方便评估数据可靠性。
  • REST API 支持 :提供 RESTful API 接口,可轻松集成到你已有的系统或应用。
  • 完全本地部署 :支持在 Linux 和 macOS 系统上本地部署,确保数据安全和隐私。

快速使用

Docext 可直接作为 Python 的第三方库进行安装使用,使用 pip 命令即可快速安装。

picture.image

如果你的本地Python环境都有的情况下,一条命令即可完成:


 
 
 
 
   
pip install docext

下面是官方建议安装步骤与方式:


 
 
 
 
   
# 没有安装uv工具,需要先安装uv  
curl -LsSf https://astral.sh/uv/install.sh | sh  
  
# 创建虚拟环境并激活  
uv venv --python=3.11  
source .venv/bin/activate  
  
# 安装docext  
uv pip install docext  
  
# 或者通过克隆项目进行安装  
git clone https://github.com/nanonets/docext.git  
cd docext  
uv pip install -e .

安装完成后,其实 docext 也包含了一个基于 Gradio 的网页界面,可用于轻松处理文档。

具体启动命令如下:


 
 
 
 
   
# 以默认配置启动Web界面  
python -m docext.app.app  
  
# 以自定义配置启动Web界面  
python -m docext.app.app --model\_name "hosted\_vllm/Qwen/Qwen2.5-VL-7B-Instruct-AWQ" --max\_img\_size 1024

界面可以通过访问 http://localhost:7860 使用。(用户名及密钥默认admin)

同时,docext 还提供了一个 REST API,用于程序化访问文档提取功能。

启动 API 服务器:


 
 
 
 
   
# 增加并发限制以并行处理更多请求,默认值为1  
python -m docext.app.app --concurrency\_limit 10

使用API从文档中提取信息:


 
 
 
 
   
import pandas as pd  
import concurrent.futures  
from gradio\_client import Client, handle\_file  
  
  
def dataframe\_to\_custom\_dict(df: pd.DataFrame) -> dict:  
    return {  
        "headers": df.columns.tolist(),  
        "data": df.values.tolist(),  
        "metadata": None  # Modify if metadata is needed  
    }  
  
def dict\_to\_dataframe(d: dict) -> pd.DataFrame:  
    return pd.DataFrame(d["data"], columns=d["headers"])  
  
  
def get\_extracted\_fields\_and\_tables(  
    client\_url: str,  
    username: str,  
    password: str,  
    model\_name: str,  
    fields\_and\_tables: dict,  
    file\_inputs: list[dict]  
):  
    client = Client(client\_url, auth=(username, password))  
    result = client.predict(  
        file\_inputs=file\_inputs,  
        model\_name=model\_name,  
        fields\_and\_tables=fields\_and\_tables,  
        api\_name="/extract\_information"  
    )  
    fields\_results, tables\_results = result  
    fields\_df = dict\_to\_dataframe(fields\_results)  
    tables\_df = dict\_to\_dataframe(tables\_results)  
    return fields\_df, tables\_df  
  
  
fields\_and\_tables = dataframe\_to\_custom\_dict(pd.DataFrame([  
    {"name": "invoice\_number", "type": "field", "description": "Invoice number"},  
    {"name": "item\_description", "type": "table", "description": "Item/Product description"}  
    # add more fields and table columns as needed  
]))  
  
file\_inputs = [  
    {  
        # "image": handle\_file("https://your\_image\_url/invoice.jpg") # incase the image is hosted on the internet  
        "image": handle\_file("assets/invoice\_test.jpeg") # incase the image is hosted on the local machine  
    }  
]  
  
## send single request  
### client url can be the local host or the public url like `https://6986bdd23daef6f7eb.gradio.live/`  
fields\_df, tables\_df = get\_extracted\_fields\_and\_tables(  
    "http://localhost:7860", "admin", "admin", "hosted\_vllm/Qwen/Qwen2.5-VL-7B-Instruct-AWQ", fields\_and\_tables, file\_inputs  
)  
print("========Fields:=========")  
print(fields\_df)  
print("========Tables:=========")  
print(tables\_df)  
  
  
## send multiple requests in parallel  
# Define a wrapper function for parallel execution  
def run\_request():  
    return get\_extracted\_fields\_and\_tables(  
        "http://localhost:7860", "admin", "admin", "hosted\_vllm/Qwen/Qwen2.5-VL-7B-Instruct-AWQ", fields\_and\_tables, file\_inputs  
    )  
  
# Use ThreadPoolExecutor to send 10 requests in parallel  
with concurrent.futures.ThreadPoolExecutor(max\_workers=10) as executor:  
    future\_results = [executor.submit(run\_request) for \_ in range(10)]  
  
    for future in concurrent.futures.as\_completed(future\_results):  
        fields\_df, tables\_df = future.result()  
        print("========Fields:=========")  
        print(fields\_df)  
        print("========Tables:=========")  
        print(tables\_df)

详细使用文档请参考:https://pypi.org/project/docext/

适用场景

  • 发票管理系统 :批量提取发票编号、抬头、金额、开票时间等字段,替代 OCR
  • 护照/证件信息录入 :提取姓名、证件号、国籍、有效期等敏感字段,全程本地处理更安全
  • 工资条或报销单 :表格字段结构化提取,输出 CSV / JSON
  • 企业表单解析 :支持定制模板批量提取常见企业文件内容
  • 隐私合规处理 :完全本地部署,确保客户信息不出设备

写在最后

Docext 是一款基于视觉语言模型(VLM)的文档结构化信息提取工具。

与传统 OCR 工具不同,它不做字符识别,而是通过 “看懂文档”+“理解结构” 的方式,直接提取你关心的字段、表格、段落等内容,准确率更高、结构更稳定、部署更灵活。

而且目前许多OCR工具需要将文档上传到云端进行处理,这在处理敏感信息时可能带来数据隐私和安全性的问题。而其本地化部署的特性也为处理敏感信息提供了更高的安全性。

特别适合企业自动化和隐私敏感场景。

如果您正在寻找一款无需 OCR 即可从各类文档中提取结构化信息的本地化开源工具,Docext 是一个值得关注的项目。

GitHub 开源地址:https://github.com/NanoNets/docext

picture.image

一款改变你视频下载体验的神器:MediaGo

字节把 Coze 核心开源了!可视化工作流引擎 FlowGram 上线,AI 赋能可视化流程!

英伟达开源语音识别模型!0.6B 参数登顶 ASR 榜单,1 秒转录 60 分钟音频!

开发者的文档收割机来了!这个开源工具让你一小时干完一周的活!

PDF文档解剖术!OCR神器+1,这个开源工具把复杂排版秒变结构化数据!

picture.image

如果本文对您有帮助,也请帮忙点个 赞👍 + 在看 哈!❤️

在看你就赞赞我!

picture.image

0
0
0
0
评论
未登录
暂无评论