本文档将给出一个复杂的在线编排实例,其中主要使用了在线编排通用节点和Function
节点。
该实例的需求是实现一个对话应用,当检测到用户输入的内容意图为查询天气时,启用AIUI辅助查询天气并返回结果给用户,若用户意图为其他内容时,则直接调用通用模型进行回复。
明确需求后,我们可以先进行粗略的功能节点编排。例如在本例中,我们可以得出如下的功能节点编排:
上图中实现的功能为对话入口
接收输入后,通过意图落域
判断用户的意图是否与天气有关,然后通过switch
节点将与天气相关和不相关的信息分别传送到AIUI调用
和星火大模型
节点,最后进入流程结束
节点。
为一个新的流程配置开始节点和结束节点
对话入口
是对话应用的交互入口,即对话应用的开始节点。流程结束
是对话应用的交互出口,即对话应用的结束节点。如下图所示:
通过意图落域
节点判断用户的意图,目前支持的意图包括应用、计算、车控、命令控制、星座、菜谱、时间查询、节假日、有声节目、笑话、彩票、导航、音乐、新闻、订票、诗词、电台、日程、股票、故事、电话、翻译、电视频道、视频、天气、词语、人设查询、闲聊、场景立方、烟草营销等等。
详细的返回结构体可以查看节点帮助文档,如下图所示:
添加switch
节点并连线,如下图所示:
双击switch
节点进行节点配置,对上一个(意图落域
)节点输出结果进行判断
。这里对msg.payload.choices[0].skill
进行判断,若包含天气
则走出口1,其他则走出口2,如下图所示:
添加AIUI调用
节点并连线,命中的技能走出口1,否则走出口2,如下图所示:
双击AIUI调用
节点进行节点配置,其中API_KEY
必选,如下图所示:
*API_KEY配置
:关于AIUI的ID和KEY请见AIUI使用指南
场景配置
:与AIUI中的场景同一概念,默认是main,若场景未发布,则需要配置为main_box
支持技能
:若某个场景配置多种技能,但又不想被命中,则在这里可以进一步进行过滤,将需要命中的技能的service填写,多个service用英文逗号进行分割。关于service参见技能列表
添加星火大模型
节点并连线,如下图所示:
双击星火大模型
节点进行节点配置,如下图所示:
模型
:选择所需的模型服务
流式返回
:建议勾选,减少模型返回结果的时间。
在1.4
章节中,当AIUI未命中技能,若没有做任何处理,则没有回复。页面可能会提示超时等报错信息。这里可以简单用大模型兜底回复,也可以自定义固定回复语。
大模型兜底回复,则可以进行简单连线。如下图所示:
语义改写可以帮我们改写用户的问题,当有多轮提问的时候,使用语义改写可以将用户的多个问题改写成一个完整的问题,提高流程的处理效果。
在对话入口
和意图落域
之间添加语义改写
,如下图所示:
至此,我们成功完成了对话应用的编排!接下来,可以参考《AIFlow调试技巧》对编排应用进行调试。
创建一个新的类型为在线编排
应用,导入工程示例,体验大模型节点使用。
点击红色圆圈处触发aiui节点调用,可以看到节点提示出错,表示需要双击aiui调用
节点新增apikey配置
配置正确点击红色圆圈处触发aiui节点调用,可以看到右边调试窗口看到命中技能
、tts-resp
调试输出
命中技能
输出:表示AIUI节点命中技能后的结果返回tts-resp
输出:表示对aiui调用
节点返回的结果文本进行TTS合成后的结果返回,可以看到有播放地址,粘贴到VLC播放器中即可播放合成内容。未命中技能
调试输出
未命中技能
的调试输出aiui调用
中配置的技能则看到未命中技能
的调试输出调用出错了
的调试输出
点击红色圈触发星火大模型节点调用,同时进行流式tts合成
以及流式文本推送
,从右边调试窗口可以看到对应的调试输出
req1
节点是请求内容,同时提供了req2、req3等其他请求示例,具体可以双击该节点查看。
// 单轮
msg.payload = {
"messages": [{
"role": "user",
"content": "你是谁"
}]
}
return msg;
tts init
收到req1请求后会先调用tts合成
节点进行初始化等待大模型节点输出文本进行合成。
tts init
节点支持修改发音人、音高、音量、语速、垫音(限制6个中文字符)等参数msg._input = {}
msg.payload = {
"stream": true, //是否流式,在这里是固定为true
"ttsProperty": {
"vcn": "x4_yezi", //发音人
"pitch": 50, //音高,范围1-100,默认50
"speed": 60, //语速,范围1-100,默认50
"volume": 60, //音量,范围1-100,默认50
"lead_text": "稍等一下" //垫音,限制6个中文字符
}
}
return msg;
text init
收到req1请求后会先调用流式文本推送
节点初始化等待大模型节点输出文本进行合成。
msg._input = {}
msg.payload = {
"text": "", // 文本推送内容,首帧文本可以为空,
"is_last": false //是否最后一帧文本
}
return msg;
大模型节点
收到req1请求后会流式输出结果,同时给到tts合成
节点、流式文本推送
节点、spark-resp
调试节点,在右侧调试窗口可以看到对应的输出
分别点击红色圈可以看到语义改写、意图拆解、语义规整的对应结果输出
join节点用于将多个消息合并成一个单一的消息对象,可以基于特定的条件,例如在接收到一定数量的消息、具有相同的 msg.topic、或在特定时间窗口内收集消息。
当你有两个耗时不确定的几点,后续流程需要等待这两个节点的结果,才能做处理,join节点就非常合适。
1、part1
msg.parts = {
id: 'part',
index: 0,
count: 2
};
return msg;
2、part2
msg.parts = {
id: 'part',
index: 1,
count: 2
};
return msg;
解释:
1、打开function节点的设置。
2、点击添加,并把要引入的模块填在“模块名称”,导入变量名,填在“导入为”。
如图片例子,相当于:
var Axios = require('axios');
3、填写完毕后,对编排测试环境进行重启。
4、等待重启完毕后,该function节点可直接使用引入的模块。