利用 Amazon Bedrock 和 Anthropic Claude 进行智能文档处理
本教程展示了如何使用 Amazon Bedrock 上的 Anthropic Claude 3 Sonnet 来构建 IDP 解决方案。我们将演示如何从扫描文档中提取数据并将其插入数据库。
生成式 AI 不仅能通过创意生成、内容创作和改善客户服务来推动创新,还能简化各个领域的运营并提高工作效率。为了有效利用这一革命性技术,Amazon Bedrock 推出了一项完全托管的服务,集成了AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Mistral AI 和 Amazon 等业界领先的 AI 公司推出的高性能基础模型。只需一个 API 即可访问这些先进模型,Amazon Bedrock 支持以安全、隐私和负责任的AI的重点的生成式 AI 应用的开发,使客户能够利用 AI 探索创新的新途径,并改善整体的产品和服务体验。
企业客户可以利用生成式 AI 增强的智能文档处理 (IDP) 来发挥巨大的价值。将生成式 AI 功能融入 IDP 解决方案,可以彻底革新文档处理工作流程,实现卓越的自动化和可靠性。这种组合实现了高级文档理解、高效的结构化数据提取、自动化的文档分类和非结构化文本中的无缝信息检索。借助这些能力,组织可实现可扩展、高效和高价值的文档处理流程,推动业务转型并提高竞争力,最终提高生产力、降低成本并提升决策能力。
本文展示了如何使用 Amazon Bedrock上的 Anthropic Claude 3 Sonnet 来构建 IDP 解决方案。我们将演示如何从扫描文档中提取数据并将其插入数据库。
Anthropic Claude 3 Sonnet 模型已进行了速度和效率优化,是智能任务的绝佳选择,尤其适合企业工作负载。它还具备复杂的视觉能力,对于照片、图表、图形和技术图等各种视觉格式,均展现出了强大的理解能力。在该解决方案的演示中,我们使用了 Anthropic Claude 3 Sonnet 模型,您也可以根据用例需求选用 Haiku 和 Opus 模型。
解决方案概述
该解决方案使用 Amazon Bedrock 和强大的 Anthropic Claude 3 Sonnet 模型来实现 IDP 功能。该架构采用了与 Amazon Bedrock 无缝集成的各种亚马逊云科技服务,可高效准确地提取扫描文档中的数据。
下图展示了我们的解决方案架构。
该方案的具体步骤如下:
1. 先将扫描文档上传并存储到 Amazon Simple Storage Service (Amazon S3) 存储桶中,这会在对象上传时触发S3事件通知。
2. 该事件会调用 AWS Lambda 服务,负责在 Amazon Bedrock 上调用 Anthropic Claude 3 Sonnet 模型。
3. Anthropic Claude 3 Sonnet 模型具备先进的多模态能力,可处理扫描文档并以结构化的JSON 格式提取相关数据。
4. 利用 Anthropic Claude 3 模型提取的数据会被发送至 Amazon Simple Queue Service (Amazon SQS) 队列。Amazon SQS 充当缓冲区,允许组件可靠地收发消息,无需直接耦合,这为系统提供了可扩展性和容错能力。
5. 另一项 Lambda 服务会使用来自 SQS 队列的消息,解析JSON数据,并将提取的键值对存储在 Amazon DynamoDB 表中,以便进行检索和进一步处理。
这种无服务器架构利用了亚马逊云科技服务的可扩展性和成本效益,同时结合了 Anthropic Claude 3 Sonnet 的前沿智能。通过将亚马逊云科技的强大基础设施与 Anthropic 的基础模型相结合,该解决方案能帮助组织简化文档处理工作流程,提取有价值的洞见,并提高整体运营效率。
该解决方案使用了以下服务和功能:
- Amazon Bedrock 是一项完全托管服务,可调用大型语言模型 (LLMs),允许开发人员构建和部署自己的定制 AI 应用。
- Anthropic Claude 3 系列提供了一系列多功能模型,可满足客户的多样化需求。该系列提供 Opus、Sonnet 和 Haiku 三种版本,可帮助您实现智能度、速度和成本之间的完美平衡。这些模型非常擅长理解图表、图形、技术图和报告等复杂的企业内容。
- Amazon DynamoDB 是一项完全托管、无服务器的 NoSQL 数据库服务。
- AWS Lambda 是一项无服务器计算服务,无需配置或管理服务器即可运行代码。
- Amazon SQS 是一项完全托管的消息队列服务。
- Amazon S3 是一项高度可扩展、持久、安全的对象存储服务。
在该解决方案中,我们利用 Amazon Bedrock 的生成式 AI 能力来高效地提取数据。在撰写本文时,Anthropic Claude 3 Sonnet 仅支持图片输入。支持的文件格式有 GIF、JPEG、PNG 和 WebP。您可以在扫描过程中保存图片,或者将 PDF 转换为图片。
还可通过人在回环和模型评估功能来改进该解决方案。本文旨在讲解如何使用 Amazon Bedrock 来构建 IDP 解决方案,但要将其投入生产环境,还应考虑边缘场景测试、更好的异常处理、尝试其他提示技术、模型微调、模型评估、吞吐量要求、支持的并发请求数量等因素,并慎重考虑成本和延迟带来的影响。
先决条件
在继续实施此解决方案之前,需满足以下先决条件。在本文中,我们使用了亚马逊云科技us-east-1区域。有关可用区域的详细信息,请参阅 Amazon Bedrock 端点和配额。
- 拥有亚马逊云科技账户,AWS Identity and Access Management (IAM) 用户拥有DynamoDB、Lambda、Amazon Bedrock、Amazon S3、Amazon SQS、Lambda和IAM权限。
- Amazon Bedrock 上 Anthropic Claude 3 Sonnet 模型的访问权限。关于具体说明,请参阅管理模型访问权限。
用例和数据集
在这个示例用例中,我们来看看颁发出生证明的州政府机构。州政府机构可能会通过各种渠道受理出生证明申请,比如在线申请、线下填写表格和邮寄纸质申请表。现如今,大多数机构耗费大量时间和资源来手动提取申请详细信息。先从扫描申请表开始,手动提取详细信息,再将其输入到应用程序中,最后将数据存储到数据库中。该过程耗时、效率低下、不可扩展且容易出错。此外,如果申请表使用其他语言(比如西班牙语)填写,问题就更复杂了。
些表格不涉及任何真实的个人数据。这里提供了两份示例:一份英语版(手写体),一份西班牙语版(打印体)。将这些图像以 .jpeg 格式保存到您的计算机上,以供稍后测试解决方案时使用。
创建 S3 存储桶
在 Amazon S3 控制台上,新建一个名称唯一的存储桶(例如,bedrock-claude3-idp-{随机字符以确保全局唯一}),其他设置均保留默认值。在存储桶中,创建一个名为 images 的文件夹和一个名为 birth_certificates 的子文件夹。
创建 SQS 队列
在 Amazon SQS 控制台中,创建一个标准队列类型的队列,输入队列名称(例如 bedrock-idp-extracted-data),其他设置均保留默认值。
创建 Lambda 服务以调用 Amazon Bedrock 模型
在 Lambda 控制台中,创建一项服务(例如 invoke_bedrock_claude3),选择 Python 3.12 作为运行时,其他设置均保留默认值。稍后,将此服务配置为每次有新图像上传到 S3 存储桶时被调用。点击 invoke_bedrock_claude3.py 可下载完整的 Lambda 服务代码。利用下载的文件中的代码替换lambda_function.py 文件的内容。确保将{SQS URL}替换为您之前创建的 SQS 队列的 URL,再点击“部署”。
Lambda 服务应执行以下操作:
s3 = boto3.client('s3')
sqs = boto3.client('sqs')
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
QUEUE_URL = {SQS URL}
MODEL_ID = "anthropic.claude-3-sonnet-20240229-v1:0"
在下述代码中,调用 get_object 方法,从 S3 存储桶中获取图像,再转换为 base64 数据:
image_data = s3.get_object(Bucket=bucket_name, Key=object_key)['Body'].read()
base64_image = base64.b64encode(image_data).decode('utf-8')
提示词工程是发挥生成式 AI 应用(比如 IDP )全部潜力的关键因素。精心构建的提示词可确保 AI 系统的输出准确、有针对性并与您的目标保持一致,同时还能降低潜在的风险。
通过将 Anthropic Claude 3 模型集成到 Amazon Bedrock IDP 解决方案中,您可以利用模型出色的视觉理解能力轻松提取文档中的数据。只需提供图像或文档作为输入,Anthropic Claude 3 就能理解其中的内容,无缝提取所需的信息,并以适合人类阅读的格式呈现出来。所有 Anthropic Claude 3 模型均能理解西班牙语、日语和法语等非英语语言。在这个特定用例中,我们演示了如何通过提供适当的提示词指令将西班牙语申请表翻译成英语。
然而,Anthropic Claude 3 这类大语言模型的响应格式可能有所不同。为了获得一致的结构化输出,您可以调整提示词,指示模型以特定格式返回(比如提供预定义键的 JSON 格式)提取的数据。这种方法增强了模型输出与下游应用的互操作性,并简化了数据处理工作流。
以下是要求以特定 JSON 格式输出的提示词:
prompt = """
This image shows a birth certificate application form.
Please precisely copy all the relevant information from the form.
Leave the field blank if there is no information in corresponding field.
If the image is not a birth certificate application form, simply return an empty JSON object.
If the application form is not filled, leave the fees attributes blank.
Translate any non-English text to English.
Organize and return the extracted data in a JSON format with the following keys:
{
"applicantDetails":{
"applicantName": "",
"dayPhoneNumber": "",
"address": "",
"city": "",
"state": "",
"zipCode": "",
"email":""
},
"mailingAddress":{
"mailingAddressApplicantName": "",
"mailingAddress": "",
"mailingAddressCity": "",
"mailingAddressState": "",
"mailingAddressZipCode": ""
},
"relationToApplicant":[""],
"purposeOfRequest": "",
"BirthCertificateDetails":
{
"nameOnBirthCertificate": "",
"dateOfBirth": "",
"sex": "",
"cityOfBirth": "",
"countyOfBirth": "",
"mothersMaidenName": "",
"fathersName": "",
"mothersPlaceOfBirth": "",
"fathersPlaceOfBirth": "",
"parentsMarriedAtBirth": "",
"numberOfChildrenBornInSCToMother": "",
"diffNameAtBirth":""
},
"fees":{
"searchFee": "",
"eachAdditionalCopy": "",
"expediteFee": "",
"totalFees": ""
}
}
"""
通过 Amazon Bedrock API 调用 Anthropic Claude 3 Sonnet 模型。将提示词和 base64 图像数据作为参数进行传递:
def invoke_claude_3_multimodal(prompt, base64_image_data):
request_body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 2048,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt,
},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": base64_image_data,
},
},
],
}
],
}
try:
response = bedrock.invoke_model(modelId=MODEL_ID, body=json.dumps(request_body))
return json.loads(response['body'].read())
except bedrock.exceptions.ClientError as err:
print(f"Couldn't invoke Claude 3 Sonnet. Here's why: {err.response['Error']['Code']}: {err.response['Error']['Message']}")
raise
调用 send_message 方法,将 Amazon Bedrock API 响应发送至 SQS 队列:
def send_message_to_sqs(message_body):
try:
sqs.send_message(QueueUrl=QUEUE_URL, MessageBody=json.dumps(message_body))
except sqs.exceptions.ClientError as e:
print(f"Error sending message to SQS: {e.response['Error']['Code']}: {e.response['Error']['Message']}")
接下来,修改 Lambda 服务的 IAM 角色,以授予所需的权限:
1. 在 Lambda 控制台中,导航至该服务。
2. 在 “配置” 选项卡中,点击左侧窗格中的 “权限”。
3. 选择 IAM 角色(例如 invoke_bedrock_claude3-role-{随机字符})。
这将在新选项卡中打开该角色。
4. 在“权限策略”中,点击“添加权限”和“创建内联策略”。
5. 在“创建策略”页面,切换到策略编辑器中的 JSON 选项卡。
6. 输入以下代码块中的策略,将{AWS Account ID}替换为您自己的亚马逊云科技账户ID,将{S3 Bucket Name}替换为您自己的S3存储桶名称。
7. 点击“下一步”。
8. 输入策略名称(例如 invoke_bedrock_claude3-role-policy),再点击“创建策略”。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/*"
}, {
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{S3 Bucket Name}/*"
}, {
"Effect": "Allow",
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:us-east-1:{AWS Account ID}:bedrock-idp-extracted-data"
}]
}
该策略将授予以下权限:
- 调用 Amazon Bedrock 基础模型的访问权限
- 检索 bedrock-claude3-idp... S3 存储桶中的对象
- 发送消息至 bedrock-idp-extracted-data SQS 队列,以处理提取的数据
此外,将 Lambda 服务的超时时间修改为2分钟。默认超时时间为3秒。
创建 S3 事件通知
创建 S3 事件通知的具体步骤如下:
1. 在 Amazon S3 控制台中,打开 bedrock-claude3-idp... S3 存储桶。
2. 导航到“属性”,在“事件通知”中创建事件通知。
3. 输入事件名称(例如bedrock-claude3-idp-event-notification)。
4. 前缀输入 images/birth_certificates/。
5. 对于 Event Type,在“对象创建”中选择Put。
6. 对于目标,选中 Lambda 服务并选择 invoke_bedrock_claude3。
7. 点击“保存更改”。
创建 DynamoDB 表
要将提取的数据存储在 DynamoDB 中,您需要创建一个表。在 DynamoDB 控制台中,创建一个名为 birth_certificates 的表,将 Id 作为分区键,其他设置均保留默认值。
创建 Lambda 服务以便将记录插入 DynamoDB 表
在 Lambda 控制台中,创建一项 Lambda 服务(例如 insert_into_dynamodb),选择 Python 3.12 作为运行时,其他设置均保留默认值。点击 insert_into_dynamodb.py 可下载完整的 Lambda 服务代码。利用下载的文件中的代码替换lambda_function.py文件的内容,再点击“部署”。
Lambda 服务应执行以下操作:
从包含 Anthropic Claude 3 Sonnet 模型响应的 SQS 队列中获取消息:
data = json.loads(event['Records'][0]['body'])['content'][0]['text']
event_id = event['Records'][0]['messageId']
data = json.loads(data)
创建表示 DynamoDB 及其表的对象:
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('birth_certificates')
从 JSON 数据中获取键对象:
applicant_details = data.get('applicantDetails', {})
mailing_address = data.get('mailingAddress', {})
relation_to_applicant = data.get('relationToApplicant', [])
birth_certificate_details = data.get('BirthCertificateDetails', {})
fees = data.get('fees', {})
调用 put_item() 方法,将提取的数据插入 DynamoDB 表:
table.put_item(Item={
'Id': event_id,
'applicantName': applicant_details.get('applicantName', ''),
'dayPhoneNumber': applicant_details.get('dayPhoneNumber', ''),
'address': applicant_details.get('address', ''),
'city': applicant_details.get('city', ''),
'state': applicant_details.get('state', ''),
'zipCode': applicant_details.get('zipCode', ''),
'email': applicant_details.get('email', ''),
'mailingAddressApplicantName': mailing_address.get('mailingAddressApplicantName', ''),
'mailingAddress': mailing_address.get('mailingAddress', ''),
'mailingAddressCity': mailing_address.get('mailingAddressCity', ''),
'mailingAddressState': mailing_address.get('mailingAddressState', ''),
'mailingAddressZipCode': mailing_address.get('mailingAddressZipCode', ''),
'relationToApplicant': ', '.join(relation_to_applicant),
'purposeOfRequest': data.get('purposeOfRequest', ''),
'nameOnBirthCertificate': birth_certificate_details.get('nameOnBirthCertificate', ''),
'dateOfBirth': birth_certificate_details.get('dateOfBirth', ''),
'sex': birth_certificate_details.get('sex', ''),
'cityOfBirth': birth_certificate_details.get('cityOfBirth', ''),
'countyOfBirth': birth_certificate_details.get('countyOfBirth', ''),
'mothersMaidenName': birth_certificate_details.get('mothersMaidenName', ''),
'fathersName': birth_certificate_details.get('fathersName', ''),
'mothersPlaceOfBirth': birth_certificate_details.get('mothersPlaceOfBirth', ''),
'fathersPlaceOfBirth': birth_certificate_details.get('fathersPlaceOfBirth', ''),
'parentsMarriedAtBirth': birth_certificate_details.get('parentsMarriedAtBirth', ''),
'numberOfChildrenBornInSCToMother': birth_certificate_details.get('numberOfChildrenBornInSCToMother', ''),
'diffNameAtBirth': birth_certificate_details.get('diffNameAtBirth', ''),
'searchFee': fees.get('searchFee', ''),
'eachAdditionalCopy': fees.get('eachAdditionalCopy', ''),
'expediteFee': fees.get('expediteFee', ''),
'totalFees': fees.get('totalFees', '')
接下来修改 Lambda 服务的 IAM 角色,以授予所需的权限。操作与之前修改 invoke_bedrock_claude3 Lambda 服务权限的步骤一致,但需要输入以下 JSON 信息作为内联策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "dynamodb:PutItem",
"Resource": "arn:aws:dynamodb:us-east-1::{AWS Account ID}:table/birth_certificates"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"sqs:DeleteMessage",
"sqs:ReceiveMessage",
"sqs:GetQueueAttributes"
],
"Resource": "arn:aws:sqs:us-east-1::{AWS Account ID}:bedrock-idp-extracted-data"
}
]
}
输入策略名称(例如 insert_into_dynamodb-role-policy ),点击“创建策略”。
该策略将授予以下权限:
- 在 DynamoDB 表中插入记录
- 读取和删除 SQS 队列中的消息
配置 Lambda 服务的 SQS 触发器
为 Lambda 服务创建触发器的步骤如下:
1. 在 Amazon SQS 控制台中,打开 bedrock-idp-extracted-data 队列。
2. 在 Lambda 触发器选项卡中,点击“配置 Lambda 服务触发器”。
3. 选择 insert_into_dynamodb Lambda 服务,点击保存。
测试解决方案
现在您已经构建了所有必要的资源、权限和代码,是时候测试解决方案了。
在 S3 文件夹 birth_certificates 中,上传您之前下载的两张扫描图像。再打开 DynamoDB 控制台,浏览 birth_certificates 表中的项目。
如果一切配置正确,会在数秒内看到 DynamoDB 中创建了两个项目,截图如下所示。对于西班牙语表格,Anthropic Claude 3 会根据提示词自动将西班牙语键和标签翻译成英语。
故障排除
如果您在 DynamoDB 表中没有看到提取的数据,可按照下述方法进行问题排查:
检查 CloudWatch 日志 – 查看与数据提取和摄取流程相关的 Lambda 服务的 Amazon CloudWatch日志流。寻找任何可能反映问题根源的错误消息或异常。
检查是否权限不足 – 在许多情况下,错误可能是由于权限不足造成的。对于该解决方案所需的亚马逊云科技资源,比如 DynamoDB 表、 S3 存储桶等相关服务,确认 Lambda 服务是否已获得必要的访问权限。
使用死信队列 – 在生产级解决方案中,建议使用死信队列 (DLQ),以捕获和处理任何处理失败或发生错误的事件或消息。
清理
清理本文中创建的资源,以免持续计费:
1. 删除 bedrock-claude3-idp... S3 存储桶中的所有对象,再删除该存储桶。
2. 删除名为 invoke_bedrock_claude3 和 insert_into_dynamodb 的两项 Lambda 服务。
3. 删除名为 bedrock-idp-extracted-data 的 SQS 队列。
4. 删除名为 birth_certificates 的 DynamoDB 表。
示例用例和业务价值
本文演示的基于生成式 AI 的 IDP 解决方案可为各行各业的组织机构带来诸多益处,具体如下:
- 政府和公共部门 – 处理和提取公民申请、移民文件、法律合同等政府相关表格的数据,实现更快的周转时间和更好的服务交付
- 医疗行业 – 提取和整理患者信息、病历、保险索赔和其他健康相关文件,提高数据的准确性和可访问性,以改善患者护理
- 金融和银行业 – 自动提取和处理金融票据、贷款申请、税务申报表和监管文件,减少人力投入并提高运营效率
- 物流和供应链 – 提取和整理货运单据、发票、采购订单和库存记录中的数据,简化运营并增强供应链可见性
- 零售和电子商务 – 自动提取和处理客户订单、产品目录和营销材料,实现个性化体验和高效的订单履行
借助生成式 AI 和 Amazon Bedrock 的力量,组织能够发挥其数据的真正潜力,推动运营卓越、改善客户体验并推动持续创新。
总结
在本文中,我们演示了如何使用 Amazon Bedrock 和强大的 Anthropic Claude 3 Sonnet 模型来制定 IDP 解决方案。借助 Anthropic Claude 3 先进的多模态能力,我们能够准确地提取扫描文档中的数据,并以结构化格式存储在 DynamoDB 表中。
尽管该解决方案展示了生成式 AI 在 IDP 中的潜力,但它可能无法适用于所有 IDP 用例。解决方案的效果可能因文档的复杂度和质量、可用的训练数据量以及组织的具体要求而有所差异。
为了进一步改进该解决方案,可以考虑实施人在环工作流来审查和验证提取的数据,特别是对于任务关键型或敏感型应用。这将保障数据的准确性并符合监管要求。您还可以探索 Amazon Bedrock 中的模型评估功能来比较模型输出,再选择最适合您的下游生成式 AI 应用的模型。
为进一步探索和学习,我们推荐您查阅以下资源: