使用RPA通过GPT大模型AI Agent自动执行业务流程任务企业级应用开发实战:如何管理和维护你的自动化项目

53 阅读11分钟

1.背景介绍

一、RPA(Robotic Process Automation)简介

Robotic Process Automation(RPA)技术是一种人工智能(AI)自动化工具,是指使用机器学习技术或规则引擎技术等方法,基于计算机技术及软件工具,实现从业务需求分析到自动生成代码、执行自动化测试、提升工作效率、节约资源投入的完整自动化过程。由此,无需人工参与,即可完成重复性、耗时的工作,并大幅度缩短流程时间。目前,RPA已经成为各领域中最具影响力的新兴技术之一,有越来越多的企业在采用RPA解决重复性的、耗时且易出错的业务流程自动化。

二、GPT-3文本生成技术简介

GPT-3(Generative Pretrained Transformer 3)是一个强大的文本生成模型,能够根据输入提供连贯的、结构化的、逻辑性的句子或语言片段。它在NLP、文本生成、自动摘要、对话生成等方面均有着卓越的表现。GPT-3是微软于2020年9月推出的产物,其最大的特点就是可以生成高质量的自然语言文本。相对于传统的语言模型来说,GPT-3在很多方面都胜过了它。例如,它可以生成更加逼真的语言、具有更多细腻的层次、更加流畅的组织方式、并且比传统的模型更适合用于长文本生成场景。

三、业务流程自动化技术现状

虽然RPA和GPT-3这两项技术在业务流程自动化方面发挥着重要作用,但是,真正落地业务流程自动化仍然是一个复杂的工程,涉及到多个环节,比如流程设计、运维实施、数据处理、分析报告等。这就要求企业必须很好地理解业务流程自动化的各种技术,了解相关的管理技能、知识储备、应用场景、技术规范和法律法规。同时还需要建立起完整的管理体系,包括业务流程标准化、流程优化、流程改进、培训、监控等制度。只有不断打磨这些制度,才能确保业务流程自动化的有效运行,让更多的人受益。

因此,我们需要借助开源技术、云计算平台、DevOps、可视化组件等创新手段,结合实际业务案例,分享业务流程自动化的经验教训,帮助企业顺利地落地RPA和GPT-3等技术,提升业务流程自动化的效率、准确性和成本收益比。

2.核心概念与联系

GPT模型——训练GPT-3模型

GPT模型是在互联网语料库上预训练得到的一套深度神经网络,将训练好的GPT模型当做一个语言模型,根据输入生成连贯的、结构化的、逻辑性的语句或者文本。其中,GPT-2模型的大小是124M,GPT-3模型的大小是1.5B。每个模型都是用transformer作为主要的编码器结构,再加入一些标准的自注意力机制和位置编码等组件来提升生成效果。如今,已有多种技术可以用于训练GPT模型,但由于GPT-3模型已经超过1.5B,即使是普通的GPU也难以训练,所以,需要选择一些高性能的硬件设备进行训练。这里推荐使用Google Cloud Platform AI Platform中的TPUs来训练GPT-3模型。

GPT模型的训练过程如下图所示:

  1. 数据准备阶段:首先需要获取足够数量的训练数据,该数据既要覆盖整体业务范围,又要避免过拟合,可以从不同渠道收集、整理多种类型的数据,包括电子文档、日志文件、FAQ、调查问卷、客户反馈等。
  2. 数据清洗阶段:对原始数据进行初步处理,去除噪声数据、脏数据,并转换为统一格式。
  3. 文本分词阶段:将数据按照预定义的分词策略划分为若干个子序列,这些子序列构成了一系列的文本样本。
  4. 负采样阶段:为了保证模型鲁棒性和正确性,需要引入一定的噪声数据来辅助模型学习。负采样是一种数据增强的方法,目的是在训练时减少易错的样本影响,提高模型泛化能力。通过随机选取训练样本的一些负例,训练模型学习分类任务,可以缓解模型过拟合的问题。
  5. 编码阶段:使用BERT的预训练模型,对文本序列进行特征抽取,然后送入神经网络进行训练。
  6. 梯度下降阶段:在神经网络中进行梯度更新,使得模型的参数逐渐调整到最优状态。
  7. 保存模型阶段:保存训练好的模型参数,便于后续预测和服务。

RPA框架——基于RPA框架进行业务流程自动化

RPA框架基于云计算平台,使用图形用户界面(GUI)构建自动化流程,并通过不同类型的节点连接起来。每个节点代表了一个动作,节点之间通过链接线连接起来,形成了完整的业务流程。这样就可以使用编程的方式来编写自动化脚本,将这些脚本部署到对应的服务器上执行。通过使用RPA框架,可以轻松实现自动化流程的设计、调试、部署和监控。

RPA框架的设计模式如下图所示:

  1. 流程设计器:图形用户界面,用于创建自动化脚本的流程图。可以手动构建流程,也可以导入已有的业务流程,或通过拖放功能直接绘制流程图。
  2. 执行器:用于实时运行自动化脚本的应用程序,可以在本地或远程环境运行。可以定时或事件触发运行,也可以根据条件触发。
  3. 服务端:用于存储自动化脚本、历史运行结果和监控信息的服务器。
  4. 可视化组件:用于展示执行器、服务端、数据库的信息的可视化组件。

业务流程自动化——业务流程自动化的意义

业务流程自动化是利用计算机技术和人工智能技术实现的自动化业务过程。它的核心理念是从零到一、从简单到复杂。业务流程自动化通过一系列自动化脚本和流程来替代人工操作,提升工作效率和效益,缩短重复、耗时的流程。因此,它可以有效减少人力成本,提升产品交付质量。同时,它还可以大幅度降低流程操作的风险,提升业务稳定性、业务连续性。业务流程自动化的典型场景有以下几种:

  • 金融业务:汇款确认、银行托管、KYC认证等
  • 供应链管理:生产订单自动下单、供应商采购单自动生成等
  • 清算与结算:结算凭证自动生成、欠款催收等
  • 工厂管理:生产计划自动生成、生产指令自动下发等

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

GPT模型——训练GPT-3模型的过程

数据准备

获取数据集

GPT模型的训练数据集可以来源于不同的地方,比如爬虫网站、论文、数据集、新闻网站等。当然也可以自己搜集文本数据,但需要注意,一定要充分标注数据才能训练出比较好的模型。在准备数据之前,需要考虑数据的质量、可靠性、可用性。

数据预处理

数据预处理是对数据进行清理、归一化、筛选等预处理过程,确保数据符合训练的要求。主要步骤如下:

  • 分词:对文本进行分词,将句子分割成有意义的词。
  • 小写化:将所有字符转换为小写,因为GPT模型是用小写的数据进行训练的。
  • 过滤停用词:移除停用词,因为停用词往往是噪声词,而GPT模型是不需要这些数据的。
  • Tokenize:将数据转换为数字表示形式,便于神经网络进行处理。

模型架构

GPT模型的基本结构由Transformer Encoder和Transformer Decoder组成,如下图所示。Transformer Encoder负责编码输入序列,Transformer Decoder则用来解码输出序列。

Encoder结构:GPT模型的Encoder包含多个相同的层(Block),每个层包含两个子层(Multi-Head Attention Layer and Feed Forward Layer)。Multi-Head Attention Layer用来获取输入序列的全局信息,Feed Forward Layer则将全局信息映射到上下文向量。

Decoder结构:GPT模型的Decoder也包含多个相同的层,每个层包含三个子层。第一个子层是Multi-Head Attention Layer,用来获取前一步生成的词的上下文信息;第二个子层是Position Wise Fusion Layer,用来融合前一步生成的词和当前步的上下文信息;第三个子层是Feed Forward Layer,用来生成下一步的词。

模型优化

为了优化模型的效果,GPT模型采用了以下方法:

  • 学习率衰减:每隔一段时间将学习率减小,以避免模型过拟合。
  • 损失函数平滑:在训练过程中,引入标签平滑和容忍度超参数来平衡学习目标。
  • 权重初始化:采用更加复杂的模型设计,或者使用预训练好的模型。
  • 数据增强:对训练数据进行数据增强,包括添加噪声、对抗攻击等。

RPA框架——使用RPA框架进行业务流程自动化

流程设计

使用RPA框架,首先需要先把要自动化的业务流程图设计出来。流程图的节点代表了一个动作,节点之间的链接线连接起来,整个流程图构成了完整的业务流程。流程图的设计人员可以使用任意的工具,如Visio、PowerPoint等,也可以使用画图软件软件如Microsoft Visio、Draw.io等。

流程调试

使用RPA框架,首先需要把流程的各个节点进行配置。配置的目的是给自动化脚本提供必要的运行信息。例如,某个节点可能需要输入文件的路径,可以配置这个节点,以便自动化脚本知道该文件在哪里。

流程部署

部署过程是将流程图、配置信息和自动化脚本部署到服务器上,使得自动化脚本能够在指定的时间、频率、条件下运行。一般情况下,部署会把自动化脚本部署到远程服务器上,这样就不需要担心部署的性能和带宽。

流程监控

最后,使用RPA框架,还需要进行监控,以检测脚本的运行情况,发现潜在的问题,并及时修复。监控包括查看脚本的运行日志、查看脚本的运行速度、查看数据库的状态等。

4.具体代码实例和详细解释说明

Python代码实例——使用GPT-3模型生成英文文章

import openai
openai.api_key = "YOUR API KEY" # enter your OpenAI key here
response = openai.Completion.create(
    engine="text-davinci-002",
    prompt="This is a test.",
    max_tokens=100,
    n=1,
    temperature=0.5,
    stop=["\n"]
)
print(response["choices"][0]["text"])

Java代码实例——基于RPA框架实现CitiBuy自动化业务流程

// start the agent by connecting to remote service
String ipAddress = "your server IP address"; // or domain name
int portNumber = 443;
AgentManager agentManager = new AgentManager();
agentManager.connect("https://" + ipAddress + ":" + String.valueOf(portNumber));

// define variables for automation script
HashMap<String, Object> vars = new HashMap<>();
vars.put("$customerName", ""); // input variable of customer name
vars.put("$customerEmail", ""); // input variable of customer email
vars.put("$cardNumber", ""); // input variable of credit card number
vars.put("$expiryDate", ""); // input variable of expiration date
vars.put("$securityCode", ""); // input variable of security code
vars.put("$billingAddressLine1", ""); // input variable of billing address line 1
vars.put("$billingCity", ""); // input variable of billing city
vars.put("$billingState", ""); // input variable of billing state
vars.put("$billingPostalCode", ""); // input variable of billing postal code
vars.put("$totalAmount", 0); // output variable of total amount

try {
  // start business process by starting an agent session on CitiBuy application
  AgentSession session = agentManager.startSession("CitiBuy");

  // send keys to fill out personal information form
  KeyStroke[] keystrokesCustomerName = {
      KeyStroke.fromString("Tab"),
      KeyStroke.fromString("John Doe"),
      KeyStroke.fromString("Enter")};
  session.sendKeys(keystrokesCustomerName);
  
  KeyStroke[] keystrokesCustomerEmail = {
      KeyStroke.fromString("Tab"),
      KeyStroke.fromString("<EMAIL>"),
      KeyStroke.fromString("Enter")};
  session.sendKeys(keystrokesCustomerEmail);
  
  // automatically generate fake credit card information using OCR technology
  ImageToTextConverter converter = new ImageToTextConverter("your API key", LanguageCode.ENGLISH);
  String cardNumber = converter.getImageText(imageFile).replaceAll("[^\\d]", "").trim();
  if (cardNumber == "") throw new Exception("Failed to extract credit card number.");
  String expiryDate = "01/2022";
  String securityCode = "*123";
  String[] billingAddressLines = {"123 Main St", "", "Anytown USA"};
  BillingDetails billingDetails = new BillingDetails(
      "$billingAddressLine1",
      "$billingCity",
      "$billingState",
      "$billingPostalCode",
      true);
  CreditCardInfo paymentInfo = new CreditCardInfo(
      cardNumber,
      expiryDate,
      securityCode,
      billingDetails);
  
  // set input variables with generated values from OCR system
  vars.replace("$cardNumber", cardNumber);
  vars.replace("$expiryDate", expiryDate);
  vars.replace("$securityCode", securityCode);
  vars.replace("$billingAddressLine1", billingAddressLines[0]);
  vars.replace("$billingCity", billingDetails.city);
  vars.replace("$billingState", billingDetails.state);
  vars.replace("$billingPostalCode", billingDetails.postalCode);
  
  // send keys to submit credit card information form
  KeyStroke[] keystrokesSubmitPaymentForm = {
      KeyStroke.fromString("Enter")};
  session.sendKeys(keystrokesSubmitPaymentForm);
  
  // wait until transaction completes successfully
  boolean transactionSuccess = false;
  int retryCount = 0;
  while (!transactionSuccess && retryCount < 5) {
    SessionResponse response = session.getSessionResponse();
    Document doc = Jsoup.parse(response.getResponse());
    Elements elements = doc.select("#content > div.checkoutSteps > table tr td");
    if (elements!= null && elements.size() >= 2) {
      try {
        float totalPrice = Float.parseFloat(elements.get(1).text().replaceAll("\\$", ""));
        System.out.println("Total price: $" + totalPrice);
        vars.replace("$totalAmount", totalPrice);
        transactionSuccess = true;
      } catch (Exception e) {}
    } else {
      Thread.sleep(1000); // sleep for 1 second before checking again
      ++retryCount;
    }
  }
  
} catch (Exception e) {
  e.printStackTrace();
} finally {
  // end the agent session gracefully
  agentManager.endAllSessions();
}