平台代码编辑
更新时间:2020-06-10
ABC Robot平台提供代码编辑模块,开发者直接在平台上编辑代码,即可处理技能回复逻辑。本质是提供一个FaaS服务(Function as a Service),让开发者专注于技能业务代码的开发,无需关注服务器资源(Serverless),来减少自定义技能的开发成本。本文主要介绍自定义技能代码编辑如何使用,帮助开发者完成技能服务的开发,实现多轮对话能力。
在填槽完毕后,您在平台上编辑的代码会收到机器人平台的请求,请求中带有语义理解后的意图和槽位信息,您可以根据这些信息进行具体的业务处理,随后返回符合机器人平台格式要求的响应。
配置代码编辑
- 登录ABC Robot平台管理控制台,选择一个项目,左侧导航栏点击“技能管理>自定义技能”,进入“自定义技能”页面。
- 点击“新建技能“按钮,按照提示创建一个技能。
- 新建技能后,进入自定义技能设置页。默认会选择当前已经设置的回复类型,如果之前技能还没有设置回复类型,那么默认选中“代码编辑”,并在代码编辑框中展示系统配置的示例代码。
-
回复方式选择“代码编辑”,修改代码,并保存,即可生效
注:代码编辑当前仅支持Node.js 12
代码编辑开发
页面上配置的代码会收到机器人平台的请求,请求中带有NLU(自然语言理解)后的意图和词槽信息。在代码中解析意图和词槽内容,根据自身的业务逻辑来生成技能的回复结果,并按照ABC Robot平台要求的格式返回结果。请求和响应参数请参考:自定义技能协议。代码示例如下:
本示例将请求中意图和槽位拼接为字符串,并将该字符串设置为返回结果中指令的内容,并返回结果给调用方。
exports.handle = (event, context, callback) => {
try {
var response = getResponse(event);
// 返回正常结果
callback(null, response);
} catch(e) {
// 将异常错误信息返回
callback(e, null);
}
};
// 从请求参数中获取意图和词槽,此处将意图和词槽转换为String
function writeIntentAndSlotsAsString(event) {
var intentAndSlotsInfo = JSON.parse(event.Payload.intentAndSlotsInfo);
var slotArr = intentAndSlotsInfo.slots;
var body = "";
body = body + "intent:" + intentAndSlotsInfo.intentName;
slotArr.forEach(function(slot) {
body = body + "name: " + slot.slotName + ",value: " + slot.slotValue + ";";
});
return body;
}
function getResponse(event) {
var intentAndSlotsString = writeIntentAndSlotsAsString(event);
// 生成要返回的指令
var directives = new Array();
directives.push(generateSpeakDirective(intentAndSlotsString));
directives.push(generateTextDirective(intentAndSlotsString));
var response = {
"logId":event.Payload.logId, // 将传入的logId原样返回,以方便定位问题
"directives":directives
};
return response;
}
function generateSpeakDirective(text) {
var directive = {
"header":{
"namespace":"baidu.abcrobot.directive.voice_output",
"name":"Speak",
},
"payload":{
"content":text
}
}
return directive;
}
function generateTextDirective(text) {
var directive = {
"header":{
"namespace":"baidu.abcrobot.directive.text_output",
"name":"Text",
},
"payload":{
"content":text
}
}
return directive;
}
说明
- 代码编辑的处理入口是exports.handle = (event, context, callback)为固定写法,其中,意图和槽位的内容可以在event中获取。callback中的第一个参数为异常信息,可将第一个参数设置为异常信息,如果没有异常设置null;第二个参数为正常的结果,可将第二个参数设置为正常结果,如果有异常时,将第二个参数设置为null;如果两个参数都设置优先选择第二个参数的值。
- 请求参数可以通过event.Payload.intentAndSlotsInfo获取,需要先将参数JSON格式化。intentAndSlotsInfo的内容参考自定义技能协议。
- 响应结果为指令数组,指令的具体内容参考自定义技能协议。
代码编辑调试
代码编辑完成,点击保存后,可在测试窗口中进行技能测试,并查看运行结果和日志。
- 点击“测试(沙盒)”按钮,进入测试窗口,进行问答测试。
- 当填槽完毕后,点击测试框中的“查看data”链接,在右侧的“响应”tab中,可以看到返回的指令信息。其中Content-Disposition: form-data; name="debug"后面的内容是调用配置代码时产生的调试日志。调试日志中各个字段含义如下:
字段名称 | 含义 |
---|---|
debug.skill.id | 技能ID |
debug.skill.name | 技能名称 |
debug.skill.nlu | 命中的意图和填充的词槽值 |
debug.skill.cfc.response | 正常情况下该字段的内容是配置代码的响应结果。如果代码运行报错,该字段为错误提示信息 |
debug.skill.cfc.logResult | 代码执行时的环境信息,代码中console.log打印的日志,以及解析结果异常信息 |