开发者学堂课程【3节课带你走进云小蜜产品 :简单对话场景搭建与云小蜜接口集成(三)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/739/detail/13115
简单对话场景搭建与云小蜜接口集成(三)
五.用函数能力来扩展机器人对话能力
接下来简单介绍一下机器人想节点,我们还是回到这个这个流程里边,比如说这里用户说完了要查北京的天气,机器人这时不能随便瞎说一个北京天气,他需要查一个天气接口或者通过一些计算才能把当前的结果给你。这个时候,就可以把这个过程想象为机器人在思考这个过程,机器人的思考过程可能是调用一个接口,可能是做一个加减乘除运算或者做一个分支判断等,所以我们在这里提供了一个机器人想节点。
这里其实更多的就是通过函数的能力,赋予机器人更丰富的能力。
在这里我们可以看到机器人想节点,相当于是调用了一个 HTTP 接口,这个 HTTP 接口是自己开发的一个查天气接口,他需要接收一个参数,接收你要查询查询天地的城市的名称。这个时候,他的参这个参数的名称 HTTP 接口的参数名称 city,然后我会把这里会进行一个变量,用的就是查天气意图的 city 槽位,然后负值给这个 city,然后相当于是机器人再去调这个接口的时候,就会把刚才收集到的 city 槽位,无论是北京还是天津作为这个参数传给这个函数 HTTP 接口。这时机器人就会去请求这个 HHTP 接口,并且获取到当前这个接口返回的城市的天气状况。因为这个接口是动态的,所以我们要机器人回复的时候,希望是回复一个动态的结果,也就是无论函数返回什么,我们希望这个答案作为机器人的动态输出。在机器人回复之间,我们希望能够动态引用这个函数调用的结果来作为机器人的回复,所以这时可以做一个变量的引用,我重新打一个 S(functianOutpul)
它代表含义是什么,就是函数的上一个函数节点的输出作为机器人回复。也就是说,当假设这个函数返回的答案是北京天气温度多少度,那么这里就回复北京天气,当我返回是天津天气怎么样,那么这里反馈的就是天津天气怎么样,这是一个动态结果,而不是一个固定的答案。
所以,我就会把四种节点的用法,它的建模的概念介绍给大家。接下来,我会带着大家一起开发一个新的场景,然后从头到尾的再把这个概念过一遍,然后这样帮助大家能够更好的理解我们的这个建模。
接下来带大家一起搞一个刚才说的买火车票的场景,然后带大家从头到尾的把这个流程配一下。
首先,我在这里点击新建对话流单元。
这时,我们可以利用系统内置的一些模板来进行快速的配置,不用一点点弄。这个时候,我选择这个无分支空白的模板。然后我选择查火车票,那么这个流程创建好了。然后点进画布,因为我们使用的是线性模板,所以会发现它已经自动的创建出来了一个用户说节点,以及一个参数收集地点,也就是填槽节点,一个函数节点、一个回复节点。
首先,我们先设想一下查火车票这个场景、我们需要的这个多轮对话是什么样的。首先,用户表示要查火车票这个意图,然后机器人会反问用户来收集参数,“你的出发地是哪里”,“目的地是哪里”,“出发日期是哪里”,“出发日期是哪天”,然后收集到这三个之后,机器人调用一个接口或者其他接口去获取需要的火车票都有哪些,然后把这个答案告诉用户。这就是一个简单流程。
我们可以看到这个流程,如果我们想搞得简单直接一点,就可以这样:
首先,在用户说节点,我们可以配置说查火车票,然后在这个节点就可以继续收集参数,这时可以是机器人来查询火车票信息,最后这个机器人告知车票情况。所以我们可以看到
在这个流程里,首先用户说要查火车票,然后机器人进行多轮的交互来收集到所有的参数,收集到所有参数之后,机器人就会去查询这个当前给定条件下火车票的信息,然后最后查询到之后,告诉用户已经查到的火车票有哪些。
这个就是我们假设中的查火车票的一个流程,然后我现在已经把这个节点的框架配置好了,接下来,我们就需要把每一个基点的具体配置内容完善。
首先,这个用户说节点,我们需要配置用户说什么样的话术能够表达这个意图。然后同时我们要配置一下这个意图里需要涉及到哪些参数,比如这三个,出发地,目的地和出发时间。这时,我在这里选择新建一个意图,这个意图我就选择查火车票。
然后新增一个用户的表述,就是用户说什么样的话会触发这一组。比如说用户要查火车票,这时我就相当于写好了一个范例,当然我可以写更多的话术。比如说“帮我买一张火车票”,用户说这句话也可以表示这个意图,接下来我们就把话术配置好了。
假设这里我点一个确定,然后我们就可以看看到这个用户说节点已经跟这一个意图产生关联。就是当用户说的话满足了查火车票这个意图的时候,流程就会走到这个用户说节点,然后继续往下走。
接下来,我们会走到这个收集参数节点,我们会需要收集一些参数,这个参数在意图里面定义,我们可以点击意图的设置。
然后,为了达成这个意图,我们需要机器人向用户收集的所有信息,比如说我们这个场景,需要收集出发地、目的地和和出发日期。那么其实就是两个地址类型的参数,还有一个日期类型的参数,这时我们可以快速的搞一个,就比如说用户可能说一句完整的话,我要查从北京出发到天津的的火车票,这句话包含了所有的三个参数的信息。这个时候我们可以让系统做一个自定义推荐,系统会发现这句话里需要收集的参数都有哪些,他会帮你提示出来。
比如说,我要收集一个地级市作为出发地,一个地级市作为目的地,然后再收集一个日期作为出发日期。这个时候,我们可以给这个参数换一个名字,比如说,第一个参数叫出发地,第二个参数叫目的地,第三个参数叫出发日期。
然后他们分别定义的其实识别能力,因为系统它会自带一些识别的能力,比如它会识别出来这句话里北京是一个地级市的城市,然后天津也是一个城市,然后明天是一个时间。所以他会用这些能力来识别。比如说日期,只要选择日期,无论你说明天还是说下周二还是一个确切的年月多少号,机器人都能够识别出来。所以这里就相当是为这个意图定义了三个参数,然后我点击确定。
接下来,在这个收集参数里,我可以选择关联查火车票意图,这个时候我就会发现三个参数。三个要收集的参数就被列在这里了。
接下来我要配置怎样让机器人反问这三个参数。
比如说首先要问的是出发地,就输入:您从哪里出发确定你到,确定,然后问:你到哪里,第三个问题:哪天出发。这
相当于针对每一个参数,都给机器人设置了一个反问话术,机器人会根据这个反问话术来询问用户这三个参数。
接下来就是一个 HTTP 接口,HTTP 接口就是我收集完三个参数之后,要通过第三个参数去查一个接口,查到满足出发地是北京,目的地是天津,明天这三条的火车票都哪些。
比如说这个搜索到的一个火车查询的这个API,大家可以到阿里云市场的全部分类下面的 API 市场的交通地理,这下面会有一个火车票查询,这里还有免费的0元100次的这种限额。
然后底下会有调用的说明,比如说这个接口一些参数,然后出发,到达和时间这三个参数是必选的,甚至是需要填的。
这时我就只要把参数传给他的返回列表,就导出这个所有的火车班次的一个列表。然后让机器人把这个结果返回给用户就可以了。虽然这个 API 是非常好用的,但是我们可以发现有一个问题性。
就是比如说这个,不可能把这一个直接给中端用户了,这样的体验不是很友好,我可能需要让机器人把话组织一下。比如说组织成:从北京到天津明天的航班,明天的火车班次有 g34,然后和 g32,大概是这样的。所以我需要对这个函数做一个处理。
这个时候,再给大家安利一个好东西,就是阿里云函数计算能力。在这里我们可以用一种无服务的概念,然后很快速的开发一个函数 HTTP 接口,然后在这个接口里,我们可以做任意的事情。
举个例子,比如说在阿里云函数计算这里,你可以通过新建一个服务,再新建一个函数,作为一个简单的代码编写,快速的实现一个 HTTP 接口。
比如这里有一个接口,是提前写好的。
然后这个接口其实看到就是调用的这个火车票查询的这个接口,得到结果之后并对这个结果做了一个更友好的改写,把这个返回来的时间和火车的班次做了一个拼接,然后给用户一个更友好的答案。因为我希望呈现的答案就是,比如说北京到天津明天的班次有高铁 g34高铁 g32这样的。
然后这个函数写好之后,就可以很快的调试。
比如说这个就是你的函数链接,你可以点击复制到其他地方。然后这里定义的三个参数分别是 depart_city、arrival_city、date,
输入北京、杭州、时间,然后点击执行。就可以看到函数的返回,就是按照我想的那种把高铁所有的班次列在这里,然后这个就是我这个 HTTP 的一个返回。
然后在其实在这个内部,可以再写一些代码,比如说要用其他的 http,或者做一些更丰富的事情。比如说访问一个阿里云数据库 DB 或者去发条消息,发个短信什么的,都可以完全在这个函数计算代码中完成。相当于这个函数计算为机器人开通了另一片天地,他可以做任何你想做的事情,只要你别超时就行。
所以在这个节点里,单点调试完我的所有的 API 接口之后,可以把这个链接复制一下,然后在我的流程里继续调用刚刚通过的计算开发的这么一个服务,并且把参数传给他。然后因为我需要把刚才意图里收集上来那些参数作为HTTP节口的参数传给这个节口,所以这里需要引用一下所有的意图的名字,然后这里先稍微保存一下,刷新一下页面。
这里我引用到刚才意图的那个参数,比如查火车票,出发地,还有查火车票的出发日期。这个时候,我就会把刚才收集到了三个参数作为 HTTP 结构请求,发给 HTTP 接口。
接下来,做一个回复的定义,比如说,符合条件的火车票有:S(tunctionOutput),这样拼接成一个答案完整的答案,然后机器人访问用户。
现在我们来看一看效果保存测试,比如说,用户说“查火车票”,机器人会问“您从哪里出发”,我说“北京”,然后他问你“去哪里”,我说“杭州”, “你会哪天出发”,我说“明天”,这个时候我们会发现机器人把所有符合条件的明天的高铁班次都列出来了,然后我们可以在这里点击查看详情,来去看每一个的情况。
比如说这个情况下最后一轮已经收集到的出发地是北京,目的地是杭州,出发日期是明天,明天被解析成年月日。
然后我们可以看到,这个是函数函数调用的情况,我们调用了这个 HTTP 接口,请求参数 GET,函数的反回值。这样有一个更详细的信息来帮助我们去调试。所以到到此为止,这个流程简单流程就开发完了。可以发现,这是一个简单的多轮对话,能够让机器人帮助用户通过收集用户的参数、出发地、目的地和时间,然后帮助用户查询到这个这个高铁的情况。
六.总结
首先,我们要定义整个对话的一个框架。就是用户表述,然后机器人收集参数,以及机器人是否要采取一些动作查接口做运算之类的,以及该怎么回复。这就是一个简单的线性的流程。
然后可以丰富大家场景的两个很实用的工具。一个是在阿里云云市场,可以搜索到很多的 app,有些是免费,有些是收费的,可以根据自己需要使用。
第二个就是函数计算,可以在函数计算的控制台上创建服务函数,在这里可以写一些简单的脚本函数,做任何你想做的事情,完成所需要的数据格式处理,以及第三方接口查询数据的存储。定义的想象空间,可以在函数计算里做扩展,相当于函数计算这个函数能力赋予机器人无穷无尽的想象力。基本上可以完成任何事情,比如调用一个接口能够控制电视机空调的开关,或者说调用一个接口查询一些信息,比如查询用户的账户余额还是其他信息都可以。
甚至你可以做一些数据的读写,把一些数据放到阿里云的数据库上都可以。所以这个函数计算的相当于是赋予机器人很强的能力,这个也可以靠开发者我们自己的想象力和开发能力去扩展。
最后就是我们可以定义机器人的回复,这样就构建好了一个简单的多轮对话场景。