临近年底大家都忙,而公司的财务人员尤为忙碌。各种工作需要处理,尤其是发票相关的那些。虽然很多地方已经可以提供电子版发票,但纸质发票在很多时候依然是唯一的选择。如果只是整理在一起进行归档,那还好说;但如果你需要从一大堆纸质发票中找出某些信息,这时候该怎么办?
===
各行各业的组织都需要处理大量纸质文件,其中又以发票类票据居多。以往,对于包含表格、表单、段落以及复选框的各类扫描文档,我们往往很难从中提取出有效信息。虽然目前不少组织已经通过人工、自定义代码或者光学字符识别(OCR)等技术解决了信息提取难题,但其中仍然需要借助完善的表单提取与自定义工作流模板。
此外,在从文档中提取到文本或其他形式的内容之后,用户还希望从收据或发票中帮助最终用户整理出更多深层洞见。但这又需要构建起复杂的自然语言处理(NLP)模型,模型的训练又要占用大量训练数据与计算资源。机器学习模型的构建与训练往往既昂贵、又极为耗时。
并且对于最终用户来说,提供类似于人的界面来与这些文档交互是很麻烦的。虽然最终用户可以通过给服务台打电话的方式得到不少帮助,但随着时间的推移,组织成本总会因此而不断提升。
本文将向大家介绍如何使用AWS AI服务自动实现文本数据处理与洞见发现。借助AWS AI服务(包括Amazon Textract、Amazon Comprehend以及Amazon Lex),我们可以设置自动化无服务器解决方案以满足上述要求。我们将分步引导您完成以下操作流程:
- 使用Amazon Textract从收据或发票扫描件(PDF或图片格式)中提取文本。
- 通过Amazon Comprehend得出洞见。
- 使用Amazon Lex以自然语言形式实现与这些洞见的交互。
接下来,我们将介绍用于构建这样一套解决方案的具体服务与架构选项。
相关服务
这套解决方案将使用以下AI服务、无服务器技术以及托管服务建立起一套可扩展且具备成本效益的架构:
- Amazon Cognito—— 帮助我们快速在Web与移动应用中添加用户注册、登录与访问控制等功能。
- AWS Lambda—— 执行代码以响应触发器,执行数据更改、系统状态变化或用户操作等。由于Amazon S3能够直接触发Lambda函数,因此我们可以借此构建起各类实时无服务器数据处理系统。
- Amazon Lex—— 提供用于创建会话式聊天机器人的接口。
- Amazon Comprehend——NLP服务,使用机器学习技术从文本中提取洞见与关系。
- Amazon Textract—— 使用机器学习技术从PDF、JPEG或者PNG格式的扫描文档中提取文本与数据。
- Amazon Simple Storage Service(Amazon S3)—— 为文档提供对象存储支持,并允许用户通过细粒度访问控制机制实现集中管理。
架构
下图所示,为这套解决方案的基本架构。
此架构包含以下操作步骤:
- 后端用户或管理员使用AWS管理控制台或AWS命令行界面(AWS CLI)将PDF文档或图像上传至S3存储桶。
- Amazon S3上传动作触发AWS Lambda函数。
- Lambda函数调用Amazon Textract StartDocumentTextDetection API,后者设置一项异步作业以检测上传的PDF中的文本内容。
- 当文本处理完毕之后,Amazon Textract向Amazon Simple Notification Service(Amazon SNS)发出通知。
- 当作业完成文本检测任务之后,由另一项Lambda函数从SNS主题处获取通知。
- 当Lambda收到Amazon SNS发来的作业完成通知后,调用Amazon Textract GetDocumentTextDetection API以接收异步操作结果,并将结果加载至S3存储桶内。
- 要使用Amazon Lex完成意图整理与分析,我们还需要使用另外一项Lambda函数。关于更详尽的交互序列,请参阅「使用CloudFormation部署架构」部分中的「构建聊天机器人」内容。
- Amazon Comprehend使用机器学习技术从文本中提取洞见与关系。Lambda函数使用由Amazon Comprehend提供的boto3 API执行实体与关键短语检测。
*在聊天机器人显示欢迎致辞之后,用户输入「Show me the invoice summary(显示发票摘要)」即可调用GetInvoiceSummary Lex意图,并由Lambda函数调用Amazon Comprehend DetectEntities API以检测要实现的实体。
*当用户输入「Get me the invoice details(获取发票明细)」时,即可调用GetInvoiceDetails意图,Amazon Lex会提示用户输入发票编号,并由Lambda函数调用Amazon Comprehend DetectEntities API以返回发票的详细信息。
*在用户输入「Can you show me the invoice notes for
(能否显示〈发票编号〉发票注释)」时,即可调用GetInvoiceNotes意图,由Lambda函数调用Amazon Comprehend DetectKeyPhrases API以返回与发票相关的注释内容。 *使用现有CloudFormation栈作为嵌套栈,大家可以将Lexbot Web UI部署在AWS CloudFormation模板中。要下载该栈,请参阅为聊天机器人部署Web UI。该嵌套栈将部署一套Lex Web UI,并将此网页作为S3存储桶的静态网站。Web UI使用Amazon Cognito生成用于身份验证的访问令牌,并使用AWS CodeStar设置交付管道。最终用户将通过Web UI与该聊天机器人进行交互。
使用AWS CloudFormation部署此架构
我们需要部署一套CloudFormation模板,用于置备必要的AWS身份与访问管理(AWS Indentity and Access Management,简称IAM)角色、服务,并提供解决方案所必需的Amazon S3、Lambda、Amazon Textract、Amazon Comprehend以及Amazon Lex聊天机器人等组件。
- 在美国东部(北弗吉尼亚州)区域启动以下CloudFormation模板:
- 请不要修改栈名称或者参数botname InvoiceBot。
- 在Capabilities and transforms部分,勾选全部三个复选项,确认由AWS CloudFormation创建IAM资源并扩展模板。
关于上述资源的更多详细信息,请参阅AWS IAM资源。
此模板使用AWS无服务器应用程序模式(AWS Serverless Application Model,AWS SAM)以简化面向无服务器应用程序的函数与API定义流程,同时为各项服务提供环境变量等功能支持。
- 选择Create stack。
以下截屏所示,为Stack Detail页面中显示的栈状态,目前为CREATE_IN_PROGRESS。在20分钟之内,该状态将转换为CREATE_COMPLETE,代表栈创建完成。
- 在Outputs选项卡中,复制LexLambaFunctionArn、AssetsUploadBucket、ExtractedTextfilesBucket以及LexUIWebAppUrl的值。
将文档上传至S3存储桶
要将文档上传至新的S3存储桶,请选择与之前复制的AssetsUploadBucket相对应的S3存储桶URL。上传PDF或图像,即可开始文本提取流程。
我们也可以从GitHub repo下载本文中使用的发票数据,并将其上传至AssetsUploadBucket S3 URL。建议在发票模板中使用自定义解决方案。关于上传文件的更多详细信息,请参阅如何向S3存储桶上传文件与文件夹?
在上传完成之后,可以在Amazon S3控制台的Overview选项卡中看到该文件。
在文件上传完毕后,即可开始文档文本提取流程。要查看待提取的文档,请打开存储桶并选择之前复制的URL。
构建聊天机器人
我们将使用以下会话对机器人进行建模:
Bot: Welcome to InvoiceBot. You can ask me to provide your invoice summary, or details of your invoices, or your invoice notes__(欢迎访问InvoiceBot__。您可以要求我提供发票摘要、发票明细或发票注释)
用户:Show me the invoice summary(显示发票摘要)
Bot: I reviewed your input documents and found 1 invoice with invoice numbers 35678-9 totaling $2100.0. I can get you invoice details or invoice notes. Simply type your request__(我检查了您的输入文件,发现其中包含1__张发票,发票编号为35678-9__,金额总计2100__美元。我可以为您提供发票详细信息或发票注释。请输入您的要求)
用户:Get me the invoice details(获取发票明细)
Bot: Please enter the invoice number__(请输入发票编号)
用户:35678-9
Bot: Invoice Details for 35678-9: On 5/10/2019 for the item One there is a charge of 1500.00. On 5/11/2019 for the item Merchant Two there is a charge of 100.00. On 5/12/2019 for the item Merchant Three there is a charge of 300.00. On 5/13/2019 for the item Merchant Three there is a charge of 200.00. You can request me for invoice notes or simply close this chat.__(35678-9__发票明细:2019/5/10__,费用项一金额为1500__美元。2019/1/11__,费用项二为100__美元。2019/5/12__,费用项三为300__美元。20195/13__,费用项四为200__美元。您可以要求我提供发票记录,也可以直接关闭本次聊天。)
用户:Can you show me the invoice notes for 35678-9(显示35678-9号发票注释)
Bot: Invoice Notes for 35678-9: 5/13/2019 Merchant Three 200.00 Merchant Three 300.00 Laptop Office Supplies Merchant Two 100.00 Team Dinner Food 5/12/2019 5/11/2019 Desks and Office Supplies 5/10/1019 Merchant One 1500.00 Chairs . Feel free to try the options again or you can simply close this chat__(35678-9__号发票注释:2019/5/13__,购入三项计200__美元。购入三项计300__美元,为电脑办公桌。2019/5/12__购入两项100__美元,为团队晚餐。2019/5/11__,为办公桌与办公服务器。2019/5/10 _购入一项计1500__美元,为椅子。_
我们还可以使用以下意图构建其他Amazon Lex机器人(InvoiceBot):
- GetInvoiceSummary – 用户请求查看发票摘要时所调用的意图。由Lambda函数完成,可返回当前可用发票的数量与发票总金额
- GetInvoiceDetails – 用户请求查看发票明细时所调用的意图。可通过Lambda函数实现,用于提供发票各条目明细,包括日期、数量与条目明细。
- GetInvoiceNotes – 用户请求查看发票注释时所调用的意图。通过Lambda函数完成,提供带有日期与项目描述的发票注释信息。
发布聊天机器人
之前的解决方案概述中所提到,我们可以使用Amazon Lex聊天机器人(InvoiceBot)与Amazon Comprehend提取自Amazon Textract文本中的洞见进行交互。
要发布聊天机器人,请完成以下操作步骤:
- 在Amazon Lex控制台上,选择Bots。
- 选择所创建的聊天机器人。
- 在Intents下,选择GetInvoiceSummary。
- 在Fulfilment下,选择Lambda函数。
- 输入LexLambdaFunction以搜索该函数,并选定正确结果。
这时系统会出现显示弹框。
- 选择OK。
- 选择Save intent。
- 在另外两项意图GetInvoiceDetails与GetInvoiceNotes中,重复上述步骤。
- 选择Build。
- 在构建完成后,选择Publish。
- 在Create an alias部分,输入Latest。我们也可以使用其他名称,例如测试、开发、beta或者生产等皆可,用于代指机器人的运行环境。
- 选择Publish。
在机器人发布完成后,系统将打开以下页面。
- 选择Close。
使用聊天机器人
我们的聊天机器人现在已经就绪并可供使用。导航至复制自AWS CloudFormation Outputs选项卡处的URL LexUIWebAppUrl。以下截屏所示,为用户与该机器人的对话结果(从左至右阅读):
总结
本文介绍了如何在Amazon Lex中创建一款会话式聊天机器人,使用Amazon Textract从图像或PDF文档中提取文本,使用Amazon Comprehend从文本中提取洞见,并通过机器人实现与洞见的交互。本文中所使用的代码皆发布在GitHub repo当中,供大家随意使用及扩展。