百度智能对话UNIT-调用对话API实现多轮对话

583 阅读6分钟

阅读前,需要开发者对以下内容有初步的了解:

参考unit:ai.baidu.com/forum/topic…

一、成功调用一次技能对话API

{
    "version":"3.0",
    "service_id":"S66193",
    "session_id":"",
    "log_id":"7758521",
    "request":{
        "terminal_id":"88888",
        "query":"报考前有提前通知吗?"
    }
}

image.png

原始的响应

{
    "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":[
                ""
            ]
        }
    }
}

image.png

效果演示:

SDGIF_Rusult_1.gif