在真实的对话系统中,通常会要求同时支持多种对话技能,比如育儿对话机器人中要求同时支持音乐、故事、古诗、百科等技能。这涉及到多个技能的管理、召回、排序和选择等策略,在具体的实现中,通常由一个统一调度对话中控 US (Unified Scheduler) 来提供这些能力。
USKit 作为 UNIT 的开源对话中控模块,主要负责多个对话技能的接入、调度、排序、选择、回复生成以及多轮对话 session 的管理,无缝对接 UNIT 平台能力,可以方便开发者通过配置快速搭建和定制符合自己业务场景的对话中控,将多种技能整合为统一的对话机器人为用户提供服务。
在开始之前,我们先定义以下两个概念:
USKit 作为 UNIT 的开源中控模块,通过配置驱动和内置表达式运算支持,提供了以下能力:
HTTP
和 Redis
USKit 针对对话中控的能力做了抽象,抽取出不同对话场景中下中控的通用能力,避免不必要的重复开发。同时按照配置化驱动和高扩展性的思想进行整体架构的设计,方便开发者通过配置快速构建和定制适用于特定业务场景的对话中控。USKit的整体架构如下图:
系统主要由以下4个核心部分组成:
backend.conf
进行策略的配置rank.conf
进行策略的配置flow.conf
进行策略的配置开发者在使用 USKit 的时候,只需配置上述3个配置文件,即可完成对话中控的搭建,后续策略的变动和升级也通过修改配置文件即可完成,可以让开发者关注对话机器人中控本身的策略逻辑,不需要重复开发框架代码
3个配置文件的详细说明可以参考详细配置说明
从 GitHub 获取 USKit 的源代码:
git clone https://github.com/baidu/unit-uskit.git
cd unit-uskit
USKit 提供了两种安装方式:使用 Docker 构建镜像和手动安装。推荐使用 Docker 进行安装。
docker build -t unit-uskit .
我们也提供成功编译的 Docker 镜像,可使用如下命令拉取镜像:
docker pull docker.io/shanetian/unit-uskit:v3.0.0
USKit 基于以下工具包进行开发:
目前支持 Ubuntu,CentOS 等系统环境,Ubuntu 推荐使用 16.04 或以上版本,CentOS 推荐使用 7 以上版本,编译 USKit 前请确保对应版本的依赖已经正确安装:
sh deps.sh ubuntu
sh deps.sh centos
mkdir _build && cd _build && cmake .. && make
注:编译前请检查 gcc
版本,若版本较低不支持 C++14,则使用 source /opt/rh/devtoolset-7/enable
切换到新安装的 gcc 再编译即可。
如果希望打印更多 Debug 信息,可以在生成执行 cmake 时指定为 Debug,在运行 USKit 的过程中将会打出更详细的 log 信息,方便问题定位:
mkdir _build && cd _build && cmake -DCMAKE_BUILD_TYPE=Debug .. && make
注:打开该选项会影响性能,建议只在开发环境中使用。
.
├── CMakeLists.txt
├── README.md
├── _build # 编译产出,在该目录下修改配置文件以及运行 ./uskit 启动服务
│ ├── conf # 配置目录
│ │ ├── us # 对话机器人的配置,每个子目录对应一个具体业务场景下的对话机器人
│ │ │ └── demo # USKit 教程示例的配置及配置生成工具
│ │ │ ├── options.py # demo 场景里需要开发者自行配置的选项,如技能 ID,API Key 等
│ │ │ ├── conf_generator.py # 根据 options.py 里声明的配置,自动生成所需配置文件
│ │ │ └── conf_templates # 配置模板目录
│ │ ├── gflags.conf # USKit 启动参数默认参数配置
│ │ └── us.conf # USKit 本身相关的配置,用于指定加载的对话机器人
│ └── uskit # USKit 主程序
├── conf # 配置目录,编译成功后会被复制到 _build/conf
├── docs # 详细文档
├── proto # protobuf 文件
├── src # 源代码
└── third_party # 第三方依赖目录
USKit 主要通过配置来驱动中控的搭建和定制,使用方只需要配置对应目录下的 backend.conf
,rank.conf
以及 flow.conf
,然后重启服务即可生效。
在 USKit 中,新建一个对话场景下的机器人中控,只需在 _build/conf/us
目录下新增对应的目录,例如,新增一个对话机器人 demo_service
:
mkdir -p _build/conf/us/demo_service
在该目录下,编写对应的配置文件:
backend.conf
:指定需要接入的资源对应的请求构造和结果解析配置rank.conf
:召回结果的排序配置flow.conf
:中控整体对话流程的配置同时修改 us.conf
,注册需要加载的对话机器人,新添如下一行:
load : "demo_service"
进入 _build
目录运行 USKit:
./uskit
命令参数说明:
--port
:指定 USKit 服务的端口,默认为 8888
--idle_timeout_s
:指定 client 多少秒没有读/写操作即关闭链接,默认为 -1
,即不关闭--us_conf
:指定 us.conf
的路径,默认为 ./conf/us.conf
--url_path
:指定 USKit 服务的 url 路径,默认为 /us
--http_verbose
: 在 stderr 输出 http 网络请求和返回的数据--http_verbose_max_body_length
: 指定 http_verbose 输出数据的最大长度--redis_verbose
:在 stderr 输出 redis 请求和返回的数据成功启动 USKit 服务后,可以通过 <HOST>:8888/us
发起 HTTP POST 请求,请求体使用 json 格式,请求参数如下:
usid
:指定需要请求的对话机器人中控 id,比如上文中创建的 demo_service
logid
:每个请求对应 id,用于将上下游串起来的唯一 id,方便问题追踪定位query
:用户请求的 queryuuid
:用户对应的 id,用于唯一区分一个用户样例:
{"usid": "demo_service", "logid": "123456", "query": "北京今天天气怎么样", "uuid": "123"}
返回结果同样采用 json 格式,包含以下三个字段:
error_code
:错误码error_msg
:具体错误信息result
:通过对话中控策略执行得到的请求响应样例:
{"error_code": 0, "error_msg": "OK", "result": "好的"}
执行 deps.sh
的过程中 clone boost 失败导致后续依赖安装失败
由于 boost 库较大,GitHub 访问较慢导致下载失败。可以在 boost 官网手动下载包至 third_party/
并编译:
tar -zxf boost_1_76_0.tar.gz && mv boost_1_76_0 boost
cd boost
mkdir -p _build/output
./bootstrap.sh --prefix=./_build/output
./b2 install
USKit is licensed under the Apache License, Version 2.0