开发者学堂课程【智能语音对话机器人训练营课程:简单对话场景搭建和云小蜜接口集成】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/908/detail/14395
简单对话场景搭建和云小蜜接口集成
目录:
一、对话机器人的基本架
二、多构多轮对话的概念
三、云小蜜会话接口的使用讲解
四、用云小蜜来搭建一个对话场景
一、对话机器人的基本架
用户发起语音请求 ASR 系统,ASR 系统将语音转换为文本,将文本内容发送给 Chatbot,chatbot 对用户的语音进行理解,做一个答案的生成,再将生成回复的文本发送给 TTS 系统,TTS 在进行语音合成,再将合成的语音发送给用户。
Chatbot 有三个步骤 NLU (自然语言理解) DM (对话管理) NLG (自然语言生成),当用户的请求从语音转换为文本之后 Chatbot 对这句话理解是什么意思,做一个对话管理来决定下一步采取什么样的措施采取什么样的动作,第三步根据这个动作生成什么样的回复,将回复的文本给 TTS,再转换成语音交给用户。
所以开发者在开发一个类似于机器人小程序或者 HO 页面的时候,开发的页面在这个层次,用户语音的请求在 HO 页面输入一个请求语音的信号无论是短文件传给 ASR 转成文本,再将文本请求输入给 Chatbot 系统,系统接收到后在内部进行处理生成答案的文本,再用TTS系统生成语音发给用户,这就是整个机器人架构,云小蜜包含 Chatbot 其中的三个步骤 ,它的输入文本形式的用户请求,输出是文本形式的答案;云小蜜扮演的角色就是红框这些东西。
二、多构多轮对话的概念
首先黄色框是人说的话,白色的框是机器人的回复。用户说买火车票,机器人回复亲从哪儿出发呀?
用户回答北京,机器人继续回答哪天出发,用户说明天,机器人继续出 亲想坐火车从北京到哪里呀?
用户回答 杭州,机器人就找出明天从北京出发到杭州。这个其实就是一个典型的多轮对话
多轮对话的概念:
·对话上下文
·对话的历史
·当前对话的状态
·通过 Session 来维护对话上下文
· Sessionld 作为标识
Session 可以认为一通多轮对话的一个标识一个单位,用 Session 描述带上下文的一通对话。
每一个 Session 都赋予一个 Session ID,当 Session ID 保持不变的情况下,用户和机器人一直处于这个多轮对话当中,也就是机器人一直会记得用户。用户在这个多轮对话当中的 Session 的概念。
有了 Session ID 才能让机器人知道跟用户说话是处于哪个 Session 当中,用什么样的上下文理解用户这段话。
三、云小蜜会话接口的使用讲解
https://help.aliyun.com/document_detail/68183.html?spm=a2c4g.11186623.593.23177818TOhO3d
SDK 参考
智能对话机器人为开发者提供了 Java / TypeScript(NodeJs) / Go / PHP / Python / C# / C++ 七种编程语言的SDK。通过 SDK ,开发者可以免去手工计算API签名的步骤,快速地集成智能对话机器人的会话能力。
以下是智能对话机器人提供的 SDK 信息:
1.智能对话机器人 SDK 调用
参考 阿里云-SDK 平台 完成 SDK 集成
2.阿里云通用 SDK 调用
参考 阿里云 Java SDK 开发指南 > 快速开始,如果 Maven 没有从中央存储库下载 jar 包,则需要将此依赖项添加到 pom.xml 文件中,否则将报告 NoClassDefFoundError 异常。
调用示例:
public static void main(String[] args) throws Exception {
String accountAccessAK = "XXXXXXXXXXXXXXXXXX";
String accountAccessSK = "XXXXXXXXXXXXXXXXXX";
String popRegion = "cn-shanghai";
String popProduct = "Chatbot";
String popDomain = "chatbot.cn-shanghai.aliyuncs.com";
DefaultProfile.addEndpoint(popRegion, popProduct, popDomain);
IClientProfile profile = DefaultProfile.getProfile(popRegion, accountAccessAK, accountAccessSK);
DefaultAcsClient client = new DefaultAcsClient(profile);
//固定入参
CommonRequest commonRequest = new CommonRequest();
commonRequest.setSysProduct("Chatbot");
commonRequest.setSysMethod(MethodType.GET);
//根据API会有变化
commonRequest.setSysAction("Chat");
commonRequest.setSysVersion("2017-10-11");
commonRequest.putQueryParameter("Utterance", "hi");
//机器人 id
commonRequest.putQueryParameter("InstanceId", "chatbot-cn-xxxxxxxxxxxx");
CommonResponse commonResponse = client.getCommonResponse(commonRequest);
System.out.println(commonResponse.getData());
}
Chat 接口
描述
根据机器人实例ID与其进行会话。
请求参数
名称 |
类型 |
是否必填 |
描述 |
Action |
string |
是 |
系统规定参数,取值:Chat |
Instanceld |
string |
是 |
机器人实例ID。登录智能对话机器人控制台,左侧面板选择开发者->基本配置,查看机器人示例信息,可获得该实例ID |
Utterance |
string |
是 |
机器人访问者的输入 |
Sessionld |
string |
否 |
会话ID,用于标识一个访问者的会话和保持上下文信息。对于一个新的访问者,首次调用Chat接口时无需传递此字段,机器人会开启一个会话,并在Chat接口的响应中返回该会话的Sessionld。对于该访问者的后续轮次的会话,调用Chat接口时传递当前会话的 |
Knowledgeld |
string |
否 |
知识库词条的知识标题的ID.若指定此ID,那么机器人会直接返回指定的知识标题指定视角的答案 |
Senderld |
string |
否 |
访问者ID。用于识别当前会话中的用户 |
SenderNick |
string |
否 |
当前会话中访问的昵称 |
Tag |
string |
否 |
可以传递任何内容参数,该参数将会直接在返回结果中透传回来 |
Perspective.1 |
string |
否 |
视角编码,用于调用同一知识标题下不同视角的答案。在拼装请求参数时,需要以 |
Recommend |
Boolean |
否 |
默认true,会话API保持出推荐逻辑;如果recommend =false则不出推荐 |
RecommendNum |
Integer |
否 |
推荐问题数量,1-10,当出推荐的时候才生效,返回不大于RecommendNum的推荐问题数量 |
返回参数
名称 |
类型 |
描述 |
Messageld |
String |
本条会话应答消息的ID |
Sessionld |
string |
本次会话的ID |
Messages
|
Array of Message |
消息的列表 |
Associate |
Array of Associate |
推荐信息 |
四、用云小蜜来搭建一个对话场景
如图所示,用简单的线框图,来描绘一下多轮对话的样子,一个典型的多轮对话,多个对话轮次,一个轮次,都是由用户说一句,机器人回复一句,来组成的。所以在这里用一个简单的线框图,就可以描绘出一个多轮对话。
比如这里用户说我要查天气,机器人说 查哪里的天气,这就是一轮对话,然后接下来第二轮,用户说北京然后机器人说北京天气晴,这相当于多轮对话的第二轮对话。
在云小蜜的产品里也是基于这个模型来建模的。
首先在阿里云首页打开云小蜜,到达云小蜜的控制台首页。
创建一个机器人,就是一个说话的对象,所有的问题问这个机器人,会回答你所有的问题。赋予这个机器人所具有的技能,比如查天气,订火车票,操控智能家居。
创建一个机器人,并进行自己命名,选择机器人类型,机器人服务语言。在机器人管理当中找到对话流管理,配置机器人具有对话的能力
点击保存草稿并点击测试,把当前的对话流提交到测试环境,测试环境就相当于一个沙盒,这时候左边弹出一个调试窗
调试窗的目的就是模拟在线上的对话,然后可以在这里进行调试,当调试完成时就可以点击发布
机器人管理里的会话接口有 会话接口信息
用户说节点
节点名称:用户说查天气
意图名称:查天气意图
意图是用户查天气所会说的话术,机器人会根据这些话术理解用户的意图,
机器人回复天气状况
回复节点
名称:机器人回复天气状况
文本回复:北京天气晴
机器人想:
判断节点 服务调用 函数节点 赋值节点
对话基本元素
组装对话流的原理,就是人类和机器对话的本质,一问一答间,尽显大道至简之风。系统将三种对话现象高度抽象提炼,成为组成对话流的三个基本元素:触发节点、函数节点、回复节点。
新建一个 查火车票
用户输入节点:
节点名称:用户说查火车票
填槽节点:
名称:收集参数
函数节点:
名称:查询火车票信息
回复节点:
名称:机器人告知车票情况
意图名称:查火车票
用户话语:我要查火车票 帮我买一张火车票 我要查从明天京出发天津的火车票 语义槽推荐:系统-地级市 系统-日期
在收集参数里会发现三个要收集的的参数被列集在这里
通过反问配置收集缺失信息:
反问问题:你从哪里出发 你到哪里去 哪天出发
HTTP 接口
在阿里云市场>全部分类>API市场>交通地理
找对应的 API 接口,进行相应的设置。
可以在函数计算的控制台上创建服务,函数,可以写一般简单的函数,第三方接口的查询
函数计算控制台
服务\函数 通过新建服务跟函数
函数代码
http.get(httpRequest,(httpResp) => {
let data = ‘ ’;
httpResp.on( ‘data ‘, (chunk) => {
data += chunk;
});
httpResp.on ( ‘ end ' , ( ) => {
var resultData = JSON.parse(data) ;
var ticketList = resultData.result.list;
var responseString = ticketList.map(t => t.typename+'-'+t.trainnd).join( ‘, ' );
resp.send ( responseString);
});
})
收集参数
查火车票.出发地=北京
查火车票,出发地.origin =北京
查火车票.目的地=杭州
查火车票.目的地.origin =杭州
查火车票.出发日期=2020-08-12
查火车票.出发日期.origin =明天
查火车票.查询火车票信息
·协议
http
· url
https://1942022723137282.cnshanghai.fc.aliyuncs.com/20160815/proxy/news_headline_service/train_ticket_function/?date=2020-08-12&depart_city=%E5%8C%97%E4%BA%AC&arrival_city=%E6%9D%AD%E5%B7%9E
·请求类型
GET
·接口参数
Header
Accept: */*
Content-Type: */*
·接口返回
高铁-G57,高铁-G19,高铁-G55,高铁-G41,高铁-G33,高铁-G163,高铁-G31,高铁-G167,高铁-G419,高铁-G59,高铁-G43,高铁-G35,高铁-G45,高铁-G37,高铁-G273,高铁-G39,直达特快-Z281,动车-D717,快速-K101