ExtractThinker
让大模型像读懂人类语言一样读懂任意格式文档的 Python 文档智能库
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
让大模型像读懂人类语言一样读懂任意格式文档的 Python 文档智能库
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
场景切入: 你有一堆发票、合同、身份证扫描件、Excel 报表,想让 AI 自动提取里面的关键信息——但每种文档格式完全不同,传统方案要写一堆解析规则,维护成本极高。
ExtractThinker 就是来解决这个问题的:它像一个「文档翻译官」,把任意格式的文档统一转化为结构化数据,让大模型能像读懂人类语言一样读懂它们。
ExtractThinker 由独立开发者 Julio Almeida(GitHub @enoch3712)创建于 2024 年,是一个 Python 原生的文档智能库。项目的核心理念是「文档即 ORM」——将非结构化的 PDF、图片、网页等文档,用类似数据库查询的方式提取结构化字段。
这个方向之所以值得关注,是因为 RAG(检索增强生成)系统在处理企业内部大量 PDF 文档时,往往只能做简单的文本切分,无法真正「理解」文档中的表格、签名、印章等视觉元素。ExtractThinker 通过接入 Tesseract OCR、Azure Form Recognizer、Google Document AI 等视觉 AI 能力,弥补了这一短板。
ExtractThinker 的设计哲学是「用 Pydantic 契约定义提取目标」。开发者不需要写复杂的解析代码,只需要定义一个 Pydantic 模型作为「提取契约」:
class InvoiceContract(Contract):
invoice_number: str
invoice_date: str
total_amount: float
然后一行代码完成提取:
extractor = Extractor()
extractor.load_document_loader(DocumentLoaderPyPdf())
extractor.load_llm('gpt-4o-mini')
result = extractor.extract('invoice.pdf', InvoiceContract)
底层通过 Instructor + LiteLLM 双引擎驱动:Instructor 负责将 LLM 输出可靠地映射为 Pydantic 实例(而不是靠正则匹配),LiteLLM 提供统一的 LLM 调用接口,支持 OpenAI GPT-4o、Claude、Cohere、Mistral、Phi-3(本地 Ollama)等几乎所有主流模型。这种设计让模型切换成本极低——换一行配置就能换一种 LLM。
ExtractThinker 的核心抽象是 DocumentLoader。当前支持的加载器包括:
| 加载器 | 适用场景 |
|---|---|
| DocumentLoaderPyPdf | 标准 PDF 文字提取 |
| DocumentLoaderTesseract | 扫描件/图片 PDF 的 OCR |
| DocumentLoaderAzureForm | Azure 云端表单识别 |
| DocumentLoaderAWS | AWS Textract 文档分析 |
| DocumentLoaderGoogle | Google Document AI |
| DocumentLoaderMistralOCR | Mistral OCR API |
| DocumentLoaderDocling | IBM Docling 结构化解析 |
| DocumentLoaderUnstructured | Unstructured.io 通用解析 |
这种插件化的架构让用户可以根据数据敏感度和成本选择合适的加载器:本地场景用 Tesseract(免费),高精度需求用云端 AI,企业内网场景用 Docling(本地部署)。
ExtractThinker 还支持「文档分类 + 条件提取」的联合工作流:
classifications = [
Classification(name='Invoice', contract=InvoiceContract, extractor=extractor),
Classification(name='Driver License', contract=DriverLicenseContract, extractor=extractor),
]
result = extractor.classify('document.pdf', classifications, image=True)
系统会先让 LLM 判断文档类型,再根据类型选择对应的契约进行提取。这个设计解决了现实中的「先验知识不足」问题——你不需要预先知道传入的是什么类型的文档。
对于超过几十页的混合文档(如一本合同汇编),ExtractThinker 提供了 ImageSplitter 和 TextSplitter 两种切分策略:
同时,BatchJob 模块支持多文档异步并发处理,配合异步 I/O 可以显著提升吞吐量。
一个容易被忽视的问题是:LLM 提取数据时可能「幻觉」——凭空捏造一个发票号码。ExtractThinker 在 eval/ 目录下提供了专门的评估模块,用于检测模型幻觉率、字段准确率等指标。这是目前同类库(如 LlamaIndex 的文档处理)很少提供的功能。
优势: pip install extract_thinker 一行安装,对 Python >= 3.9 环境友好。代码高度模块化,不需要深入理解 LangChain 也能上手。
限制: 当前版本不支持 Docker/容器化部署,无 Web UI 界面,不适合非技术用户直接使用。对于中国开发者,部分云端加载器(Azure/AWS/Google)需要境外网络访问。
适用场景: 企业内部文档自动化(RPA+AI)、智能合同审查、数据录入机器人、知识库构建中的文档解析层。
ExtractThinker 处于文档智能(Document Intelligence)和 LLM 应用两个赛道的交叉点。随着 Claude 4、Gemini 2.0 等多模态大模型的能力提升,PDF/图片理解成本正在快速下降,类似 ExtractThinker 这样的中间件库的价值在于:它把「选择哪个 LLM」「用哪个加载器」的决策权交给开发者,同时用 Pydantic 契约保证了提取结果的类型安全。
项目当前 1568 stars、156 forks,月均增长约 60 stars,整体处于上升通道。对于需要将大量纸质文档数字化的团队,它是一个值得关注的轻量级选择。