创建工作流
支持开发者基于Agent平台创建工作流。创建工作流时,工作流默认包含了开始、结束和大模型组件。开发者可基于该工作流,添加更多的组件,实现业务流程的编排。
- 登录ModelArts Studio大模型开发平台,进入所需空间。
- 在左侧导航栏中选择“Agent开发”,将跳转至Agent开发平台。
- 单击左侧导航栏“工作台”,在“工作流”页签,单击右上角“创建工作流”。
- 配置工作流的名称和描述,并单击“确认”。
图1 编辑工作流基本信息
- 创建工作流后,页面会自动跳转至工作流编辑页面。初始状态下,工作流包含开始、结束和大模型组件。
- 用户可根据需求配置所需组件,并连接其他组件。除开始、结束和大模型组件外,平台提供了意图识别、提问器、插件、判断、代码组件,配置详见配置意图识别组件、配置提问器组件、配置插件组件、配置判断组件、配置代码组件。
- 当构造完成一个工作流,可以尝试运行该工作流。单击右上角“试运行”,在对话框中输入问题,等待返回试运行结果。
图2 试运行工作流
配置开始组件
开始组件用于触发一个工作流,用户的输入由开始组件进行承载,是每个工作流的入口组件。不支持新增或者删除开始组件。
单击画布中的开始组件,打开参数配置页面。开始组件的参数默认已配置,不支持修改开始组件的参数配置。
配置结束组件
结束组件是工作流给出输出的组件,其标识着工作流的结束。每个工作流执行完成后,都需要一个结束组件用于输出工作流的执行结果。结束组件后,不支持添加其他组件。不支持新增或者删除结束组件。
结束组件可能会有多个输入,但是只能有一个输出值,因此需要开发者在“指定回复”中合并多个输入值为一个输出值。
- 单击画布中的“结束”组件,打开参数配置页面。
图4 结束组件配置图
- 在“参数配置”中,配置输入参数。
表1 参数说明表 参数名称
说明
参数名称
由开发者自定义变量名。
参数的名称长度必须大于等于1个字符,并且字符只允许为下面三种类型:
- 字母(A-Z或a-z)
- 数字(0-9)
- 特殊字符:_
取值
支持“引用”和“输入”两种类型。
- 引用:支持用户选择工作流中已包含的前置组件输出变量值。
- 输入:支持用户自定义取值。
- 支持用户将多个输入变量合并成一个字符串输出,使用 {{变量名}} 代指上述定义的输入参数。
如上已定义输入参数:end_input,在指定回复中,{{end_input}} 即代表参数值。例如end_input值为hello,指定回复中为{{end_input}} world,则最终的输出即为helloworld。
当然,也可以使用快捷方式选择变量。例如,当在指定回复输入框中输入 { 或者 / 的时候,会显示出上述已经定义的所有的变量的列表供选择。
- 单击“确定”,完成参数配置。
配置大模型组件
大模型组件提供了使用LLM的能力,用户可以通过在UI界面上编写Prompt、设置LLM的参数来让LLM完成指定的任务。
- 单击画布中的“大模型”组件,打开参数配置页面。
图5 查看大模型组件参数配置
- 在“参数配置”中,配置输入和输出参数。
- 输入参数
将提供给“提示词配置”中Prompt使用。
表2 输入参数 参数名称
说明
参数名称
输入参数名称。
参数的名称长度必须大于等于1个字符,并且字符只允许为下面三种类型:
- 字母(A-Z或a-z)
- 数字(0-9)
- 特殊字符:_
取值
支持“引用”和“输入”两种类型。
- 引用:支持用户选择工作流中已包含的前置组件输出变量值。
- 输入:支持用户自定义取值。
- 输出参数
用于解析大模型组件的输出,并提供给后序组件的输出参数引用。
表3 输出参数 参数名称
说明
参数名称
输出参数名称。
参数的名称长度必须大于等于1个字符,并且字符只允许为下面三种类型:
- 字母(A-Z或a-z)
- 数字(0-9)
- 特殊字符:_
说明:用户自定义输出参数名称不允许与内置输出参数rawOutput同名。大模型组件有一个内置输出参数rawOutput,代表该组件未经解析的原始输出,与大模型组件相连的后序组件可以直接引用该输出。
类型
输出参数的类型,当前可选类型只有String。
描述
对于该输出参数的描述。
如下场景时,可以通过配置输出参数来解析大模型组件的输出:
当大模型组件的输出为json格式的数据时,可以通过配置输出参数来解析出json中对应字段的值。例如大模型组件的输出为json数据'{"result": "test"}'时,可以添加一个参数名称为“result”的输出参数,那么输出参数“result”就会从json数据中取出同名字段对应的值“test”。
- 输入参数
- 在“模型配置”中,选择要使用的大模型,并通过拖动滑条来设置参数“核采样”和“温度”。
- 模型选择:选择要使用的LLM,不同的模型效果存在差异。
- 核采样:模型在输出时会从概率最高的词汇开始选择,直到这些词汇的总概率累积达到核采样值,核采样值可以限制模型选择这些高概率的词汇,从而控制输出内容的多样性。建议不要与温度同时调整。
- 温度:用于控制生成结果的随机性。建议不要与核采样同时调整。
- 调高温度,会使得模型的输出更具多样性和创新性。
- 降低温度,会使输出内容更加遵循指令要求,但同时也会减少模型输出的多样性。
- 配置提示词信息,并选择是否打开记忆功能。
写提示词时,支持使用{{variable}}的格式引用本组件输入参数中已定义好的参数。
- Prompt:大模型的系统提示词,用于指导模型更好的完成任务。
- 记忆:聊天记忆,打开后可记录多轮对话的内容。默认关闭。
- 单击“确定”,完成参数配置。
- 连接大模型组件和其他组件。
配置意图识别组件
意图识别组件用于根据用户的输入进行分类并导向后续不同的处理流程。
意图识别组件一般位于工作流前置位置。在对用户的输入进行意图识别时,意图识别组件会通过大模型推理,匹配用户输入与开发者预先定义的描述类别的关键字,并根据匹配结果流向对应处理流程。
- 在左侧组件面板中拖拽出一个“意图识别”组件,并放置在工作流中。
- 单击画布中的“意图识别”组件,打开参数配置页面。
图6 意图分类配置图
- 在“参数配置”中,配置输入参数。
表4 输入参数 参数名称
说明
参数名称
默认名称input,为固定值,不可编辑。
取值
支持“引用”和“输入”两种类型。
- 引用:支持用户选择工作流中已包含的前置组件输出变量值。
- 输入:支持用户自定义取值。
- 配置“分类配置”中的相关信息。
在分类输入框中输入分类描述信息,描述信息为针对该类别的描述语句或者关键词,同时也将作为LLM进行推理和分类的依据。类别数量为2 ~ 5个。
- 配置“高级配置”中的相关信息。
高级配置项供进阶开发者修改模型和提示词,如果不配置将会使用系统默认值。模型的选择和提示词的撰写可能影响到意图分类组件的准确性。
- 单击“确定”,完成参数配置。
- 连接意图分类组件和其他组件。
配置提问器组件
在工作流中,提问器组件给开发者提供了收集回复用户问题所必需信息的能力。提问器组件将会循环执行,直至将所需的信息收集完整。
- 在左侧组件面板中拖拽出一个“提问器”组件,放置在工作流合适的位置。
- 单击画布中的“提问器”组件,打开参数配置页面。
图7 提问器配置图
- 在“参数配置”中,配置输入和输出参数。
- 输入参数
表5 输入参数 参数名称
说明
参数名称
由开发者自定义,可以通过双花括号形式在后续“问题配置”中被参数“问题”引用。
参数的名称长度必须大于等于1个字符,并且字符只允许为下面三种类型:
- 字母(A-Z或a-z)
- 数字(0-9)
- 特殊字符:_
示例:输入参数为“pre_assigned_meeting_rooms”,希望用户在指定的多个选项中选出一个,后续问题配置为“有以下几个会议室供您选择:{{pre_assigned_meeting_rooms}},请选择您想预订的会议室”。
取值
支持“引用”和“输入”两种类型。
- 引用:支持用户选择工作流中已包含的前置组件输出变量值。
- 输入:支持用户自定义取值。
- 输出参数
在“提问器”组件中,输出参数为希望向用户收集的信息,可以被后续组件所引用。
“输出参数”与高级配置中的“问题额外配置”为一一对应关系,问题额外配置中的参数将随着“输出参数”的增减而自动跟随变化。其中,“输出参数”是必填项,“问题额外配置”是选填项。表6 输出参数 参数名称
说明
参数名称
输出参数名称。
参数的名称长度必须大于等于1个字符,并且字符只允许为下面三种类型:
- 字母(A-Z或a-z)
- 数字(0-9)
- 特殊字符:_
类型
输出参数的类型,当前可选类型只有String。
描述
对于该输出参数的描述。
- 输入参数
- (可选)配置“问题配置”中的相关信息。
参数“问题”将在对话框中原样呈现给用户。如未配置此处,将由LLM根据输出参数描述,自动生成包含所有问题关键词的一个问题。
- (可选)配置“高级配置”中的相关信息。
高级配置项供进阶开发者修改选择模型和提示词,如果不配置将会使用系统默认值。
模型的选择和提示词的撰写可能影响到提问器组件的准确性。
- 模型选择:选择要使用的LLM,不同模型的效果存在差异。
- Prompt提示词:用户对模型的指令,提示词可能影响模型效果。
- 问题额外配置:
- 参数名称:与输出参数的参数名称一一对应,用户不可修改,自动跟随输出参数的变化而改动。
- 问题关键词:问题关键词是对输出参数描述信息的提炼,帮助大模型更好地理解问题关键词。此处为选填,不填写可能影响模型提取效果。当“问题配置”的“问题”信息与“高级配置”中“问题额外配置”的“问题关键词”都填写时,提问器组件会校验问题中是否已经包含所有的问题关键词。
- 内容示例:内容示例可以举例说明所需信息的格式,帮助大模型更好地从用户的回答中提取所需信息。例如,参数名称“手机号码”,可以在内容示例中填写“12345678910”。
- 单击“确定”,完成参数配置。
- 连接提问器组件和其他组件。
配置插件组件
插件组件使开发者可以在工作流中实现与外部环境的交互,以拥有更强大的能力,完成更复杂的任务。开发者可以通过托拉拽方式将插件库中插件构建一个插件组件。
- 自定义插件:平台支持开发者创建自定义插件。支持开发者将工具、Function或者API通过配置方式快速创建为一个插件,并供Agent调用。
- 在左侧组件面板中拖拽出一个“插件”组件。
- 选择“个人插件”页签。
- 选择需要添加的插件,单击,即可完成添加插件。
- 单击画布中的已添加的“插件”组件,打开参数配置页面。
- 在“参数配置”中,配置输入参数和输出参数。
- 单击“确定”,完成参数配置。
- 连接插件组件和其他组件。
配置判断组件
判断组件是一个if-else节点,提供了多分支条件判断的能力,用于设计分支流程。
当向该节点输入参数时,节点会判断输入是否符合“参数配置”中预设的条件,符合则执行“IF”对应的工作流分支,否则执行“ELSE”对应的工作流分支。
每个分支条件支持添加多个判断条件(且/或),同时支持添加多个条件分支,可通过拖拽分支条件配置面板来设定分支条件的优先级。
- 在左侧组件面板中拖拽出一个“判断”组件,放置在工作流合适的位置。
- 单击画布中的“判断”组件,打开参数配置页面。
- 在“参数配置”中配置“IF”相关参数。
表8 IF分支参数 参数名称
说明
变量
条件表达式左边部分,需要选择来自前序组件的输出参数。
比较条件
条件表达式中间部分,当前支持的比较条件有:
- equal:等于
- not equal:不等于
- contain:包含
- not contain:不包含
比较对象
条件表达式右边部分,支持“引用”和“输入”两种类型。
- 引用:支持用户选择工作流中已包含的前置组件输出变量值。
- 输入:支持用户自定义取值。
IF分支其他操作如下:
- 单击“添加条件”,在当前分支添加多个条件表达式,多个条件表达式之间通过“and”或“or”来连接。
- 单击“and”或者“or”,可以切换该分支表达式的运算逻辑。
图8 IF 分支配置图
- “添加分支”可以添加新的分支ELSE IF,新分支的配置方式与IF分支相同。
图9 添加ELSE IF图
- 单击“确定”,完成参数配置。
- 连接判断组件和其他组件。
配置代码组件
代码组件支持编写Python代码来处理文本、复杂逻辑判断等。
代码组件可以增强开发人员的灵活性,使他们能够在工作流程中嵌入自定义Python脚的方式操作变量。通过配置选项,开发者可以指定所需的输入和输出变量,并编写相应的执行代码。
编写代码时不要更改第一行函数定义以及输入输出定义。
- 在左侧组件面板中拖拽出一个“代码”组件,放置在工作流合适的位置。
- 单击画布中的“代码”组件,打开参数配置页面。
图10 代码配置图
- 在“参数配置”中,配置输入和输出参数。
- 输入参数
- 输出参数
- 编写Python代码。
- 文本拼接示例代码。
def main(args: dict) -> dict: # 注意在输入参数中定义名为input1的变量 input1 = args.get('input1') # 注意在输入参数中定义名为input2的变量 input2 = args.get('input2') res = { # 注意在输出参数中定义名为res的变量 "res": input1 + input2, } return res
- 复杂逻辑判断示例代码。
def main(args: dict) -> dict: import re # 注意在输入参数中定义input1参数 input1 = args.get('input1') # 判断是否满足要求:非空、以字母开头、只包含数字字母下划线 if input1 and bool(re.match(r'^[A-Za-z][A-Za-z0-9_]*$', input1)): return { # 注意在输出参数中定义res 'res': "输入字符串满足要求" } else: return { # 注意在输出参数中定义res 'res': "输入字符串不满足要求" }
- 数学计算示例代码。
def main(args: dict) -> dict: # 注意在输入参数中定义名为input1的变量 input1 = args.get('input1') try: input1 = int(input1) return { # 注意输出参数中定义res变量 'res': input1 * input1 } except Exception as e: return { # 注意输出参数中定义res变量 'res': "输入类型错误或者数字大小超出限制" }
- 文本拼接示例代码。
- 单击“确定”,完成参数配置。
- 连接代码组件和其他组件。