使用RPA通过GPT大模型AI Agent自动执行业务流程任务企业级应用开发实战:企业级应用开发的挑战与解决方案
1.背景介绍
随着移动互联网、物联网和智能设备等新兴技术的发展,在信息化领域所面临的各类复杂任务愈发呈现出难以解决的特点,并非单一类型的问题能够满足需求。这些任务通常涉及快速响应机制、精准分析能力以及及时反馈机制等多个方面,并非简单的技术难题亦能完美解决这些问题。在这种背景下单纯依靠人工智能(AI)的方法来应对相关问题并不能达到理想效果;相反应当着重考虑人类智慧与创造力的作用,并引入自动化解决方案以提升整体效率水平。为此可采用聊天机器人(Chatbot)、半自动化机器人(Hybrid Bot)以及基于规则引擎(Rule Engine)的技术手段来实现更为高效的业务流程处理工作。近期英伟达公司推出了一款名为GPT-3的语言模型系统这一创新性的人工智能架构能够整合文本生成能力、图像理解能力以及语音合成等多种核心功能模块并具备高度的智能化水平;其中基于大规模预训练Transformer模型(BERT/RoBERTa等)构建而成的预训练语言模型GPT展示了卓越的能力特点:其不仅支持对话交流而且还能够在生成精确且逼真的自然语言方面展现出显著优势;值得注意的是该模型采用Transformer架构设计需要依赖于巨大的计算资源以及海量的数据量来进行训练工作;这使得其在对话生成能力、文本摘要能力以及多轮对话交流等方面均展现出突出的应用价值;然而其缺乏足够的编程灵活性导致实际应用中操作较为繁琐不便;因此如何将GPT模型成功应用于企业级业务流程自动化开发这一议题便成为了当前研究工作的热点方向之一
2.核心概念与联系
2.1 GPT-3模型
英伟达于2020年9月推出了基于大规模Transformer架构的语言模型GPT-3(Generative Pre-trained Transformer 3)。该模型由两个主要阶段构成:第一阶段是基于GPT-2构建的基础模型。第二部分则借鉴了GPT-2的训练方法,在更大规模的数据集上进行优化和迭代。这一过程包括从维基百科等多来源获取海量文本数据,并利用更先进的计算资源以更快的速度完成训练工作。其核心设计理念在于通过海量数据、高速计算和先进硬件配置来显著提升语言处理能力。目前版本已支持包括英语在内的17种语言使用与开发环境,并且中文版本仅限于纯中文输入。
图1: GPT-3模型结构示意图
2.2 RPA
Robotic Process Automation(RPA),即一种通过计算机指令控制电脑以完成特定任务的数字化技术。该技术自上世纪九十年代末由微软发布了一款名为Windows Workflow Foundation的产品开始,在随后的十多年间内众多公司相继推出了基于RPA的各种协作工具。其目标不仅在于彻底取代传统的人工操作方式,并且还致力于提升工作效率和智能化水平
RPA的特点:
-
可编程性强:可直接编写脚本、可视化界面或图形化界面,降低了使用门槛;
-
技术简单易懂:无需安装额外的软件,仅需配置运行环境即可;
-
执行效率高:原生支持Windows系统,拥有高性能计算能力;
-
成本低廉:几乎免费;
-
广泛应用于多个行业领域:RPA已在多个领域中被采用包括但不限于金融、零售、制造等以及供应链管理、人力资源管理与医疗卫生等多个重要领域
图2: RPA市场占有率
2.3 智能客服系统
智能客服系统是一种能够响应用户咨询请求并提供便捷服务的企业级软件系统。伴随着移动互联网、物联网及智能化设备的发展趋势,在商业模式中愈来愈依赖于智能客服系统的支撑作用。众多知名品牌的购物网站及餐饮平台已纷纷推出智能化客服系统解决方案,例如亚马逊采用Alexa聊天机器人进行实时对话服务,在线处理消费者问题;而Uber则通过其UberTAG等技术手段提供智能化客户服务方案,并通过滴滴打车平台为用户提供便捷的产品与售后咨询服务。消费者即可实现线上便捷的产品和服务咨询与售后支持获取,并有效缓解客户服务中心的压力。此外,在企业微信及钉钉等即时通讯工具的支持下构建的智能客服平台也逐渐发展完善。
图3: 智能客服市场占有率
3.核心算法原理和具体操作步骤以及数学模型公式详细讲解
3.1 模型构建
3.1.1 数据准备
首先必须收集充足的训练数据作为基础输入。GPT-3.5-Turbo作为一种先进的自然语言处理工具其本质是一种基于大规模预训练的语言模型旨在通过分析海量文本来模仿人类的复杂思维过程和自然语言表达能力。在实际应用中为了使该系统充分发挥其潜力必须确保其具备高质量多样化的训练材料这包括大量的文本片段文档内容以及相关语料库等丰富资源以满足其深度学习的需求为此必须确保这些核心资源能够得到充分而系统的准备为此我们详细规划了以下各项准备工作
爬取和整理数据源:为了弥补GPT模型的数据不足,在新闻、微博等平台收集海量数据以训练该模型。
数据标注旨在将原始数据转换为规范的训练数据格式,并涉及词语分隔、词性识别以及句法结构分析等步骤。
用于生成样本数据, 模型能够自主生成的文字片段也可作为候选内容;此外还可以从原始训练材料中提取相关语句作为补充.
3.1.2 数据预处理
将数据按照模型训练的要求进行格式转换。主要包括以下几个方面:
为了避免内存溢出,必须将每个句子分割成固定长度的块,并设定其长度为512及以上。
-
分词过程:将每个句子分解为单词,并对应地获取每个单词的token id。其输入均为连续排列的token id序列。
-
Padding:Padding操作旨在实现每条数据序列长度的一致性。当某条序列较短时, 系统会通过自动补齐机制将其扩展至与最长序列一致的长度, 并将填补到一致长度的位置
Target Sampling:目标采样旨在确保训练过程的稳定性,在训练过程中,模型避免总是预测同一token,并通过施加随机噪声干扰来促进多样的预测结果。
- Batching:为了加快训练速度,将所有数据按一定比例组合成批次。
GPU上的优化:当在GPU上执行模型训练时,实施一些加速操作以提高效率。例如采用混合精度训练策略。
3.1.3 模型定义
确定模型架构时,请选择采用GPT-2或GPT-3架构。若采用基于该架构(即GPT-2)的设计,则需进行优化;若选用的是更为复杂的架构(即GPT-3),则最显著的变化在于其结构深度增加一层,并能更好地捕捉长期依赖关系。
3.1.4 模型训练
进行模型训练,包括:
-
设置训练超参数:包括batch size,学习率,权重衰减率等。
-
定义优化器:设置优化器,比如AdamW优化器。
-
定义损失函数:设置损失函数,比如交叉熵loss。
-
加载数据集:载入预处理好的数据集。
-
模型训练:模型训练包括梯度下降、更新参数等。
-
保存模型:保存训练好的模型。
3.1.5 模型评估
模型评估用来衡量模型的表现。一般来说,GPT模型的评价指标包括:
Perplexity:语言模型的困惑度是衡量其训练效果的重要指标。它反映了基于对数平均概率评估的语言模型性能。较低的困惑度数值预示着模型性能更为优秀。
-
Accuracy:正确预测的准确率。
-
F1 score:F1 score是precision和recall的调和均值。
-
BLEU Score:BLEU Score表示了生成的句子与参考句子之间的一致程度。
ROUGE分数是一种句子级别的评估指标;该评估指标旨在衡量生成的句子与参考句子之间的相关性,并能够提供不同长度下生成文本与参考文本之间的匹配程度。
3.2 自动回复模型
该自动回复模型基于智能客服系统构建了反馈文本生成模型。通过分析用户的提问文本内容,识别其意图并利用检索相关数据、统计分析以及分类处理等方式,在知识库中检索出匹配度最高的信息并返回给用户。
自动回复模型的流程图如下:
图4: 自动回复模型流程图
自动回复模型的关键组件包括:
关键信息识别:在用户的输入中识别关键信息,并准确捕捉到用户问题的核心内容。
-
问题理解:对提取出的关键词进行分类,找出其所属的技能。
-
问题匹配:通过检索算法找到与用户问题最相关的问题。
-
答案生成:基于检索结果、用户问题、知识库等因素,生成答案。
3.3 订单系统自动化
该系统旨在对企业内部的销售 orders, inventory 和 production management 等相关环节进行监控和管理。由于不同岗位的操作人员负责企业内的 sales orders, inventory 和 production management 等环节,在现有运作模式下存在效率不足的问题,并且操作流程中可能出现漏洞而导致整个系统的准确性受到影响。为了提高整体运营 efficiency 和 accuracy 的需求,在当前环境下建议引入一套 automated operational management system.
订单系统自动化的流程图如下:
图5: 订单系统自动化流程图
订单系统自动化的关键组件包括:
对订单数据展开清理工作:包括去重处理、缺失值填补以及离群点识别等步骤
-
数据预处理:对订单数据进行预处理,如标准化、归一化等。
-
模型训练:使用机器学习算法对订单数据建模,建立数据之间的联系。
-
模型评估:对订单数据进行评估,判断模型是否有效。
-
自动标记:对订单进行自动标记,如标签分配、特征工程等。
-
结果展示:显示订单的整体情况,如订单数量、时间分布等。
3.4 工厂生产线自动化监控
工厂生产线自动化监控涵盖对企业内生产设备及其运行状态实施实时监控的技术体系。该系统通常依靠先进监测与控制设备来辅助企业管理者实现精准决策支持。鉴于生产设备运行中的异常状况可能引发巨大经济损失,在当前环境下建议尽快部署一套完善的自动化监控系统以便有效预防和及时处理可能出现的问题。
工厂生产线自动化监控的流程图如下:
图6: 工厂生产线自动化监控流程图
工厂生产线自动化监控的关键组件包括:
数据收集:工厂生产线的运行所生成的数据被系统中的采集装置所接收,并且涉及的主要设备包括用于检测生产参数的传感器组阵以及用于监控生产流程的关键工艺装置;此外还包括控制生产过程的核心控制器和用于工业控制的标准PLC设备。
数据收集:工厂生产线的运行所生成的数据被系统中的采集装置所接收,并且涉及的主要设备包括用于检测生产参数的传感器组阵以及用于监控生产流程的关键工艺装置;此外还包括控制生产过程的核心控制器和用于工业控制的标准PLC设备。
数据预处理:针对工厂生产线上的采集数据进行整理与清理工作,例如删除重复记录、填补缺失值以及识别并剔除异常值等步骤。
- 数据预处理:对工厂生产线数据进行预处理,如标准化、归一化等。
模型训练采用机器学习算法对工厂生产线数据进行建模,并构建其间的关联关系
- 模型评估:对工厂生产线数据进行评估,判断模型是否有效。
数据分析:向用户提供数据分析结果,并涵盖工艺路线分析以及设备故障报警等内容。
4.具体代码实例和详细解释说明
为便于读者更好地理解文章内容,在此将提供相应的代码示例,并对各个模块进行详细阐述
4.1 自动回复模型Python代码实例
import jieba
from gpt_gen import GPTGenerator
from typing import List, Tuple
from collections import defaultdict
import json
def load_data() -> dict:
"""
从文件中读取数据,返回字典类型数据
:return:
"""
data = {}
with open('data.json', 'r') as f:
for line in f:
q, a = json.loads(line)
data[q] = a
return data
class AutoReplyModel():
def __init__(self):
self.generator = GPTGenerator('pretrain_model/') # GPT模型加载
self.keyphrase_dict = self._load_keywords('keywords.txt') # 关键词加载
def _load_keywords(self, file_path: str) -> dict:
"""
加载关键词文件
:param file_path:
:return:
"""
keyphrases = {}
with open(file_path, 'r') as f:
lines = [l.strip().split('\t')[0] for l in f if not l.startswith('#')]
for k in lines:
words = list(jieba.cut(k))
keyphrases[''.join(words)] = len(words)
return keyphrases
def extract_keyphrases(self, sentence: str) -> List[str]:
"""
提取关键词
:param sentence: 用户输入句子
:return: 返回句子中所有关键词
"""
keywords = []
sentences = list(jieba.cut(sentence))
for i in range(len(sentences)):
w = ''.join([w for w in sentences[:i+1]])
if w in self.keyphrase_dict and len(w)>1:
keyword = tuple([''.join(list(jieba.cut(word))) for word in jieba.cut(sentence)[max(0,i-self.keyphrase_dict[w]):i]] + [''.join(list(jieba.cut(word))) for word in sentences[i:]])
if all([tuple(jieba.cut(sent))[j] == word or j>=len(tuple(jieba.cut(sent)))-len(keyword)+1 for sent, j, word in zip(sentences, range(i), keyword)]) and set(keyword)<set(sentences):
keywords.append((''.join(list(jieba.cut(word))), max(0,i-self.keyphrase_dict[w]), i))
return [(words, start, end) for words, start, end in sorted(keywords, key=lambda x:x[-1])]
def predict(self, question: str) -> str:
"""
预测答案
:param question: 用户输入的问题
:return: 答案文本
"""
# 获取候选关键词列表
keyphrases = self.extract_keyphrases(question)
# 根据关键词,找到对应技能
skill = ''
for phrase in keyphrases:
if phrase[0] in self.keyphrase_dict:
skill += '-' + '-'.join(phrase[:-1]).replace('-',' ')
answer = ''
if skill!= '':
answers = self.get_answers(skill)
# 对答案进行排序和筛选
answer = ''
scores = []
counts = defaultdict(int)
for ans in answers:
for kw in keyphrases:
if kw[0].lower() in ans.lower():
count = sum([ans.lower().count(word.lower()) for word in re.findall('[a-zA-Z]+', ans.lower()) if any(char.isdigit() for char in word)]) * sum([ans.lower().count(kw[0].lower())]) / len(re.findall('[a-zA-Z]+', ans.lower())) - min(len(ans)-sum([ans.lower().count(word.lower()) for word in re.findall('[a-zA-Z]+', ans.lower()) if any(char.isdigit() for char in word)]), len(ans)//2) * (1-abs((start - end)/(end-start))/10)*(-scores.index(len(ans))+1)/len(scores)**0.5*(counts[ans]/sum(counts.values()))**2
if ans not in self.history and ans!='':
count *= 2
counts[ans] += 1
break
scores.append(count)
indices = sorted(range(len(scores)), key=lambda i: (-scores[i], i))[:min(len(scores), 3)]
candidates = [ans for i, ans in enumerate(sorted(answers)) if i in indices][:3]
# 如果多个候选答案都具有相同的得分,则随机返回其中一个
random.shuffle(candidates)
answer = '\n'.join(candidates)
else:
# 当无法识别技能时,生成一些随机文本
while True:
text = self.generator.generate(prompt='问题:'+question+'\n答案:', temperature=0.9, top_p=0.9)
if text is None or ('是' in text and '不是' in text) or len(text)<20:
continue
answer = text
break
return answer
def get_answers(self, skill: str) -> List[str]:
"""
通过技能名称查找答案
:param skill: 技能名称
:return: 答案列表
"""
# TODO:查询数据库或文件获取答案
pass
代码解读
以上代码实例中,AutoReplyModel类负责实现自动回复模型的功能。
在构造函数内部,利用GPTGenerator类导入GPT-3模型实例,并导入预先训练完成的模型实例。关键词文件的名字格式应设为'技能名称+关键词'形式。例如,在'包裹质量保障'技能对应的关键词文件名为'包裹质量保障-质量'
函数load_data()负责从本地文件中获取数据;其格式应为JSON格式;其中每一行对应一个问答对。
该函数用于从输入中提取关键信息,并通过分词、统计等方式实现这一目标。其采用“子串模式识别”策略,在给定文本中搜索与之相关的词汇或短语。具体而言, 当某个词汇序列的部分与整个文本末尾部分相吻合, 并且没有连续数字结尾时, 则认定该序列属于关键信息。
该预测函数依据关键词提取结果进行分析,并将问题进行分类处理以识别出相关的技能类别。基于技能名称这一特征信息, 通过数据库或相关文件获取所需信息, 并结合关键词的重要性程度, 最终输出一组可能的答案集合。
get_answers()函数通过技能名称,查找数据库或文件获取相应的答案。
4.2 订单系统自动化Python代码实例
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.ensemble import RandomForestClassifier
from joblib import dump, load
class OrderSystemAutomator():
def __init__(self):
scaler_path = 'order_scaler.joblib'
clf_path = 'order_clf.joblib'
if os.path.exists(scaler_path) and os.path.exists(clf_path):
self.scaler = load(scaler_path)
self.clf = load(clf_path)
else:
df = pd.read_csv('orders.csv')
self.X = df.drop('label', axis=1).fillna('')
self.y = df['label']
self.scaler = StandardScaler()
self.X = self.scaler.fit_transform(self.X)
self.clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
self.clf.fit(self.X, self.y)
dump(self.scaler, scaler_path)
dump(self.clf, clf_path)
def predict(self, orders: List[Tuple[str, int]]) -> Dict[str, float]:
X = np.zeros((len(orders), 6))
for i, order in enumerate(orders):
feature = self.get_features(order)
X[i,:] = feature
y = self.clf.predict_proba(X)[:,1]
result = {os[0]:float(o) for o, os in zip(y, orders)}
return result
def get_features(self, order: Tuple[str, int]) -> List[float]:
"""
为每个订单获取特征
:param order: 订单元祖,格式为("时间|数量|颜色|重量",数量)
:return: 订单的特征列表
"""
features = np.zeros(6)
info = order[0].split('|')
time = datetime.datetime.strptime(info[0], '%Y-%m-%d %H:%M:%S').timestamp()-datetime.datetime(year=1970, month=1, day=1).timestamp()
features[:2] = [time*100, order[1]]
colors = {'红色':'red', '绿色':'green', '蓝色':'blue'}
weights = {'轻':'light', '中':'medium', '重':'heavy'}
try:
color = next(k for k, v in colors.items() if v==info[2])
weight = next(k for k, v in weights.items() if v==info[3])
features[[3,4,5]][[colors.keys().index(color), weights.keys().index(weight)]] = 1
except StopIteration:
print('颜色和重量信息不正确!')
return list(features)
代码解读
以上代码实例中,OrderSystemAutomator类承担自动化流程的运作机制。
在构造函数内部,在构造函数中
预测函数predict()采用订单祖先列表作为输入,并基于get_features()函数获取每个订单的具体特征信息。随后会对所获得的特征进行预测分析,并最终输出相应的预测结果。
get_features()函数会从每个订单中提取所需信息;这些信息主要包括:订单发生的时间、数量、颜色以及重量等基本属性。其中关于时间的信息会被转换成时间戳的形式供后续分析;而颜色和重量这两项属性则会被转化为数值型数据并采用字典映射的方法进行编码;最终将上述编码结果进一步转化为one-hot编码形式并将这些结果整合成一个向量空间中的向量表示
4.3 工厂生产线自动化监控Python代码实例
import requests
import xmltodict
import logging
import numpy as np
import time
import threading
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
logger = logging.getLogger(__name__)
class FactoryLineMonitor():
def __init__(self):
self.url = "http://localhost:8080"
self.deviceIds = ["DeviceId1", "DeviceId2"]
self.sensorNames = {"Temperature": ("Sensor1", "0"),
"Humidity": ("Sensor2", "0")}
self.running = False
self.lock = threading.Lock()
self.stop_event = threading.Event()
self.interval = 60
self.data = {did:defaultdict(list) for did in self.deviceIds}
def run(self):
self.running = True
t = threading.Thread(target=self._monitor)
t.start()
def stop(self):
self.running = False
self.stop_event.set()
def _monitor(self):
logger.info('Start monitoring...')
while self.running:
results = {}
for deviceId in self.deviceIds:
reqUrl = "{}?{}".format(self.url+'/rest/DataGetController/'+deviceId,
"&".join(["{}={}".format(v[0],v[1]) for k,v in self.sensorNames.items()]))
res = requests.get(reqUrl)
doc = xmltodict.parse(res.content)['root']['item'][0]['deviceDetail']
deviceType = doc['@devicetype']
sensorValues = doc['sensorValueList']['sensorValue']
values = {k:(float(v) if v.isnumeric() else "") for sv in sensorValues if '@name' in sv and sv['@name']==sn for sn,sv in self.sensorNames.items()}
results[deviceId] = {'type':deviceType, **values}
timestamp = round(time.time()*1000)
self.save_data(results, timestamp)
time.sleep(self.interval)
def save_data(self, results, timestamp):
with self.lock:
for did, d in results.items():
for k, v in d.items():
if isinstance(v, float):
self.data[did][k+'_'+str(timestamp)].append(round(v, 2))
def get_last_data(self, deviceTypes=[]):
with self.lock:
now = round(time.time()*1000)
last_data = {}
for did, dd in self.data.items():
type_filter = deviceTypes if deviceTypes!=[] else ['ALL']
for k, timestamps in dd.items():
category, metric = k.split('_')
if category in type_filter or 'ALL' in type_filter:
value = np.mean([ts[-1] for ts in timestamps if now-ts[-1]<60*1000*15])
if value!="":
last_data[(did,category,metric)] = value
return last_data
代码解读
在上述代码示例中,FactoryLineMonitor类承担了自动化生产线的监控功能。
在配置过程中执行初始化操作时,请注意包含以下若干基础参数:网络路径、设备标识符集合以及传感器信息表等关键要素,并确保多线程防护机制的有效运行以避免资源冲突。同时需设置程序终止标志位并建立定时采集周期机制以实现数据同步功能。
该函数通过启动监控线程来执行任务。该线程通过发送请求至设备端口以获取实时数据,并将这些信息存储在容器中。该过程按固定时间间隔自动更新数据库中的相关内容。
stop()函数终止监控线程,并设置停止事件。
_monitor()函数用于监控线程,并向设备发送请求以获取相关数据;该函数还负责调用save_data()函数将数据存储至数据容器内。
save_data函数负责向数据容器提交新增数据的操作。每当接收到含有目标设备ID和传感器名称的信息时,在满足特定条件下完成操作
get_last_data()函数负责获取最近数据的操作。它会从数据容器中提取最近的历史数据,并将其返回给调用方。
