智能文档处理(Intelligent Document Processing,简称 IDP)已成为众多行业将大量非结构化数据转化为结构化、可操作信息的关键工作流程。从发票、驾照到各类报告,这些海量的文档数据蕴含着巨大的商业价值,但传统处理方式往往效率低下且准确性难以保证。而谷歌的 Gemini 2.0 模型与开源框架 ExtractThinker 的结合,为解决这一难题带来了新的曙光。

一、智能文档处理的挑战与现状

在传统的 IDP 流程中,将非结构化数据(如发票、驾照和报告等)转化为结构化信息是一项极具挑战性的任务。虽然大型语言模型(LLMs)如今能够直接处理图像和 PDF 文件,但仅仅将图像输入到 LLM 中并期望获得完美的结果往往是不现实的。一个强大的 IDP 管道需要结合多种技术和步骤,包括 OCR 或其他布局提取工具(如 Google Document AI、Tesseract 或 PyPDF)、分类以识别文档类型(发票、合同、执照等)、拆分以处理大型组合文件并将其分解为逻辑部分,以及提取以将信息映射到结构化的 Pydantic 模型(如提取发票编号、日期、总金额或解读图表数据)。然而,实现这样一个完整且高效的 IDP 流程并非易事,不同工具之间的协同、数据处理的准确性和效率等都是需要攻克的难题。

二、Google Document AI:IDP 的重要基石

在深入探讨基于 LLM 的提取之前,不得不提及 Google Document AI。它是谷歌云提供的一种解决方案,具备 OCR、结构解析、分类以及专业领域提取器(如发票解析、W2 表格、银行对账单等)等功能。其定价方面,Document OCR 为每 1000 页 1.50 美元(每月上限 500 万页,更高用量有进一步折扣);Form Parser 和 Custom Extractor 为每 1000 页 30 美元(100 万页 / 月后有折扣);Layout Parser 为每 1000 页 10 美元;预训练的专业处理器(如美国驾照解析器或发票解析器)则按每份文档或每页收费(例如,发票解析每 10 页 0.10 美元)。

当使用 ExtractThinker 时,可以将 DocumentLoaderDocumentAI 附加到基于 LLM 的管道中,实现与 Document AI OCR 或表单解析的统一。这种协同作用十分强大:Document AI 可靠地提取文本,而 Gemini 或其他模型则对这些文本(以及图像)进行解读,以生成高级结构化输出。值得注意的是,在使用时应根据实际情况选择合适的处理器,例如在有视觉功能的情况下,首选 Document OCR 并搭配视觉功能;若视觉功能不可用,则可使用 Layout Parser。

三、Gemini 2.0:多模态模型的新突破

Gemini 2.0 是谷歌多模态模型家族的又一重要进化,支持文本、图像、音频以及先进的 “智能代理” 功能。在 Gemini 2.0 中,有多个变体,其中 Gemini 2.0 Flash 是一款实验性但速度极快的模型,在 IDP 工作流程中表现出色,非常适合从文档中快速提取数据,并能够以低延迟大规模处理文本或图像;Gemini 2.0 Thinking 则是一款更侧重于推理的模型,能够通过更深入的思维链和工具使用来处理极其复杂的任务。

Gemini 2.0 Flash 尤其适合 IDP,原因主要有三点:其一,它速度更快,对于大规模提取任务而言是理想之选;其二,它支持多模态(图像 + 文本)输入,这对于读取扫描页面或图表至关重要;其三,与 “高阶” 模型相比,它能够以较低成本很好地处理简单分类和结构化输出。

四、ExtractThinker:简化 IDP 流程的利器

ExtractThinker 是一个灵活的库,它抽象了构建智能文档处理流程的复杂性,帮助用户通过不同的 DocumentLoader(如 Tesseract、PyPDF、Google Document AI、AWS Textract 等)加载文档,将组合文档拆分为单独的文档,对每个文档进行分类(提供多种策略和方法),并使用基于 Pydantic 的 “Contracts” 提取结构化数据。

五、安装与基本使用

在使用 ExtractThinker 之前,首先需要通过 “pip install extract - thinker” 命令进行安装。以使用 Google Document AI 作为 DocumentLoader 加载 PDF 为例,只需几行代码即可完成初始化和加载操作:

from extract_thinker.document_loader.document_loader_google_document_ai import DocumentLoaderDocumentAI``# 初始化 Google Document AI 的 DocumentLoader``doc_loader = DocumentLoaderDocumentAI(`    `project_id="YOUR_PROJECT_ID",`    `location="us",  # 或 eu`    `processor_id="YOUR_PROCESSOR_ID",`    `credentials="path/to/google_credentials.json"``# 现在加载或提取:``pdf_path = "path/to/your/bulk_documents.pdf"``# 可以直接调用:``pages = doc_loader.load(pdf_path)

数据提取

定义好 DocumentLoader 后,下一步就是提取结构化数据。ExtractThinker 通过基于 Pydantic 的 Contract 来实现这一目标,Contract 是一种描述从文档中提取哪些字段的模式。无论是解析发票中的行项目还是驾照中的字段,工作流程都保持一致。以解析发票为例:

from extract_thinker import Contract``from extract_thinker import Extractor``from pydantic import Field``from typing import List``class InvoiceLineItem(Contract):`    `description: str = Field(description="描述项目")`    `quantity: int = Field(description="购买的项目数量")`    `unit_price: float = Field(description="单价")`    `amount: float = Field(description="该行的总金额")``class InvoiceContract(Contract):`    `invoice_number: str = Field(description="唯一的发票标识符")`    `invoice_date: str = Field(description="发票日期")`    `total_amount: float = Field(description="总金额")`    `line_items: List[InvoiceLineItem] = Field(description="此发票中的项目列表")``# 创建 Extractor 并附加加载器``extractor = Extractor()``extractor.load_document_loader(doc_loader)``# 分配 Gemini 2.0 Flash 模型进行提取``extractor.load_llm("vertex_ai/gemini-2.0-flash-exp")``extracted_invoice = extractor.extract(`    `source=test_file_path,`    `response_model=InvoiceContract,`    `vision=False`                     `# 访问结构化数据``print("发票编号:", extracted_invoice.invoice_number)``print("发票日期:", extracted_invoice.invoice_date)``print("总金额:", extracted_invoice.total_amount)``for item in extracted_invoice.line_items:`    `print(f"项目 {item.description}: x{item.quantity} 单价 ${item.unit_price} 。")

文档分类

在文档分类方面,假设要将文档分类为 “车辆注册” 或 “驾照”,可以为每种类型定义基于 Pydantic 的 Contracts,并将它们映射到 ExtractThinker 中的 Classification 对象。像 Gemini 2.0 Flash 这样的快速模型可以处理大多数文档,但如果其置信度低于某个阈值,可以升级到功能更强大但速度较慢的 Gemini 2.0 Thinking。ExtractThinker 的多层方法可以自动实现这种回退逻辑,在成本效益和强大准确性之间取得平衡。

from extract_thinker.models.classification import Classification``from tests.models.driver_license import DriverLicense``from tests.models.vehicle_registration import VehicleRegistration``driver_license_class = Classification(`    `name="驾照",`    `description="代表驾照的文档",`    `contract=DriverLicense``)``vehicle_registration_class = Classification(`    `name="车辆注册",`    `description="注册车辆所有权的官方文档",`    `contract=VehicleRegistration``)``my_classifications = [driver_license_class, vehicle_registration_class]``# 实现回退方法``from extract_thinker import Extractor``from extract_thinker.document_loader.document_loader_pypdf import DocumentLoaderPyPdf``from extract_thinker.process import Process, ClassificationStrategy``from extract_thinker.models.classification import Classification``# 1. 定义 DocumentLoader``pdf_loader = DocumentLoaderPyPdf()``# 2. 创建两个 Extractor:快速和回退``flash_extractor = Extractor(pdf_loader)``flash_extractor.load_llm("vertex_ai/gemini-2.0-flash-exp")``thinking_extractor = Extractor(pdf_loader)``thinking_extractor.load_llm("vertex_ai/gemini-2.0-thinking-exp")``# 3. 定义分类(例如“车辆注册”和“驾照”)``vehicle_registration = Classification(name="车辆注册", description="...")``driver_license = Classification(name="驾照", description="...")``my_classifications = [vehicle_registration, driver_license]``# 4. 构建一个 Process 并在不同层中添加两个提取器``process = Process()``process.add_classify_extractor([`    `[flash_extractor],     # 第 1 层`    `[thinking_extractor]   # 第 2 层(回退)``])``# 5. 使用 CONSENSUS_WITH_THRESHOLD 策略进行分类,阈值为 0.9``pdf_path = "path/to/document.pdf"``result = process.classify(`    `pdf_path,`    `my_classifications,`    `strategy=ClassificationStrategy.CONSENSUS_WITH_THRESHOLD,`    `threshold=9,  # 即 0.9 的置信度`    `image=False # 如果允许视觉功能,可以在分类中添加``print("分类为:", result.name)``print("置信度:", result.confidence)

文档拆分

在许多 IDP 工作流程中,会涉及到多页 PDF( 或混合文档集。ExtractThinker 提供了拆分策略来自动分割文档,主要有两种策略:EAGER(一次性处理整个文件,预先识别所有拆分点)和 LAZY(逐步比较页面,在处理过程中决定拆分位置)。以 EAGER 拆分为例:

from extract_thinker.process import Process``from extract_thinker.splitter import SplittingStrategy``from extract_thinker.image_splitter import ImageSplitter``# 1. 准备一个 Process``process = Process()``# 2. 分配一个 DocumentLoader(例如 Tesseract、PyPdf 等)或稍后分配一个 Extractor``# 这里我们在提取器级别或流程级别进行操作:``# process.load_document_loader(my_loader)``# 3. 指定使用哪个 Splitter``image_splitter = ImageSplitter(model="vertex_ai/gemini-2.0-flash-exp")``process.load_splitter(image_splitter)``# 4. 提供分类 - 如“发票”与“驾照”``# (已定义为 my_classifications 或来自树结构)``BULK_DOC_PATH = "path/to/combined_documents.pdf"``result = process.load_file(BULK_DOC_PATH)`  `.split(my_classifications, strategy=SplittingStrategy.EAGER)`  `.extract(vision=True)``# 'result' 是一个提取对象的列表,每个对象都匹配一个分类的合同``for doc_content in result:`    `print(f"提取的文档类型: {type(doc_content).__name__}")`    `print(doc_content.json(indent=2))

与 Google Document AI 的 Splitter 相比,ExtractThinker 的拆分方法具有显著优势。Google Document AI 的 Splitter 存在一些限制,例如不支持拆分超过 30 页的逻辑文档,并且仅在页面边界处拆分文档,不会实际拆分 PDF。而 ExtractThinker 没有严格的页面限制,可以通过分块或增量策略(如 lazy)分析任意长度的文件;它集成了分类逻辑,拆分决策可以由 LLM 洞察(如 Gemini 2.0)驱动,而非固定的页面级启发式方法;并且能够在单个工作流程中执行整个管道,包括提取、分类和拆分,同时具备回退逻辑和用于结构化数据的高级基于 Pydantic 的 Contracts。

六、成本考量与性价比分析

在成本方面,虽然谷歌尚未正式公布 Gemini 2.0 基于令牌的定价,但可以参考 Gemini 1.5 模型。在大多数公开预览中,输入令牌为每 100 万令牌 0.075 美元,输出令牌为每 100 万令牌 0.30 美元。例如,如果发送 800 个文本令牌(提示)并接收 500 个令牌(模型响应),总共 1300 个令牌,每页成本约为 0.00021 美元。需要注意的是,输出令牌的价格是输入令牌的 4 倍,并且 Gemini 2.0 的实际价格可能因地区、层级或谷歌的新公告而有所不同。

当结合其他工具时,成本也会有所变化。例如,与 Tesseract 等开源 OCR 结合时,成本通常为 0 美元,与约 1300 令牌的 LLM 请求结合,每页总成本仍约为 0.0002 美元,对于大批量处理来说极其便宜;结合 Google Document AI OCR 或 Layout 时,每页总成本可能在 0.0017 - 0.0102 美元之间;使用 Document AI 专业解析器(如 Layout)时,每 10 页约 0.10 美元(每页 0.01 美元),若还需要 LLM 处理额外字段或进行验证,需再加 0.0002 美元每页的 Gemini 令牌费用,总成本约为 0.0102 美元每页。

对于许多用例来说,结合开源 OCR 或直接使用 LLM 视觉功能的 ExtractThinker 是最具成本效益的解决方案,同时在需要处理签名或具有挑战性的扫描文档时,仍可结合 Google Document AI 的高级 OCR 功能。

通过将 ExtractThinker 与 Gemini 2.0 模型相结合,我们能够构建一个全面的 IDP 工作流程,巧妙地平衡速度、成本和准确性。从文档加载、分类、提取到拆分,所有环节都整合在一个单一、流畅的系统中。无论是处理扫描发票、驾照、多页 PDF 还是其他文档类型,ExtractThinker 在文档智能处理领域都能提供强大的支持,为企业和开发者应对复杂的文档处理任务带来了前所未有的便利和效率提升。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐