目 录CONTENT

文章目录

使用 SageMaker AI 和 SWIFT 对多页文档进行视觉语言模型微调以实现文档到 JSON 的转换

Administrator
2025-11-11 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://aws.amazon.com/blogs/machine-learning/fine-tune-vlms-for-multipage-document-to-json-with-sagemaker-ai-and-swift/

原文作者:Nick McCarthy, Arlind Nocaj, Irene Marban, and Malte Reimann


从发票、收据和表格等多页文档中提取结构化数据是一个长期存在的业务挑战。格式、布局、语言和供应商的差异使得标准化变得困难,而手动数据录入速度慢、容易出错且缺乏可扩展性。传统的光学字符识别(OCR)和基于规则的系统在处理这种复杂性时往往力不从心。例如,一家地区性银行可能需要处理数千份不同的文档——贷款申请、纳税申报单、工资单和身份证件——其中手动方法会造成瓶颈并增加出错的风险。智能文档处理(IDP)旨在通过使用人工智能来分类文档、提取或推导出相关信息,并验证提取的数据,以便在业务流程中使用,从而解决这些挑战。其核心目标之一是将非结构化或半结构化文档转换为可用的、结构化的格式,如JSON,其中包含特定的字段、表格或其他结构化目标信息。目标结构需要保持一致,以便可以作为工作流程或任何其他下游业务系统的一部分,或用于报告和洞察生成。

下图展示了工作流程,该流程涉及摄取非结构化文档(例如,来自具有不同布局的多个供应商的发票)并提取相关信息。尽管文档之间的关键词、列名或格式存在差异,但系统会将提取的数据规范化并输出为一致的、结构化的JSON格式。

Intelligent Document Processing - High-level Flow

视觉语言模型(VLM)标志着IDP的革命性进步。VLM将大型语言模型(LLM)与专业化的图像编码器集成在一起,创造了文本推理和视觉解释的真正多模态AI能力。与传统的文档处理工具不同,VLM更全面地处理文档——同时分析文本内容、文档布局、空间关系和视觉元素,其方式更接近人类的理解。这种方法使VLM能够以前所未有的准确性和上下文理解能力从文档中提取意义。对于有兴趣探索该技术基础的读者,Sebastian Raschka的帖子——理解多模态LLM——为多模态LLM及其功能提供了极好的入门介绍。

本文主要包含四个部分,反映了我们工作的主要贡献,包括:

  1. 对各种可用IDP方法的概述,包括微调作为可扩展方法的选项(我们推荐的解决方案)。
  2. 使用Amazon SageMaker AI和用于微调各种大型模型的轻量级工具包SWIFT框架,对VLM进行文档到JSON转换的示例代码。
  3. 开发一个评估框架来评估处理结构化数据的性能。
  4. 讨论可能的部署选项,包括部署微调适配器的明确示例。

SageMaker AI是一项完全托管的服务,用于大规模构建、训练和部署模型。在本文中,我们使用SageMaker AI对VLM进行微调,并部署它们以进行批处理和实时推理。

先决条件

在开始之前,请确保您已完成以下设置,以便能够成功遵循本文和随附的GitHub存储库中概述的步骤:

  1. AWS 账户:您需要一个有效的AWS账户,并拥有在SageMaker AI、Amazon Simple Storage Service (Amazon S3)Amazon Elastic Container Registry (Amazon ECR)中创建和管理资源的权限。
  2. IAM 权限:您的IAM用户或角色必须具有足够的权限。对于生产设置,请遵循IAM中的安全最佳实践中所述的最小权限原则。对于沙盒设置,我们建议以下角色:
    • 对Amazon SageMaker AI的完全访问权限(例如,AmazonSageMakerFullAccess)。
    • 对S3存储桶的读/写访问权限,用于存储数据集和模型工件。
    • 从Amazon ECR推送和拉取Docker镜像的权限(例如,AmazonEC2ContainerRegistryPowerUser)。
    • 如果使用特定的SageMaker实例类型,请确保您的服务配额足够。
  3. GitHub 存储库:从我们的GitHub 存储库克隆或下载项目代码。此存储库包含本文引用的笔记本、脚本和Docker工件。
    • git clone https://github.com/aws-samples/sample-for-multi-modal-document-to-json-with-sagemaker-ai.git
  4. 本地环境设置:
    • Python:推荐使用Python 3.10或更高版本。
    • AWS CLI:确保已安装AWS Command Line Interface (AWS CLI),并使用具有必要权限的凭证进行了配置。
    • Docker:如果要构建用于部署的自定义Docker容器,则必须在本地机器上安装并运行Docker。
    • Jupyter Notebook 和 Lab:用于运行提供的笔记本。
    • 通过在克隆的存储库的根目录中运行pip install -r requirements.txt来安装所需的Python包。
  5. 熟悉度(推荐):
    • Python 编程基础知识。
    • 熟悉AWS服务,尤其是SageMaker AI。
    • LLM、VLM和容器技术的概念知识将有益。

文档处理和生成式AI方法的概述

智能文档处理中存在不同程度的自主性。在光谱的一端是完全手动流程:人工阅读文档并通过计算机系统使用计算机系统输入信息。如今大多数系统是半自主文档处理解决方案。例如,一个人拍摄收据照片并将其上传到计算机系统,该系统会自动提取部分信息。目标是实现完全自主的智能文档处理系统。这意味着降低错误率并评估特定用例的错误风险。AI通过实现更高水平的自动化,正在显着改变文档处理。存在多种方法,其复杂性和准确性各不相同——从用于OCR的专业模型到生成式AI

不依赖生成式AI的专业OCR模型被设计为预训练的、特定任务的ML模型,它们擅长从常见文档类型(如发票、收据和ID)中提取结构化信息,如表格、表单和键值对。Amazon Textract就是此类服务的一个示例。此服务开箱即用即可提供高准确性,并且只需要最少的设置,非常适合需要基本文本提取、且文档结构变化不大的工作负载。

然而,随着您增加文档的复杂性和可变性,并增加多模态性,使用生成式AI可以帮助改进文档处理管道。

虽然强大,但将通用VLM或LLM应用于文档处理并不简单。有效的提示工程对于指导模型很重要。处理大量文档(扩展)需要高效的分批处理和基础设施。由于LLM是无状态的,为每个文档提供历史上下文或特定的模式要求可能很麻烦。

使用LLM或VLM的智能文档处理方法分为四类:

  • 零样本提示(Zero-shot prompting):基础模型(FM)接收先前OCR的结果或PDF以及执行文档处理任务的指令。
  • 少样本提示(Few-shot prompting):FM接收先前OCR或PDF的结果、执行文档处理任务的指令以及一些示例。
  • 检索增强型少样本提示(Retrieval-augmented few-shot prompting):与前面的策略类似,但发送给模型的示例是使用检索增强生成(RAG)动态选择的。
  • 微调VLM

下图中可以看到努力和复杂性与任务准确性之间的关系,展示了从基本的提示工程到先进的微调等不同技术如何影响大型和小型基础模型与专业解决方案的性能(灵感来源于博客文章比较LLM微调方法

Fine-tuning methods by complexity

当您沿着水平轴移动时,策略的复杂性增加,当您沿着垂直轴向上移动时,整体准确性提高。通常,在需要提示工程的策略中,大型基础模型比小型基础模型提供更好的性能,但是正如我们在本文的结果中所解释的,对小型基础模型进行微调可以为特定任务提供与对大型基础模型进行微调类似的结果。

零样本提示

零样本提示是一种使用语言模型的技术,其中模型在没有事先示例或微调的情况下获得任务。相反,它完全依赖于提示的措辞和其预先训练的知识来生成响应。在文档处理中,这种方法涉及向模型提供PDF文档的图像、从PDF中提取的OCR文本或文档的结构化markdown表示形式,并提供执行文档处理任务以及所需输出格式的指令。

Amazon Bedrock Data Automation使用生成式AI进行零样本提示来执行IDP。您可以使用Bedrock Data Automation来自动化多模态数据(包括包含文本和复杂结构(如表格、图表和图像)的文档)到结构化格式的转换。您可以通过使用自然语言或模式编辑器指定输出需求的蓝图来受益于定制功能。Bedrock Data Automation还可以提取已识别实体的边界框,并将文档适当地路由到正确的蓝图。可以通过单个API配置和使用这些功能,使其比基本零样本提示方法强大得多。

虽然开箱即用的VLM可以有效地处理一般OCR任务,但它们通常难以处理自定义文档(例如,来自不同供应商的发票)的独特结构和细微差别。虽然为单个文档精心设计提示可能很简单,但数百种供应商格式的可变性使得提示迭代成为一项劳动密集型且耗时的过程。

少样本提示

进入更复杂的方法,您有少样本提示,这是一种与LLM一起使用的技术,其中在提示中提供少量示例以指导模型完成特定任务。与仅依赖自然语言指令的零样本提示不同,少样本提示通过示例演示所需的输入-输出行为来提高准确性和一致性。

一种替代方法是使用Amazon Bedrock Converse API来执行少样本提示。Converse API提供了一种使用Amazon Bedrock访问LLM的一致方法。它支持用户与生成式AI模型之间的基于轮次的消息传递,并允许将文档作为内容的一部分包含在内。另一个选项是使用Amazon SageMaker Jumpstart,您可以使用它来部署来自HuggingFace等提供商的模型。

然而,您的企业很可能需要处理不同类型的文档(例如,发票、合同和手写笔记),即使在一种文档类型中也存在许多变体,例如,没有单一标准化的发票布局,而是每个供应商都有自己的布局,而您无法控制。找到一个或几个示例来涵盖所有要处理的不同文档是非常具有挑战性的。

检索增强型少样本提示

解决寻找正确示例挑战的一种方法是在运行时动态检索先前处理的文档作为示例并将其添加到提示中(RAG)。

您可以将一些已注释的样本存储在向量存储中,并根据需要处理的文档从中检索它们。Amazon Bedrock Knowledge Bases帮助您实现从摄取到检索和提示增强的整个RAG工作流程,而无需构建到数据源的自定义集成和管理数据流。

这会将智能文档处理问题转化为搜索问题,这带来了如何提高搜索准确性的挑战。除了如何扩展以处理多种文档类型之外,少样本方法成本高昂,因为处理的每个文档都需要带有示例的更长提示。这导致输入Token数量增加。

Intelligent Document Procesing Strategies

如上图所示,提示上下文将根据所选的策略(零样本、少样本或带RAG的少样本)而变化,这将总体上改变获得的结果。

微调VLM

在光谱的末端,您可以选择微调一个自定义模型来执行文档处理。这是我们推荐的方法,也是我们在这篇文章中重点关注的内容。微调是一种方法,其中对预训练的LLM在特定数据集上进行进一步训练,以使其专业化于特定任务或领域。在文档处理的背景下,微调涉及使用带标签的示例——例如,已注释的发票、合同或保险表格——来教模型如何准确地提取或解释相关信息。通常,微调中最劳动密集的部分是获取合适的高质量数据集。在文档处理的情况下,您的公司可能已经在其现有的文档处理系统中拥有历史数据集。您可以从文档处理系统(例如,企业资源规划(ERP)系统)导出这些数据,并将其用作微调的数据集。我们将本文重点介绍的这种微调方法是一种可扩展、高精度且具有成本效益的智能文档处理方法。

上述方法代表了一系列策略,沿两个轴提高了LLM性能:LLM优化(通过提示工程或微调塑造模型行为)和上下文优化(通过少样本学习或RAG等技术增强模型在推理时所知的内容)。可以将这些方法结合起来——例如,将RAG与少样本提示一起使用,或将检索到的数据纳入微调中——以最大化准确性。

使用微调VLM实现文档到JSON的转换

我们的方法——最具成本效益的文档到JSON转换的推荐解决方案——使用VLM,并使用历史文档及其对应的地面真相JSON(我们视为注释)的数据集对其进行微调。这使得模型能够学习与您的历史数据相关的特定模式、字段和输出结构,有效地教会它根据您期望的模式阅读您的文档并提取信息。

下图显示了使用历史数据对VLM进行微调的文档到JSON转换过程的高级架构。这使得VLM能够从大量数据变化中学习,并有助于确保结构化输出与目标系统结构和格式相匹配

Document-to-JSON conversion process

与仅依赖OCR或通用VLM相比,微调具有以下几个优势:

  • 模式依从性:模型学会输出与特定目标结构匹配的JSON,这对于与ERP等下游系统集成至关重要。
  • 隐式字段位置:微调的VLM通常可以在没有训练数据中显式边界框注释的情况下学会定位和提取字段,从而大大简化了数据准备工作。
  • 改进的文本提取质量:即使在视觉复杂或嘈杂的文档布局中,模型也能更准确地提取文本。
  • 上下文理解:模型可以更好地理解文档上不同信息片段之间的关系。
  • 减少提示工程:微调后,模型需要的复杂或冗长的提示更少,因为所需的提取行为已内置到其权重中。

对于我们的微调过程,我们选择了Swift框架。Swift提供了一个全面的、轻量级的工具包,用于微调各种大型语言模型,包括Qwen-VL和Llama-Vision等VLM。

数据准备

为了微调VLM,您将使用Fatura2数据集,这是一个多布局发票图像数据集,包含10,000张具有50种不同布局的发票。

Swift框架需要使用特定的JSONL(JSON Lines)格式的数据集。文件中的每一行都是一个JSON对象,代表一个单独的训练示例。对于多模态任务,此JSON对象通常包括:

  • messages:一系列对话轮次(例如,systemuserassistant)。用户轮次包含图像(例如,<image>)的占位符和指导模型的文本提示。助手轮次包含目标输出,在本例中是地面真相JSON字符串。
  • images:与此训练示例相关的文档页面图像(JPG文件)的相对路径列表,位于数据集目录结构内。

与标准ML实践一样,数据集被划分为训练集、开发集(验证集)和测试集,以便有效地训练模型、调整超参数并在未见过的数据上评估其最终性能。每个文档(可以是单页或多页)及其对应的地面真相JSON注释构成数据集中的一行或一个示例。在我们的用例中,一个训练样本是发票图像(或多页文档图像)和相应的详细JSON提取。这种一对一的映射对于监督微调至关重要。

转换过程在相关GitHub仓库数据集创建笔记本中有详细介绍,涉及几个关键步骤

  1. 图像处理:如果源文档是PDF,则将每一页渲染成高质量的PNG图像。
  2. 注释处理(填充缺失值): 我们对原始JSON注释应用了轻微的预处理。在开源数据集上微调多个模型时,我们观察到当所有键都存在于每个JSON样本中时,性能会提高。为保持这种一致性,数据集中目标JSON被设置为包含一组相同的顶级键(从整个数据集中导出)。如果某个文档缺少某个键,则会添加一个空值。
  3. 键排序:在处理后的JSON注释中,键按字母顺序排序。这种一致的排序有助于模型学习稳定的输出结构。
  4. 提示构建:构建用户提示。此提示包含<image>标签(每个文档页面一个)并明确列出模型应提取的JSON键。在提示中包含JSON键可以提高微调模型的性能。
  5. Swift格式化:将这些组件(提示、图像路径、目标JSON)组装成Swift JSONL格式。Swift数据集支持多模态输入,包括图像、视频和音频。

以下是Swift的JSONL格式中单个训练实例的示例结构,演示了如何组织多模态输入。它包括对话消息、图像路径以及包含边界框(bbox)坐标的对象,用于文本中的视觉引用。有关如何为Swift创建自定义数据集的更多信息,请参阅Swift文档

 { "messages": [ {"role": "system", "content": "Task definition"}, {"role": "user", "content": "<image><image>... + optional text prompt"}, {"role": "assistant", "content": "JSON or text output with extracted data with <bbox> references."} ], "images": ["path/to/image1.png", "path/to/image2.png"] "objects": {"ref": [], "bbox": [[90.9, 160.8, 135, 212.8], [360.9, 480.8, 495, 532.8]]} #Optional }

微调框架和资源

在我们评估与SageMaker AI一起使用的微调框架时,我们考虑了社区中强调的以及与我们的需求相关的几个突出选项。这些包括Hugging Face Transformers、Hugging Face Autotrain、Llama Factory、Unsloth、Torchtune和ModelScope SWIFT(在本文中简称为SWIFT,与Zhao等人的SWIFT 2024 论文保持一致)。

在试验了这些之后,我们决定使用SWIFT,因为它轻量级、对各种参数高效微调(PEFT)方法(如LoRA和DoRA)的全面支持,以及其为高效训练各种模型(包括本文中使用的VLM,例如Qwen-VL 2.5)而设计的特性。其脚本方法与SageMaker AI训练作业无缝集成,支持云端可扩展和可再现的微调运行。

有几种策略可用于调整预训练模型:全微调,其中更新所有模型参数;PEFT,它通过仅更新少量新参数(适配器)提供了一种更高效的替代方案;以及量化,一种使用较低精度格式减少模型大小并加速推理的技术(有关每种技术的更多信息,请参阅Sebastian Rashka关于微调的帖子)。

我们的项目在微调笔记本使用LoRA和DoRA进行配置。

以下是使用SWIFT和远程函数将LoRA微调作业配置并作为SageMaker AI训练作业运行的示例。执行此函数时,微调将作为SageMaker AI训练作业远程执行

from sagemaker.remote_function import remote
import json
import os

@remote (instance_type="ml.g6e.12xlarge", volume_size=200, use_spot_instances=True)
def fine_tune_document (training_data_s3, train_data_path="train.jsonl" , validation_data_path="validation.jsonl"):
    from swift.llm.sft import lim_sft, get_sft_main
    from swift.llm import sft_main

    ## copy the training data from input source to local directory
    ... 
    train_data_local_path = ...
    validation_data_local_path = ...
    
    # set and run the fine-tuning using ms-swift framework
    os.environ["SIZE_FACTOR"] = json.dumps(8) # can be increase but requires more GPU memory
    os.environ["MAX_PIXELS"]= json.dumps (602112) # can be increase but requires more GPU memory
    os. environ ["CUDA_VISIBLE_DEVICES"]="0,1,2,3" # GPU devices to be used
    os. environ ["NPROC_PER_NODE"]="4" # we have 4 GPUs on on instance
    os.environ["USE_H_TRANSFER"] = json.dumps (1)
    
    argv = ['—model_type', 'qwen2_5_vl', '-model_id_or_path', 'Qwen/Qwen2.5-VL-3B-Instruct',
            '--train_type', 'lora', '--use_dora', 'true', 
            '-output_dir', checkpoint_dir, 
            '—max_length', '4096', 
            '-dataset', train_data_local_path, 
            '--val_dataset', validation_data_local_path, 
            ... ]
    sft_main (argv)

    ## potentially evaluate inference on test dataset
    return "done"

微调VLM通常需要GPU实例,因为它们计算需求量很大。对于像Qwen2.5-VL 3B这样的模型,像Amazon SageMaker AI ml.g5.2xlarge或ml.g6.8xlarge这样的实例可能很合适。训练时间是数据集大小、模型大小、批次大小、训练周期数和其他超参数的函数。例如,如我们的项目readme.md中所述,微调...




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区