NLP 智能对话

NLP(智能对话)能力对接说明 #

中控 WebSocket 全双工接口 NLP 调用方式的说明,链接方式为 WebSocket 协议,报文为使用 UTF-8 编码的文本。

调用流程 #

  1. 建立 WebSocket 连接(无需鉴权),如果在本地启动中控,地址通常为 ws://localhost:8070/v1
  2. 发送 Starter 包,内容为后续请求的通用配置信息,如果格式错误或超过10秒未发送会被断开 WebSocket 连接;
  3. 收到响应,表示鉴权成功或失败;
  4. 发送 Query 文本包,内容为单条对话内容;
  5. 收到对应的应答结果,格式为 JSON;
  6. 如果当前没有更多问答对话,可以直接断开(没有链接断开报文的设计);
sequenceDiagram
    participant Client
    participant CS as Control System
    Client-->>CS: 1. Establish Connection
    activate CS
    Client->>CS: 2. Request: Starter
    CS-->>Client: 3. Response: Authentication
    loop
        Note right of Client: 重复4、5步至全部请求发送完毕
        Client->>CS: 4. Request: Query
        loop
          Note right of Client: 返回一条或多条 Response,多条表示需要延时播报
          CS-->>Client: 5. Response
        end
    end
    Client-->>CS: 6. Close Connection
    deactivate CS

请求报文格式 #

Starter #

每次建立连接后发送的第一个包,表示此连接的目的和后续数据包的解析方式。格式为 JSON 文本,包含以下字段:

字段名称类型默认值说明
authAuthN Tokenstring空字符串设备鉴权 Token,如服务端开启鉴权则必填
typeWorkflow Typestring必填填写能力对应的服务引擎编号,例如:“NLP2”,完整列表参见快速参考服务引擎列表部分
deviceDevice IDstring空字符串设备 ID,建议填写,以便追溯和定位问题
sessionSession IDstring随机 UUIDv4建议调用者自行生成 Session ID 并填写,以便追溯和定位问题
nlpNLP Configobject必填NLP 专属配置,具体信息见下

NLP Config 配置见下:

字段名称类型默认值说明
locationUser Locationstring空字符串可选字段,用户所在地。用于为天气、本地服务等技能提供地理位置信息。格式为将省、市以空格分隔,例如:“江苏 无锡”
omit_metaOmit Meta Data in Responseboolfalse可选字段,是否删去语义附加信息,即默认会返回
omit_errorOmit Error Message in Responseboolfalse可选字段,是否删去报错信息,即默认会返回
modelModel IDstring空字符串可选字段,模型名称,仅部分语言大模型引擎支持
know_idsKnowledge IDsstring list空列表可选字段,知识库 ID 列表,仅部分语言大模型引擎支持
prompt_headerSystem Role of Promptstring空字符串可选字段,Prompt 的背景描述,为空时使用配置中的预设值,仅部分语言大模型引擎支持
no_prompt_headerDisable System Role of Promptboolfalse可选字段,删去 Prompt 的背景描述,仅部分语言大模型引擎支持
max_reply_tokenMax Toke in Replyint500可选字段,回复内容的最大 token 数,实际最大可用值和模型相关,仅部分语言大模型引擎支持

Query #

Starter 包发送并成功建立连接后,后续可发送多个 Query 文本包提交用户问题,格式为 JSON 文本,包含以下字段:

字段名称类型默认值说明
idTrace IDstring随机 UUIDv4可选字段,建议调用者自行生成并填写,用于区分并发请求时不同请求的返回
queryQuerystring必填用户问题的文本内容
locationUser Locationstring空字符串可选字段,用户所在地。用于为天气、本地服务等技能提供地理位置信息。如 Data 中填写此字段,会为当前请求替换 Starter 报文中的 location 信息。格式为将省、市以空格分隔,例如:“江苏 无锡”

返回报文格式 #

鉴权结果 #

发送 Starter 请求后会返回包含鉴权结果的报文。格式为 JSON 文本,包含以下字段:

字段名称类型是否必现说明
serviceService NamestringYes当前请求对应的服务模块,即auth
sessionSession IDstringYes当前连接的 Session ID
statusStatus NameenumYes当前会话的状态,正常为 ok,失败为 fail
errorError MessagestringNo如果失败,返回的错误信息

NLP 结果数据 #

针对每一条成功处理的 Query ,都会有一条报文返回,当 omit_errorfalse 时,出错报文亦会返回。返回报文的基本格式见下:

字段名称类型是否必现说明
serviceService NamestringYes当前请求对应的服务模块,即nlp
sessionSession IDstringYes当前连接的 Session ID
traceTrace IDstringYes当前句子对应的 Trace ID
statusStatus NameenumYes当前会话的状态,正常为 ok,失败为 fail
errorError MessagestringNo如果失败,返回的错误信息
nlpNLP ContentobjectNo如果成功,返回的答复结果,具体字段含义见下

具体识别结果位于 NLP Content 中:

字段名称类型是否必现说明
indexIndex No.intYes返回包序列号
queryQuerystringYes提交的问题文本
answerAnswerstringYes返回的播报文本,数字人前端调用 TTS 进行播报
textTextstringNo返回的展示文本,数字人前端上屏作为文本展示
imageImagestringNo答案配套的图片资源 URL
eventEventstringNo产生的相应事件的名称
metaMeta DataobjectNo额外的语义附加信息,key-value 内嵌结构,视具体场景内容有变
finish_reasonFinish ReasonstringNo结束原因,stop 表示接口返回了模型生成完整结果;length 表示模型生成结果超过配置的max_reply_token长度,内容被截断;
preempt_modePreempt Mode TypestringNo干预数字人前端的打断模式(详情见以下说明)
delay_msecDelay Interval (msec)intNo干预数字人前端的播放延时毫秒数(详情见以下说明)

播报干预的两个字段 preempt_modedelay_msec 的含义如下:

  • preempt_mode 表示打断模式,有三种可选(取值为字符串类型):

    • none:不打断,如果当前已经在播报,则忽略,否则进行播报;
    • force:强制打断,如果当前已经在播报,则打断并播报,否则进行播报;
    • wait: 等待,如果当前已经在播报,则等待播报完成后再播报,否则进行播报;
    • 取值为空或不指定,则按本地已有配置和实现来(通常为打断)。
  • delay_msec 表示播放延时,即具备播放条件(即当前没有在播放,或者正在播放的内容被打断,或者等待正在播放的内容完成后)后的延时时间,单位为毫秒,取值为整数:

    • 取值为 0 或不指定,则没有延时;
    • 取值为负数,则没有延时;
    • 取值为正数,则延时为指定的毫秒数。

实际流程样例解析 #

Case 1: 最小配置流程 #

Request: Starter

{
    "type": "NLP2",
    "device": "xiaoyi",
    "nlp": {}
}

Response: 1

{
    "service": "auth",
    "status": "ok",
    "session": "4a38583a-82de-4044-a67d-50b9ee6db1e5"
}

Request1: Query

{
    "query": "上海的天气"
}

Response: 2

{
    "service": "nlp",
    "status": "ok",
    "session": "4a38583a-82de-4044-a67d-50b9ee6db1e5",
    "trace": "461a79a3-9172-4c00-9df5-3739847f9a40",
    "nlp": {
        "index": 1,
        "query": "上海的天气",
        "answer": "上海今天的天气是晴转多云,温度范围是19到30摄氏度。",
        "text": "上海今天的天气是晴转多云,温度范围是19到30摄氏度。",
        "meta": {
            "audio_text": "上海今天的天气是晴转多云,温度范围是19到30摄氏度。",
            "confidence": 1,
            "device": "xiaoyi",
            "display_text": "上海今天的天气是晴转多云,温度范围是19到30摄氏度。",
            "intent": "weather",
            "skill": {
                "id": "__weather",
                "name": "__weather",
                "type": "system"
            },
            "vendor_name": "platform"
        }
    }
}

Request2: Query

{
    "query": "陈赫的老婆是谁"
}

Response: 3

{
    "service": "nlp",
    "status": "ok",
    "session": "4a38583a-82de-4044-a67d-50b9ee6db1e5",
    "trace": "e2f63ed4-2871-4eee-87b6-ca201809d55c",
    "nlp": {
        "index": 2,
        "query": "陈赫的老婆是谁",
        "answer": "陈赫老婆是张子萱",
        "text": "陈赫老婆是张子萱",
        "meta": {
            "audio_text": "陈赫老婆是张子萱",
            "confidence": 0.9847,
            "device": "xiaoyi",
            "display_text": "陈赫老婆是张子萱",
            "intent": "chitchat",
            "is_chitchat": true,
            "skill": {
                "id": "__chitchat",
                "name": "__chitchat",
                "type": "system"
            },
            "vendor_name": "platform"
        }
    }
}

Request3: Query

{
    "query": "聊会天"
}

Response: 4

{
    "service": "nlp",
    "status": "ok",
    "session": "4a38583a-82de-4044-a67d-50b9ee6db1e5",
    "trace": "3f2f84db-ea53-4a49-9114-7e3545080330",
    "nlp": {
        "index": 3,
        "query": "聊会天",
        "answer": "行呀,聊呗",
        "text": "行呀,聊呗",
        "meta": {
            "audio_text": "行呀,聊呗",
            "confidence": 0.9919,
            "device": "xiaoyi",
            "display_text": "行呀,聊呗",
            "intent": "chitchat",
            "is_chitchat": true,
            "skill": {
                "id": "__chitchat",
                "name": "__chitchat",
                "type": "system"
            },
            "vendor_name": "platform"
        }
    }
}

Case 2: 完整配置流程 #

Request: Starter

{
    "auth": "XSMLTGKQVVCPJCQHJZ4VEDMGIY",
    "type": "NLP2",
    "device": "xiaoyi",
    "session": "56c63016-c8c1-4486-9a6b-260826b6a6e4",
    "nlp": {
        "location": "江苏 无锡",
        "omit_meta": true,
        "omit_error": true
    }
}

Response: 1

{
    "service": "auth",
    "status": "ok",
    "session": "56c63016-c8c1-4486-9a6b-260826b6a6e4"
}

Request1: Query

{
    "id": "aaca9cdd-d9e3-493c-85cf-90e8535459b2",
    "query": "你会做些啥",
}

Response: 2

{
    "service": "nlp",
    "status": "ok",
    "session": "56c63016-c8c1-4486-9a6b-260826b6a6e4",
    "trace": "aaca9cdd-d9e3-493c-85cf-90e8535459b2",
    "nlp": {
        "index": 1,
        "query": "你会做些啥",
        "answer": "我是美貌和智慧并存的数字人, 我可是基于AI深度学习能力,通过对真人的大量会话表情和动作的学习,生成与人物惟妙惟肖的会话表情和动作。",
        "text": "我是美貌和智慧并存的数字人, 我可是基于AI深度学习能力,通过对真人的大量会话表情和动作的学习,生成与人物惟妙惟肖的会话表情和动作。"
    }
}