阅读前,需要开发者对以下内容有初步的了解:
- 技能对话API:ai.baidu.com/docs#/UNIT-…
- 机器人对话API :ai.baidu.com/docs#/UNIT-…
参考unit:ai.baidu.com/forum/topic…
一、成功调用一次技能对话API
{
"version":"3.0",
"service_id":"S66193",
"session_id":"",
"log_id":"7758521",
"request":{
"terminal_id":"88888",
"query":"报考前有提前通知吗?"
}
}
原始的响应
{
"success": true,
"message": "对话成功",
"code": 200,
"result": {
"ref_id": "rvp82_20220325161948_6021497853",
"log_id": "7758521",
"service_id": "S66193",
"context": {
"SYS_PRESUMED_SKILLS": [
"1142512",
"1142511"
],
"SYS_VARS": {}
},
"session_id": "chat-session-id-1648196388275-0b7be50801eb4c11a0f21ff9c6a5455f",
"responses": [
{
"msg": "ok",
"schema": {
"intents": [
{
"intent_confidence": 99.99999237060548,
"slots": [
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 99.99999237060548,
"length": -1,
"original_word": "36677314",
"begin": -1,
"normalized_word": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。"
}
],
"slot_name": "qid"
},
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 100,
"length": -1,
"original_word": "报考前有提前通知吗?",
"sub_slots": [],
"begin": -1,
"normalized_word": "报考前有提前通知吗?"
}
],
"slot_name": "faq_question"
}
],
"slu_info": {
"match_info": {
"match_query": "报考前有提前通知吗?",
"from_who": "query"
},
"slu_intent": "FAQ_FOUND",
"slu_tags": []
},
"intent_name": "FAQ_FOUND"
}
]
},
"slot_history": [
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 99.99999237060548,
"length": -1,
"original_word": "36677314",
"sub_slots": [],
"session_offset": 0,
"begin": -1,
"normalized_word": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。",
"merge_method": "ADD"
}
],
"slot_name": "qid"
},
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 100,
"length": -1,
"original_word": "报考前有提前通知吗?",
"sub_slots": [],
"session_offset": 0,
"begin": -1,
"normalized_word": "报考前有提前通知吗?",
"merge_method": "ADD"
}
],
"slot_name": "faq_question"
}
],
"sentiment_analysis": {
"pval": 0.999870777130127,
"label": "neutral"
},
"qu_res": {
"qu_res_chosen": {
"intents": [
{
"match_info": {
"match_query": "报考前有提前通知吗?",
"from_who": "query"
},
"slots": [
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 99.99999237060549,
"length": 0,
"original_word": "36677314",
"normalized_word": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。",
"begin": 0
}
],
"slot_name": "qid"
}
],
"confidence": 99.99999237060549,
"intent_name": "FAQ_FOUND"
}
]
},
"qu_candidates": [
{
"intents": [
{
"match_info": {
"match_query": "报考前有提前通知吗?",
"from_who": "query"
},
"slots": [
{
"slot_values": [
{
"fuzzy_matches": [],
"confidence": 99.99999237060549,
"length": 0,
"original_word": "36677314",
"normalized_word": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。",
"begin": 0
}
],
"slot_name": "qid"
}
],
"confidence": 99.99999237060549,
"intent_name": "FAQ_FOUND"
}
]
}
]
},
"origin": "1142511",
"actions": [
{
"action_id": "faq_found_satisfy",
"confidence": 100,
"say": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。",
"type": "satisfy"
}
],
"raw_query": "报考前有提前通知吗?",
"lexical_analysis": [
{
"etypes": [],
"basic_word": [
"报考"
],
"weight": 0.2911885678768158,
"term": "报考",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"前"
],
"weight": 0.1071222797036171,
"term": "前",
"type": "13"
},
{
"etypes": [],
"basic_word": [
"有"
],
"weight": 0.039408084005117416,
"term": "有",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"提前"
],
"weight": 0.1922763139009476,
"term": "提前",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"通知"
],
"weight": 0.2911885678768158,
"term": "通知",
"type": "21"
},
{
"etypes": [],
"basic_word": [
"吗"
],
"weight": 0.039408084005117416,
"term": "吗",
"type": "38"
},
{
"etypes": [],
"basic_word": [
"?"
],
"weight": 0.039408084005117416,
"term": "?",
"type": "37"
}
],
"status": 0
},
{
"msg": "ok",
"schema": {
"intents": [
{
"intent_confidence": 0,
"slots": [],
"intent_name": ""
}
]
},
"slot_history": [],
"sentiment_analysis": {
"pval": 0.999870777130127,
"label": "neutral"
},
"qu_res": {
"qu_candidates": []
},
"origin": "1142512",
"actions": [
{
"action_id": "fail_action",
"confidence": 100,
"say": "我不知道应该怎么答复您。",
"type": "failure"
}
],
"raw_query": "报考前有提前通知吗?",
"lexical_analysis": [
{
"etypes": [],
"basic_word": [
"报考"
],
"weight": 0.2911885678768158,
"term": "报考",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"前"
],
"weight": 0.1071222797036171,
"term": "前",
"type": "13"
},
{
"etypes": [],
"basic_word": [
"有"
],
"weight": 0.039408084005117416,
"term": "有",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"提前"
],
"weight": 0.1922763139009476,
"term": "提前",
"type": "34"
},
{
"etypes": [],
"basic_word": [
"通知"
],
"weight": 0.2911885678768158,
"term": "通知",
"type": "21"
},
{
"etypes": [],
"basic_word": [
"吗"
],
"weight": 0.039408084005117416,
"term": "吗",
"type": "38"
},
{
"etypes": [],
"basic_word": [
"?"
],
"weight": 0.039408084005117416,
"term": "?",
"type": "37"
}
],
"status": 0
}
],
"version": "3.0",
"timestamp": "2022-03-25 16:19:48.434"
},
"timestamp": 1648196388724
}
封装后的响应:
{
"success": true,
"message": "对话成功",
"code": 200,
"result": {
"serviceId": "S66193",
"sessionId": "chat-session-id-1648195042464-33d2122a45394cdbb7d5d9da64384e5e",
"logId": "7758521",
"actions": [
{
"actionId": "faq_found_satisfy",
"confidence": 100,
"say": "无论是报考还是考试,还是打印准考证,我们这边都是会提前通知的。",
"type": "satisfy"
}
]
},
"timestamp": 1648195043105
}
响应中拿到session_id,比如:session_id": "chat-session-id-1647930695195-a3ccaae71e834f37bb862a5e0ad62a04
二、开发者可以选择一下两种方式与机器人对话API实现多轮对话
方式1:客户端在首轮会话时以session为key传入一个空串,UNIT会在应答中以session为key,返回原始的会话数据(一个json字符串)。如需进行多轮对话,客户端在后续对话中以session为key,继续传送前轮返回的会话数据。在这种方式下,开发者可以对会话数据做出自己想要的修改(只要符合UNIT的格式要求)。
方式2:客户端在首轮会话时以session_id为key传入一个空串,UNIT会把会话数据托管在云端,在应答中以session_id为key,返回一个用于指代云端的会话数据的ID号。如需进行多轮对话,客户端在后续对话中以session_id为key,继续传送前轮返回的ID号。在这种方式下,开发者没有办法修改会话数据。
简单来说:session保存了历史会话信息,UNIT支持基于session_id的会话托管:客户端在首轮对话时传入一个空的session_id字段,在应答阶段,UNIT会把会话信息托管在云端并且为其分配一个session_id。就可以基于历史会话信息与机器人进行多轮对话,而无需接触复杂的原始session。
下面举个例子:要实现一下的多轮对话场景,需要请求2和请求3中的session_id的值都来源于响应1。
问题1:老师我在哪里上课呀响应回答1:上课是在APP的班级里面上课的,如果不知道什么时候有课的话,可以查看你的课表哦。我们可以点击班级,再点击课程日历,上面有小红点的就是当天晚上有课哈问题2:上课之前会有人提醒吗响应回答2:上课的话APP会有一个推送通知的功能 你打开APP 点击【我的】-设置-上课推送 然后打开上课推送就可以接收到提醒通知哈问题3:正课上课多长时间响应回答3:正课上课时间是两个小时,从晚上7点半开始到9点半结束,课间一般会有10分钟左右的休息时间哈问题4:可以看回放吗响应回答4:可以的,错过直播课也是没有关系的,直播结束都是会生成录播回放的,所以咱们也可以在课后回看录播哈,录播也是正常算出勤率的哦
如果想实现以上的多轮对话的场景,我们可以使用以下方式传入session_id值:
可以在第一轮的响应中获取到session_id的值,session_id是已K-V的结构数据返回,我们可以拿到一轮的response,转JSONObject对象,通过JSON解析拿到对应的session_id。
总结起来,开发者可以使用以下方式与机器人对话API进行多轮对话:
- 客户端在首轮会话时以“session_id”为key传入一个空串,UNIT会把会话数据托管在云端,在应答中以“session_id”为key,返回一个用于指代云端的会话数据的ID号。如需进行多轮对话,客户端在后续对话中以“session_id”为key,继续传送前轮返回的ID号。在这种方式下,开发者没有办法修改会话数据。
注意:只要传入一个空的session_id,即代表不再继承历史会话信息,后续将开始新的对话。
首轮请求参数:
{
"version":"3.0",
"service_id":"S66193",
"session_id":"",
"log_id":"7758521",
"request":{
"terminal_id":"88888",
"query":"老师我在哪里上课呀"
},
"dialog_state":{
"contexts":{
"SYS_REMEMBERED_SKILLS":[
""
]
}
}
}