
在数字化办公日益普及的今天,文档信息提取成为了企业和个人处理大量非结构化数据的重要环节。然而,传统的OCR 技术在处理复杂文档时常常面临准确率低、格式混乱等问题,尤其是在处理敏感信息时,数据隐私和安全性也难以保障。为了解决这些痛点,NanoNets 团队开发了一款开源的本地化工具——Docext,它利用视觉语言模型(VLM)实现无需 OCR 的结构化信息提取,为企业和开发者提供了一种高效、安全且灵活的解决方案。

一、项目概述
Docext 是一个无需 OCR 的文档信息提取工具,由 NanoNets 团队开发并开源。它利用视觉语言模型(VLMs)从文档图像中准确识别和提取字段数据和表格信息,支持发票、护照等多种常见文档类型。Docext 旨在通过本地部署的方式,保障数据隐私,同时提供自定义字段、表格提取、多页文档支持和 REST API 集成等功能,全面提升文档处理的效率和安全性。
二、技术原理
(一)视觉语言模型(VLMs)
Docext 的核心在于其利用的视觉语言模型(VLMs)。与传统的 OCR 技术不同,VLMs 能够直接从文档图像中提取信息,而无需先进行字符识别。这种模型通过结合视觉信息和语言理解能力,能够更准确地识别文档中的结构化信息,例如关键字段和表格数据。VLMs 的优势在于其能够理解文档的整体布局和语义,从而在提取信息时保持更高的准确性和稳定性。
(二)智能文档处理排行榜
为了评估不同模型在文档处理任务中的性能,Docext 提供了一个智能文档处理排行榜。该排行榜涵盖了七个关键的文档智能挑战,包括关键信息提取(KIE)、视觉问答(VQA)、光学字符识别(OCR)、文档分类、长文档处理、表格提取和置信度评分校准。通过这些任务的评估,研究人员和实践者可以更全面地了解模型在不同场景下的表现,从而选择最适合其需求的模型。
三、主要功能
(一)字段和表格提取
Docext 能够从各种文档中提取关键字段信息和表格数据,同时保持原始结构。无论是发票中的金额、日期,还是护照中的姓名、国籍,Docext 都能够准确识别并提取出来。此外,它还支持从复杂表格中提取结构化数据,即使表格跨越多页,Docext 也能够自动识别并提取跨页内容。
(二)自定义和预建模板
Docext 提供了高度的灵活性,用户可以根据自己的需求定义自定义字段,或者使用内置的常见文档类型模板,如发票、护照等。这些模板已经经过优化,能够快速启动并满足大多数用户的需求。同时,用户还可以根据实际情况动态添加或删除字段/列,以满足个性化的需求。
(三)置信度评分
为了帮助用户评估提取信息的可靠性,Docext 提供了置信度评分功能。每个提取的字段和表格数据都会附带一个置信度评分,用户可以根据这个评分来判断数据的准确性,从而在必要时进行人工审核或进一步处理。
(四)多页文档支持
在处理长文档时,Docext 能够自动处理多页内容,无需用户手动分页。这使得它特别适合处理合同、研究报告等复杂的长文档,能够有效地提高工作效率。
(五)本地化部署
Docext 支持在 Linux 和 macOS 系统上本地部署,确保数据完全在本地处理,不会上传到云端。这种部署方式极大地保障了数据的隐私和安全性,特别适合处理敏感信息。
(六)REST API 集成
Docext 提供了 RESTful API 接口,可以轻松集成到现有的系统或应用程序中。通过 API,用户可以程序化地访问文档提取功能,实现自动化处理。
四、应用场景
(一)企业自动化
Docext 可以广泛应用于企业的自动化流程中,例如自动处理发票、收据、合同等文档,减少人工干预,提高工作效率。通过 REST API 集成,Docext 可以轻松集成到现有的企业系统中,实现文档处理的自动化。
(二)数据录入与分析
在数据录入和分析方面,Docext 能够从复杂表格中提取结构化数据,为数据分析和决策提供支持。它支持多种文档类型,能够快速提取关键信息,提高数据处理的速度和准确性。
(三)出入境管理
在出入境管理场景中,Docext 可以快速提取护照、签证等证件的关键信息,简化出入境流程。其本地化部署的特性确保了数据的安全性和隐私性,特别适合处理敏感信息。
(四)长文档处理
对于长文档,如研究报告、法律文件等,Docext 能够有效地解析文档内容,提取重要信息以供进一步分析。它支持多页文档处理,能够自动识别并提取跨页内容,提高了长文档处理的效率。
五、快速使用
(一)安装环境
在使用Docext 之前,需要确保安装了以下依赖项:
– Python >= 3.11
– uv 工具(用于创建虚拟环境和安装依赖)
以下是安装步骤:
1. 安装 uv 工具(如果尚未安装):
curl -LsSf https://astral.sh/uv/install.sh | sh
2. 创建虚拟环境并激活:
uv venv --python=3.11
source .venv/bin/activate
3. 安装 Docext:
uv pip install docext
或者通过克隆项目进行安装:
git clone https://github.com/nanonets/docext.git
cd docext
uv pip install -e .
(二)启动Web 界面
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`。
(三)使用REST API
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
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
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
)
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)
六、结语
Docext 是一款基于视觉语言模型(VLM)的智能文档处理工具,它通过无需 OCR 的方式直接从文档图像中提取结构化信息,提供了高效、安全且灵活的解决方案。无论是关键字段提取、表格数据解析,还是多页文档处理,Docext 都能够满足企业和个人的需求。其本地化部署的特性特别适合处理敏感信息,确保数据隐私和安全性。如果你正在寻找一款无需 OCR 即可从各类文档中提取结构化信息的工具,Docext 是一个值得关注的项目。
七、项目地址
GitHub仓库:https://github.com/NanoNets/docext
智能文档处理排行榜:https://idp-leaderboard.org/
(文:小兵的AI视界)