前言
本文假设您已经熟悉了来也科技的RPA产品“流程创造者”(UiBot Creator)的使用方法。如果您还不熟悉,推荐阅读来也科技的《RPA开发者指南》。
本文的图片保存在Github上。有的电信运营商有时不能正常访问Github,如果遇到图片无法显示的问题,请联系或更换您的电信运营商。
概述
来也科技的RPA产品“流程创造者”(UiBot Creator)可以把多条命令组装成一个RPA流程。除了内置的数百条命令之外,还可以通过添加额外的“命令库”,为其增加更多的命令。
注意:在老版本的“流程创造者”(UiBot Creator)及文档中,会把“命令库”称为“插件”。但新版本已统一采用“命令库”的说法,本文亦采取“命令库”的说法。
“流程创造者”的命令库通常是使用Python、C#、Java等语言编写的,其中又以Python较为多见。有经验的Python开发人员制作一个命令库不会很难,我们也在《RPA开发者指南》中讲到了基本的知识。但要做一个优秀的、可复用性好的命令库,会比较繁琐。
为此,我们提供了“命令库生成器”,以帮助您更好的制作出更好的命令库,造福更多的RPA开发者。
“命令库生成器”在以下几个方面为您提供帮助:
- 能够生成一个“命令库项目”,再由项目生成命令库。项目可以随时保存,下次再打开继续编写。也可以由项目生成命令库之后,再增补新的内容,然后再生成新版本的命令库。方便您的管理。
- 用图形界面的把制作一个命令库所需填写的信息表示出来,方便您一目了然的填写。如命令库的名字、标题、说明,以及命令库中的每个命令的名字、标题、说明等等。
- 对于大多数要填写的信息,都可以通过AI自动生成,然后您再对生成结果进行审阅和修改,大大减少您的工作量。
- 当命令库的相关信息填写完成后,可以根据所填信息,由AI自动生成质量较高Python代码及单元测试用例,不仅减少了工作量,也提高了命令库的严谨性。
- 自动打包生成命令库,甚至还能自动下载Python的依赖库且一并打包,进一步减少您的工作量。
“命令库生成器”使用了云上的大语言模型来作为AI引擎。因此,如果要使用自动生成相关的功能(如生成命令库的信息、生成命令库的Python代码),您必须保持接入互联网。但是,生成后的命令库,完全可以在离线环境下运行。
“命令库生成器”目前仅支持使用Python语言来编写命令库,未来会考虑支持其他语言。
准备工作
在使用“命令库生成器”之前,推荐您先安装来也科技的“流程创造者”(UiBot Creator)。因为将来生成的命令库都需要在“流程创造者”里面使用,如果安装了“流程创造者”,“命令库生成器”会自动使用其中的Python环境来进行调试,减少后期版本不兼容的麻烦。
“命令库生成器”并不是一个独立的软件,而是一个VS Code的扩展程序(VS Code extension)。VS Code的全称是Visual Studio Code,它是一款由微软开发的免费跨平台源代码编辑器,支持语法高亮、代码自动补全、代码重构等功能,并且还内置了命令行工具和 Git 版本控制系统。VS Code具有大量的扩展程序,通过安装不同的扩展程序,可以实现各种丰富的功能。
因此,为了使用“命令库生成器”,您需要先下载安装VS Code。“命令库生成器”是安装到VS Code中的一个扩展程序。其安装方法如下:
安装并打开VS Code,找到左边的Extensions栏目(如下图),切换到这个栏目。
安装后,在左边会出现一个类似于“魔法”的图标(如下图),它的名字是Laiye Command Library Generator。这个图标代表已经安装成功了。
点击“魔法”的图标,切换到“Laiye Command Library Generator”栏目,选择“Create new project”,即可新建一个命令库项目。
每个命令库项目都是一个文件夹,您可以在不同的文件夹创建不同的项目,生成不同的命令库。
如果要打开一个之前创建的项目,有以下几种方法:
- 在“Laiye Command Library Generator”栏目中,选择“Open exist project”,并选择项目所在的文件夹。
- 在VS Code的菜单中选择File --> Open Folder...或File --> Open Recent,并选择项目所在的文件夹。
- 如果您在关闭VS Code的时候,已经打开了一个项目,那么下次启动VS Code的时候,还会自动打开这个项目。
如果要关闭一个已经打开的项目,则只需要在VS Code的菜单中选择File --> Close Folder即可。
界面
无论上述哪种方法新建或打开一个命令库项目,稍后片刻后,会自动切换到“Laiye Command Library Generator”栏目,并显示出如下图所示的界面:
在这一界面中,左侧是命令库的信息维护界面,右侧暂时空白,稍后会用来显示命令库的Python代码。
左侧的命令库信息维护界面又分为上下两个窗口,上面的窗口标题是大写的“LIBRARY”(如图中的①所示),其中以树形结构表示了命令库的整体结构;下面的窗口标题是大写的“INFORMATION”(如图中的②所示),代表了命令库、某个命令或某个属性的相关信息。
在每个命令库项目中,有且仅有一个命令库,显示为图标,如上图中的new_library
就是一个命令库;每个命令库包含了多个命令,显示为图标,如上图中的command1
、command2
、command3
都属于命令;每个命令可能包含多个属性(也可以没有属性),显示为图标,如上图中的command2
命令有一个属性,名为property1
。
所以,这个树形结构其实是非常简单的,它的层级只可能有三级,第一级只有一个节点,也就是命令库,第二级的节点总是命令库里面的命令,而第三级的节点,就是命令的属性。
点击这个树形结构的各个节点,下面的INFORMATION窗口内容会自动切换。如果点击的是命令库,则显示命令库的相关信息;如果点击的是命令或属性,则显示的是被点击的命令或属性的信息。注意观察就不难发现,命令库、命令和属性的信息会有一定的差异。
如果点击了树形结构里面的命令,除了会切换到命令的相关信息之外,还会在右侧显示这个命令的Python代码。
Python代码的标题可能是一长串的UUID(如上图中的①所示),看起来很难懂,但不用担心,这里的设计思路是:
- 对于命令库来说,实际上每个命令库通常只有一个Python文件。所有命令的代码都在这个文件里。
- 但是,在“命令库生成器”中,我们会为每个命令自动维护一个Python文件,文件里仅包含当前命令的代码。以方便您独立编写和测试每个命令,避免互相干扰。
- 因此,在“命令库生成器”中,我们会在“发布”命令库的时候,把每个命令的Python文件都自动合并起来,最终形成一个文件。
- 所以,您不必关心每个命令所属的Python文件的名字,因为它们会在“发布”的时候被自动处理。
当鼠标移动到LIBRARY窗口上的时候,在窗口右上角会出现四个图标按钮(如下图),它们的作用依次是:
第一个按钮是登录来也科技的公有云账号,只有登录后,才能使用AI自动生成相关的功能(如生成命令库的信息、生成命令库的Python代码)。如果您没有登录,在使用这些功能的时候,也会提醒登录。
第二个按钮是发布命令库,它会把当前项目的命令库进行自动处理,包括合并Python文件、下载依赖库,等等,最终发布成为一个扩展名为.plg
的文件。
第三个按钮是全部保存,会把当前项目的所有信息都保存下来,以便下次打开继续编写。
第四个按钮是折叠,会把LIBRARY窗口的树形结构进行必要的折叠,不显示所有的属性,但显示所有的命令。以节省屏幕空间,且方便阅读。
编写命令库
在编写一个命令库的时候,应遵循下面的步骤:
- 把命令库的相关信息全部填写完毕;
- 对于每个命令,把命令的相关信息全部填写完毕;
- 对于命令的每个属性,把属性的相关信息全部填写完毕;
- 每个命令都有自己的代码,应把命令的信息,及其所有属性的信息都填写完毕后,再编写代码;
- 对每个命令依次编写代码,依次测试通过,全部完成后,再发布命令库。
上述过程看起来非常复杂,特别是当命令库里面包含的命令数量比较多的时候,工作量比较大。所以,“命令库生成器”提供了AI自动生成的功能,合理使用这一功能,将大大减少您的工作量。
但是,AI只是辅助人工的助手,所有填写的内容,仍然需要人工进行确认和验证。所以,即使有AI的帮助,上述步骤仍然是不可少的,需要按照步骤要求,一边用AI生成,一边人工修改,直到所有命令都完成为止。
下面以一个实际的例子来说明:
DeepL是一个优秀的翻译平台,能够通过先进的AI技术,在各种常见的语言之间进行比较精准的翻译,比如英语、法语、汉语、日语等等。我们希望实现一个命令库,通过调用DeepL的API,实现文本的翻译功能。如果有了这个命令库,对RPA开发者来说,会是一件强大的利器。
为了实现这个命令库,我们首先新建一个命令库项目,在命令库的“Description”(描述)栏目中,尽量详细的填写我们对这个命令库的需求。这里可以用英语填写,也可以用汉语填写。不用担心,AI识别各种语言的能力都很强,用英语或汉语都会有良好的表现。如果我们这里用英语填写,将来AI生成的内容也会尽量用英语;如果我们用汉语写,将来AI生成的内容也会尽量用汉语。
比如,这里我们用英语填写如下:
This is a library which can translate text using DeepL translate service
对于整个命令库来说,这段文字是唯一重要但又无法自动生成的内容。之所以说它重要,是因为一方面它会指导AI生成命令库,另一方面,也会在RPA开发者使用命令库的时候阅读到。所以,您未必要在这里写很多文字,但请务必认真填写,确保描述清楚。
写完命令库的Description后,下面有一个Autofill Related Fields
的按钮,点击这个按钮之后,AI就会根据Description里面已填写的内容,自动填写下面的一些栏目(如果您还没有需要登录到来也科技用户中心,这里会提示您登录后,才能自动填写)。如Name代表了命令库的名字,通常用英语,中间不能有空格,不同的命令库之间也不应该重名;Caption代表了命令的标题,通常更符合自然语言的习惯,容易让人读懂,等等。如下图所示:
除了上述内容之外,AI还会自动生成几条命令(如图中的TranslateText
、SetTargetLanguage
等)。如果命令库里面已经有命令了,会询问您覆盖已有的命令,或者是追加在已有命令的后面。根据需要选择即可。
点击已经生成的命令,下面的INFORMATION窗口会切换到该命令的相关信息,可以看到命令的Description、Name都已经被AI填好了,但还剩下一些栏目没有填,包括命令还没有任何属性。其实,并非这些内容无法自动生成,而是需要您先审阅、修改命令的Description栏目的内容,确保这些内容和您的预期一致,然后再点击Description栏目下面的Autofill Related Fields
按钮,自动填写后续内容。
“命令库生成器”的设计理念是:希望您和AI配合,逐层细化,先敲定命令库,再敲定命令,再敲定属性,最后再生成每个命令的代码。因此,在生成命令库的信息的时候,就不会把下属命令的所有信息都全部生成;同样,在生成命令的信息的时候,也不会把下属的属性的所有信息都全部生成。如果全部一次全部生成,一方面所消耗的时间太长,另一方面,如果命令的Description和您的设想有偏差,再根据有偏差的Description去生成其他信息,可能就会导致失之毫厘、谬以千里。
所以,当确认了命令的Description,再点击下面的Autofill Related Fields
按钮以后,虽然也会生成几个属性,但对于每个属性,仍然需要您再去确认它的Description,然后再把属性的所有信息都生成出来。
有些AI生成的命令、属性可能是多余的,需要把它们删掉。点击命令、属性后面的“垃圾桶”按钮,即可删除。例如,在上面的例子中,AI生成了五条命令,但我们经过考虑,认为只需要保留TranslateText
和GetUsageInformation
就够了,就可以把多余的三条都删掉。另外,当我们为TranslateText
生成相关信息的时候,会发现AI帮我们生成了三个属性,包括sourceText
、sourceLang
、targetLang
,分别代表待翻译的文本、待翻译文本的当前语言、要翻译的目标语言。但实际上稍微考虑一下,就能想到sourceLang
(待翻译文本的当前语言)是不需要的,因为完全可以在翻译的时候自动检测出来。所以,可以点击这个属性后面的垃圾桶(如下图所示),把它删掉。
也可能会有些命令、属性,本来是需要的,但AI没有生成,也需要我们添加进去。点击命令库后面的“加号”按钮,即可增加一个命令,点击命令后面的“加号”按钮,即可增加一个属性。
值得注意的是,由于大语言模型本身的特点,AI每次生成的内容可能都不太一样。如果一次生成的效果不尽如人意,还可以多次重试,直到满意为止。也有可能Name栏目已经比较令人满意了,但Caption栏目还不满意,此时只需要点击Caption输入框后面的“重新生成”按钮(如下图),AI会根据Description的内容,再次自动生成Caption的内容,而不再生成其他内容。这样一方面生成速度更快,另一方面也不会影响到那些已经满意的内容。
生成代码及调试
如前文所述,每个命令的Python代码是相互独立的,可以分别实现和调试。待发布的时候,会自动把这些代码合并起来。所以,当一个命令的所有信息(包括其下的属性的所有信息)都已经被填写完毕且确认后,就可以生成这个命令的Python代码了。
在LIBRARY窗口,点击要生成的命令,然后在下面的INFORMATION窗口,即可看到名为Generate Python Code
的按钮,点击这个按钮,AI会自动为这个命令生成Python代码,并在右侧的代码窗口中显示出来。在生成的过程中,Generate Python Code
按钮会变为忙碌状态(如下图所示),此时请稍候片刻,不要进行其他操作。当生成完毕以后,这个按钮会恢复可用的状态。
我们来看一下AI生成的Python代码:
# This is a generated script, please modify it as needed.
# When you edit the content, and generate again, your changes will be OVERWRITTEN.
import requests
import unittest
def TranslateText(TextToTranslate, TargetLanguageCode):
"""
Translates a given text from one language to another using DeepL's translation service.
:param TextToTranslate: The text to be translated.
:param TargetLanguageCode: The language code of the target language.
:return: The translated text in the target language.
"""
# Normally, you would need an API key to use the DeepL API, but for the purpose of this example,
# we will assume that the API key is already set in an environment variable or configuration file.
api_key = 'your_api_key' # Replace with your actual API key
url = "https://api.deepl.com/v2/translate"
headers = {
"Authorization": f"DeepL-Auth-Key {api_key}"
}
data = {
"text": TextToTranslate,
"target_lang": TargetLanguageCode
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
translated_text = response.json()['translations'][0]['text']
return translated_text
else:
raise Exception(f"Error: {response.status_code}, {response.text}")
# Unit test class
class TestDeepLTranslate(unittest.TestCase):
def test_TranslateText(self):
# This is a mock test, as we cannot actually call the DeepL API without a valid API key.
# In a real-world scenario, you would mock the requests.post method to return a predefined response.
self.assertEqual(TranslateText("Hello, world!", "DE"), "Hallo, Welt!")
self.assertEqual(TranslateText("Good morning", "FR"), "Bonjour")
# Add more test cases as needed
这段代码分为两部分,一个是TranslateText
函数,它是TranslateText
命令的Python实现;另一个是TestDeepLTranslate
类,它是根据Python的单元测试框架,对TranslateText
函数进行单元测试的。可以看到里面有两个测试用例,一个是把英语Hello, world!
翻译成德语,并和德语的Hallo, Welt!
进行比较;另一个是把英语Good morning
翻译成法语,并和法语的Bonjour
进行比较。如果这两个用例都测试通过,就认为单元测试通过了。代码中的注释提醒我们,还可以增加更多的用例。
由于我们之前是用英语来描述这个命令的,所以这里生成的注释也是英语。如果之前用了汉语来描述,这里的注释也会大多数都用汉语了。
这段AI生成的代码其实比普通的程序员写的还要好一些,至少代码风格是无可挑剔的。但我们仍然需要进行少量的人工修改。比如,在 api_key = 'your_api_key'
这一行,我们需要从DeepL申请一个API Key,并且填写到这里(当然,这样做仅用于测试还可以。实际应用中,因为API Key是收费的,往往需要让用户来购买,并设置自己所购的API Key)。
填好API Key之后,就像在VS Code里面运行普通的Python程序一样,选择VS Code的“Start Debugging”或“Run Without Debugging”功能,即可开始单元测试。测试的结果会显示在VS Code的TERMINAL窗口,如下图,显示了一个OK,说明测试通过了。
反之,有时也可能测试不通过。如下图中,TERMINAL窗口显示了FAILED,表示测试不通过。此时可以根据上面的错误信息,判断可能发生的问题,并手工修改Python代码,直到测试通过为止。
值得注意的是:
- 如前所述,由于大语言模型本身的特点,AI每次生成的内容可能都不太一样。对于生成代码来说,每次生成的差异可能更大。所以,如果对生成的代码不满意,除了手工修改之外,也可以再次自动生成。如果再次自动生成,之前的代码会被覆盖,请谨慎操作。
- 有的Python代码还会依赖第三方的Python库。如果第三方库没有下载,也会测试不通过。这时需要点击命令库,并在INFORMATION窗口中找到Dependencies(依赖)栏目,在其中填写所需的第三方库。这里可以按照Python的Requirements文件格式来填写,当然最简单的方法就是把依赖库的名字逐行写到Dependencies栏目里。填好以后,点击下面的
Fetch Dependencies
按钮,会自动下载安装这些第三方库,您无需关心细节。下载完成后,再去调试,就可以成功了。例如在下图中,这个命令库依赖Google Cloud Python SDK,则只需要在Dependencies栏目里面填写google-cloud
,然后点击Fetch Dependencies
按钮(如下图中的①所示),待右侧的TERMINAL窗口显示Successfully installed google-cloud-0.34.0
之后(如下图中的②所示),说明已经自动安装完成。
发布/导入命令库
当命令库中的所有命令都已经生成了代码,并测试通过之后,就可以发布命令库了。命令库项目可以随时更新迭代,所以未必要等到每个命令都彻底完善了再发布,可以先发布一个功能不那么完善但可用的版本,后续再来改进。
鼠标移动到LIBRARY窗口上,在右上角找到Publish(发布)按钮,点击之后,会对当前命令库项目进行必要的检查,包括:
- 如果命令库、命令或属性的必填字段(在界面上用红色的 * 符号显示)还没有填,则会提示有内容缺失,需要补上。
- 如果某个命令的Python代码仍然未生成,则会提示缺少代码,需要补上。
- 如果某个命令的Python代码没有通过语法检查,则会弹出警告窗口,但仍然可以继续发布。
- 如果命令库有第三方依赖库,则会重新下载(第一次下载速度比较慢,第二次以后有缓存机制,速度很快),以确保没有多余的内容。
命令库发布完成后,会生成一个扩展名为.plg
的文件。对于这个文件,可以有以下几种方法,提供给RPA开发者使用:
上传到来也科技的命令中心(可私有部署),并过命令中心的审核后,RPA开发者可以在命令中心看到,并下载使用。
祝您使用愉快!