在当今企业数字化办公的浪潮中,文档信息提取已经成为一项绕不开的核心任务。每天面对海量的发票、合同与报告,传统OCR技术常常让人头疼——复杂版式的识别率忽高忽低,格式混乱不堪,更何况将敏感数据上传至云端带来的隐私隐患。NanoNets团队开源的Docext,正是为了解决这些痛点而诞生。它绕开传统OCR,直接借助视觉语言模型(VLM)从文档图像中“看懂”结构化信息,支持本地部署、安全可控,为企业与开发者提供了一条高效且灵活的新路径。
一、项目概述
Docext是一款无需OCR的文档信息提取工具,由NanoNets团队开发并开源。其核心思路十分直接:利用视觉语言模型(VLMs)从文档图像中精准识别并提取字段数据与表格信息,支持发票、护照等多种常见文档类型。本地部署确保数据隐私始终留在你的机器上,同时它还提供了自定义字段、表格提取、多页文档支持以及REST API集成等功能,大幅提升了文档处理的效率与安全性。
二、技术原理
(一)视觉语言模型(VLMs)
Docext的技术底座是视觉语言模型(VLMs)。与传统OCR不同,VLMs无需先将图片中的文字逐个抠出再识别,而是直接理解图像中的布局与语义,像人眼一样“看懂”文档。这意味着它能更好地处理复杂排版,关键字段与表格数据的提取准确率更高,稳定性也更强。
(二)智能文档处理排行榜
为了帮助用户评估不同模型在真实文档任务中的表现,Docext内置了一个智能文档处理排行榜。该排行榜覆盖七项关键的文档智能挑战:关键信息提取(KIE)、视觉问答(VQA)、光学字符识别(OCR)、文档分类、长文档处理、表格提取以及置信度评分校准。研究人员和开发者可通过这些指标全面了解模型的长处与短板,从而挑选最适合的模型。
三、主要功能
(一)字段与表格提取
Docext能从各类文档中准确提取关键字段与表格数据,并保持原始的结构关系。发票中的金额、日期,护照上的姓名、国籍——各种关键信息都能被精准抓取。遇到跨页的复杂表格,它也能自动识别并拼接内容,无需人工干预。
(二)自定义与预建模板
工具提供了极高的灵活性:用户既可以按需自定义字段,也可以直接使用内置的常见文档模板(如发票、护照)。这些模板经过优化,开箱即用。更贴心的是,用户还能随时动态添加或删除字段/列,以适应不同场景的个性化需求。
(三)置信度评分
每个提取出的字段与表格数据都会附带一个置信度评分,直观反映当前结果的可靠程度。如果分数偏低,可进行人工复核或触发后续校验流程,确保数据质量不失控。
(四)多页文档支持
面对合同、研究报告这类动辄几十页的长文档,Docext能自动处理多页内容,无需用户手动分页。跨页表格、连续字段均可被准确提取,工作效率显著提升。
(五)本地化部署
Docext支持在Linux与macOS系统上本地部署,所有数据均在你的机器上处理,不会上传至任何云端。这一点对处理敏感信息的企业尤为重要——数据隐私与安全完全由你掌控。
(六)REST API集成
它提供了RESTful API接口,可轻松嵌入现有系统或应用程序。通过程序化调用,文档提取流程能实现全自动化,减少人工操作环节。
四、应用场景
(一)企业自动化
在企业内部,Docext可接入发票、收据、合同等文档的自动处理流程。配合REST API,它能与现有ERP、CRM系统无缝对接,让文档流转从手动变为自动,效率大幅提升。
(二)数据录入与分析
在数据录入场景中,Docext能从复杂表格中提取结构化数据,直接供给数据分析工具或决策系统。支持多种文档类型,快速抓取关键信息,数据处理的速度与准确性都上了一个台阶。
(三)出入境管理
在出入境管理这类场景中,Docext可快速提取护照、签证等证件上的关键信息,简化查验流程。本地化部署的特性确保敏感数据不落地外网,安全性与隐私性都得到了保障。
(四)长文档处理
对于研究报告、法律文件等长篇文档,Docext能够有效解析内容,提取重要信息供后续分析。多页文档的自动处理机制,让长文档的解析效率显著提高。
五、快速使用
(一)安装环境
使用Docext前,需确保以下依赖就绪:
- Python >= 3.11
- 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 .
(二)启动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的出现,为企业文档处理提供了一种全新思路:不再依赖传统OCR,而是依靠视觉语言模型直接从图像中“读懂”结构化信息。关键字段提取、表格解析、多页文档处理——这些常见需求它都能应对。加上本地化部署带来的隐私保障,以及灵活的API集成能力,它确实是一个值得关注的开源项目。如果你也受够了OCR的种种限制,不妨试试Docext。
