智能問(wèn)答引擎
智能問(wèn)答引擎是問(wèn)答服務(wù)的運行環(huán)境,包括可執行從多輪對話(huà)設計器導出的對話(huà)應用、基于常見(jiàn)問(wèn)題集的知識庫、意圖識別和服務(wù)統計監控等模塊。架構圖
從部署拓撲結構上看,智能問(wèn)答引擎的架構如下圖所示:智能問(wèn)答引擎架構

- superbrain:智能問(wèn)答引擎核心服務(wù)節點(diǎn),提供對外操作的Rest APIs,比如知識庫管理、多輪對話(huà)管理和監控統計等。
- superbrain admin:智能問(wèn)答引擎管理控制臺,提供Web管理頁(yè)面,方便企業(yè)IT人員或業(yè)務(wù)人員管理智能問(wèn)答引擎。
- siamese:底層服務(wù),知識庫搜索時(shí),文檔和查詢(xún)條件之間的相關(guān)度計算模塊。
- Elasticsearch:底層服務(wù),存儲知識庫數據的服務(wù),在檢索時(shí),召回數據。
- intent:底層服務(wù),提供意圖識別能力。
- redis:底層服務(wù),緩存數據和做定時(shí)任務(wù)。
- MongoDB:底層服務(wù),superbrain數據的持久化數據庫。
安裝
獲取服務(wù)鏡像
當前,Chatopera智能問(wèn)答引擎只面向企業(yè)做私有部署,有合作意向的企業(yè)聯(lián)系下面郵箱,進(jìn)行洽談:聯(lián)系方式:info@chatopera.com
洽談內容包括:
- 概念驗證
- 試用申請
- 其他商業(yè)合作
chatopera.superadmin.docker.v1.tgz
chatopera.superbrain.docker.v1.tgz
chatopera.siamese.docker.v1.tgz
chatopera.mongodb.docker.v1.tgz
chatopera.redis.docker.v1.tgz
chatopera.elasticsearch.docker.v1.tgz
依賴(lài)環(huán)境
智能問(wèn)答引擎是使用docker鏡像進(jìn)行分發(fā)的,所以,只要是docker v12+ 版本支持的操作系統都可以運行智能問(wèn)答引擎服務(wù),對于更詳細的操作系統的兼容列表,請參考Docker Community Edition (CE)。硬件方面,Chatopera推薦使用4Core CPU(Intel E5 or better), 16GB Memory,128GB Disk運行服務(wù)。
智能問(wèn)答引擎的docker鏡像可以安裝在docker服務(wù)中,或docker registry中。然后通過(guò)容器管理框架,比如kubernetes、Apache Mesos或docker compose。
在本文檔中,介紹使用docker compose的方式部署和管理服務(wù),docker compose是輕量級的docker服務(wù)編排方案。
- docker 版本
安裝文檔,注意:docker為開(kāi)源碼程序,本文檔使用社區版本(Docker CE)。
- docker-compose
安裝文檔。
安裝鏡像
假設docker已經(jīng)被安裝好,并且其進(jìn)程已經(jīng)啟動(dòng),在命令行終端,執行下面命令:docker load < chatopera.superadmin.docker.v1.tgz
docker load < chatopera.superbrain.docker.v1.tgz
docker load < chatopera.siamese.docker.v1.tgz
docker load < chatopera.mongodb.docker.v1.tgz
docker load < chatopera.redis.docker.v1.tgz
docker load < chatopera.elasticsearch.docker.v1.tgz
上述命令執行后,查看各個(gè)鏡像已經(jīng)安裝成功,使用命令:
docker images
描述服務(wù)
在命令行終端,進(jìn)入一個(gè)文件路徑,智能問(wèn)答引擎的服務(wù)的數據文件將保存在這個(gè)路徑下,假設該路徑為 /app/chatbot。- 創(chuàng )建服務(wù)描述文件 docker-compose.yml
version: '2'
services:
superadmin:
image: "registry.chatopera.com/ada/superadmin:develop"
restart: always
environment:
- SUPERBRAIN_API_URL=http://superbrain:8003/api/v1
superbrain:
image: "registry.chatopera.com/pintuan/superbrain:release"
restart: always
environment:
- PORT_NUMBER=8003
- SECRET_HASH=demo
- MONGO_DB_URI=mongodb://mongodb/superbrain-dev
- REDIS_HOST=redis
- REDIS_PORT=6379
- ELASTICSEARCH_HOST=http://elasticsearch:9200
# - ELASTICSEARCH_AUTH=
- ELASTICSEARCH_API_VERSION=5.2
ports:
- "8003:8003"
volumes:
- $PWD/superbrain/logs:/app/logs
command: "node app.js"
depends_on:
- redis
- mongodb
- elasticsearch
- siamese
siamese:
image: "registry.chatopera.com/pintuan/siamese:release"
restart: always
ports:
- "8012:8012"
volumes:
- $PWD/siamese/logs:/logs
environment:
- TXT_LOG_LVL=DEBUG
- SIAMESE_PORT=8012
- SIAMESE_THREADS=24
- SIAMESE_W2V_MODEL_EN=/word2vec/google-news-slim/GoogleNews-vectors-negative300-SLIM.bin.gz
mongodb:
image: "tutum/mongodb:3.2"
restart: always
volumes:
- $PWD/mongodb/data:/data/db
ports:
- "27017:27017"
- "27018:27018"
environment:
- AUTH=no
redis:
image: redis:latest
restart: always
command: redis-server --appendonly yes
volumes:
- $PWD/redis/data:/data
ports:
- "6379:6379"
elasticsearch:
image: "elasticsearch:5.2.0"
restart: always
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- $PWD/elasticsearch/data:/usr/share/elasticsearch/data
- $PWD/elasticsearch/plugins:/usr/share/elasticsearch/plugins
ports:
- "9200:9200"
- "9300:9300"
ulimits:
memlock:
soft: -1
hard: -1
該描述文件采用的格式是YML,該描述文件聲明了多個(gè)容器服務(wù)和它的配置,比如鏡像、環(huán)境變量、映射的磁盤(pán)、日志管理等。拷貝右側的代碼為/app/chatbot/docker-compose.yml。
關(guān)于服務(wù)編排格式更多說(shuō)明。
創(chuàng )建磁盤(pán)路徑
Docker容器是一種管理計算資源的方式,它讓開(kāi)發(fā)運營(yíng)軟件的構建、分發(fā)和運行做到了標準化。對于在容器運行過(guò)程中,不慎被刪除或崩潰,有可能造成數據丟失。一個(gè)解決方案是將Docker容器中應用產(chǎn)生的數據映射到宿主機器的磁盤(pán)上。在命令行終端中, 到/app/chatbot下,執行下面的命令:
mkdir -p mongodb/data # 存儲 mongodb 數據
mkdir -p elasticsearch/data # 存儲 elasticsearch 數據
mkdir -p elasticsearch/plugins # elasticsearch 插件程序
mkdir -p redis/data # 存儲 redis 數據
mkdir -p superbrain/logs # 存儲 superbrain 日志
啟動(dòng)服務(wù)
完成磁盤(pán)路徑的創(chuàng )建后,就可以啟動(dòng)服務(wù)了。在命令行終端中, 到/app/chatbot下,執行下面的命令:
docker-compose up -d
這時(shí),命令會(huì )立即退出,因為該命令告訴docker-compose在后臺執行啟動(dòng)工作,服務(wù)啟動(dòng)需要1-2分鐘,這取決于運行服務(wù)的硬件資源。
在命令行終端中, 到/app/chatbot下,執行下面的命令查看服務(wù)日志:
docker-compose logs -f
在服務(wù)啟動(dòng)的過(guò)程中,也可以看到相應日志。
關(guān)于docker-compose up的更多使用介紹,請查看文檔。
在命令行終端中, 到/app/chatbot下,執行下面的命令查看服務(wù)啟動(dòng)狀態(tài):
docker-compose ps
在輸出中,為多列描述的各服務(wù)的信息,其中State列為其中狀態(tài),在沒(méi)有異常發(fā)生時(shí),各服務(wù)的State均為Up,輸出結果類(lèi)似下面:
chatoperaio_elasticsearch_1 /docker-entrypoint.sh elas ... Up 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
chatoperaio_intent_1 npm start Up 0.0.0.0:8027->8027/tcp
chatoperaio_mongodb_1 /run.sh Up 0.0.0.0:27017->27017/tcp, 0.0.0.0:27018->27018/tcp, 28017/tcp
chatoperaio_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
chatoperaio_siamese_1 /root/venv-py2/bin/python2 ... Up 0.0.0.0:8012->8012/tcp
chatoperaio_superadmin_1 /bin/sh -c npm start Up 3000/tcp
chatoperaio_superbrain_1 node app.js Up 0.0.0.0:8003->8003/tcp
以上代表服務(wù)正常啟動(dòng)了,這時(shí)可以通過(guò)訪(fǎng)問(wèn)智能問(wèn)答引擎控制臺來(lái)管理聊天機器人。
http://服務(wù)器IP地址:8032
管理控制臺
智能問(wèn)答引擎管理控制臺是為方便企業(yè)IT人員或業(yè)務(wù)人員管理智能問(wèn)答引擎而設計的,在服務(wù)被正常啟動(dòng)后,管理控制臺的URL地址是:http://{{IP}}:8032
注意: {{IP}}是docker容器運行的宿主機器IP地址。
使用瀏覽器打開(kāi)該地址,即可使用管理控制臺,主要功能包括:
- 聊天機器人增刪改差
- 聊天機器人監控
- 聊天機器人多輪對話(huà)管理
- 聊天機器人知識庫管理
聊天機器人管理
進(jìn)入控制臺,可以看到所有聊天機器人并管理。控制臺

新建機器人

管理詳情

聊天機器人監控
通過(guò)儀表盤(pán)可以查看機器人的使用情況。儀表盤(pán)

使用多輪對話(huà)設計器 設計對話(huà)應用并導出的程序包,程序包后綴名是.c66。導入可以看到對話(huà)列表,也可以設置各個(gè)對話(huà)的狀態(tài)。
多輪對話(huà)

環(huán)境變量4

查看腳本

邏輯

知識庫包括問(wèn)答對和近義詞,問(wèn)答對支持批量導入,導入文件格式必須是UTF-8編碼的CSV文件。
該CSV文件的每一行內容格式為: 是否啟用,標準問(wèn),答案,擴展問(wèn)1,擴展問(wèn)2,擴展問(wèn)3
CSV文件示例
true,錢(qián)款數據在哪查,微信商戶(hù)支付平臺里
false,怎么計算中獎呢,無(wú)法計算,中獎?dòng)嬎惴椒?br /> true,沒(méi)有二維碼,刷新當前頁(yè),看不到二維碼
常見(jiàn)問(wèn)題

編輯一個(gè)問(wèn)答對的標準問(wèn)、擴展問(wèn)、回復和狀態(tài)。
問(wèn)題編輯

近義詞

API
智能問(wèn)答引擎與其他服務(wù)集成的方式是暴露出來(lái)的Rest API接口,接口可以分為以下幾類(lèi):資源 | 描述 | 路徑前綴 |
聊天機器人 | 對象的增刪改查 | /api/v1/chatbot |
多輪對話(huà) | 查詢(xún),導入和狀態(tài)管理 | /api/v1/chatbot/:ChatbotID/conversation |
多輪對話(huà) | 問(wèn)答的使用情況統計數據 | /api/v1/chatbot/:chatbotID/conversation/query/counts |
知識庫FAQ問(wèn)答對 | 增刪改查和狀態(tài)管理 | /api/v1/chatbot/:chatbotID/faq/database |
知識庫近義詞 | 增刪改查 | /api/v1/chatbot/:ChatbotID/faq/synonyms |
知識庫 | 問(wèn)答的使用情況統計數據 | /api/v1/chatbot/:chatbotID/faq/query/counts |
意圖識別 | 分析接口 | /api/v1/chatbot/:ChatbotID/intent/parse |
應用健康 | 狀態(tài)查詢(xún)接口 | /ping |
基本規范
在Rest API接口中,請求包括協(xié)議(http/https),IP地址(Host),HTTP頭字段(Headers),HTTP報文主體(Body 可選)。- 請求(Request)
Host: {{IP}}
Headers: Content-Type application/json
注意: 1. {{變量}}代表變量; 2. {{IP}}代表服務(wù)運行的宿主機器的IP地址。
- 響應(Response)
{
"rc": 0,
"data": ...
}
其中,rc代表請求是否被滿(mǎn)足,0代表滿(mǎn)足;rc非0時(shí),代表有異常,不同的異常類(lèi)型使用不同的數字,在每個(gè)API中介紹。
異常返回的一般形式:
{
"rc": 非0的正整數,
"error": ...,
"msg": ...
}
POST /api/v1/chatbot/:ChatbotID
cURL:創(chuàng )建聊天機器人curl --request POST \
--url 'http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}' \
--header 'Content-Type: application/json' \
--data '{
"name": "小叮當",
"primaryLanguage": "zh_CN"
}'
創(chuàng )建聊天機器人
BODY
{"name": "小叮當",
"primaryLanguage": "zh_CN"
}
字段 | 必須 | 類(lèi)型 | 描述 |
chatbotID | 是 | string | 機器人的唯一ID,是以字母開(kāi)始的由[a-zA-Z0-9_]組成的字符串。 |
name | 是 | string | 機器人的名稱(chēng)。 |
primaryLanguage | 是 | string | 機器人的語(yǔ)言,現在支持兩個(gè)選項:["zh_CN", "en_US"],分別代表中文和英文。 |
description | 否 | string | 機器人的描述 |
成功返回
{"rc": 0,
"data": {
"chatbotID": "{{chatbotID}}",
"name": "小叮當",
"fallback": "我不明白您的意思。",
"description": "智能問(wèn)答和對話(huà)任務(wù)",
"welcome": "你好!我是機器人客服。",
"primaryLanguage": "zh_CN"
}
}
返回字段說(shuō)明:
fallback:聊天機器人的兜底回復。
description:聊天機器人的描述。
welcome:歡迎語(yǔ)。
異常返回
{"rc":2,
"error":"already exists."
}
返回字段說(shuō)明:
rc:非0正整數代表不同的異常類(lèi)型,比如,當前rc是2,異常描述為“already exists.”,說(shuō)明該{{chatbotID}}已經(jīng)存在了。
PUT /api/v1/chatbot/:ChatbotID
cURL:更新聊天機器人curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}} \
-H 'Content-Type: application/json' \
-d '{
"fallback": "我不能理解您的意思。",
"description": "聊天機器人",
"welcome": "我的特長(cháng)是聊天。"
}'
更新聊天機器人
BODY
{"fallback": "我不能理解您的意思。",
"description": "聊天機器人",
"welcome": "我的特長(cháng)是聊天。"
}
字段 | 必須 | 類(lèi)型 | 描述 |
fallback | 否 | string | 機器人兜底回復,在多輪對話(huà)查詢(xún)沒(méi)有匹配到回復時(shí)使用。 |
description | 否 | string | 描述該機器人。 |
welcome | 否 | string | 歡迎語(yǔ),保留字段,暫時(shí)未使用。 |
成功返回
{"rc": 0,
"data": {
"chatbotID": "{{chatbotID}}",
"fallback": ...,
"description": ...,
"welcome": ...
}
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID
cURL:獲取聊天機器人信息curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}} \
-H 'Content-Type: application/json'
獲取聊天機器人信息
BODY
null成功返回
{"rc": 0,
"data": {
"chatbotID": "{{chatbotID}}",
"name": "小叮當",
"fallback": "我不明白您的意思。",
"description": "智能問(wèn)答和對話(huà)任務(wù)",
"welcome": "你好!我是機器人客服。",
"primaryLanguage": "zh_CN"
}
}
異常返回
{"rc": 3,
"error": "not exist."
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot
cURL:獲取聊天機器人列表curl -X GET \
'http://{{IP}}:8003/api/v1/chatbot?sortby=-created&q={"chatbotID": "department_1"}' \
-H 'Content-Type: application/json'
獲取聊天機器人列表
QUERY
支持在URL中添加query信息來(lái)查詢(xún)機器人和翻頁(yè)等操作,比如 /api/v1/chatbot?page=1&limit=10&fields=chatbotID name&q={"name": "test"},各參數介紹如下:屬性 | 類(lèi)型 | 描述 | 默認值 | 示例 |
limit | number | 返回本頁(yè)數據的條數 | 100 | 10 |
page | number | 返回哪一頁(yè)(可根據total進(jìn)行判斷) | 1 | 2 |
fields | string | 返回哪些字段 | 除_id 和 __v之外的所有字段 | chatbotID name |
sortby | string | 按照哪個(gè)字段進(jìn)行排序 | 空 | -created (按照 created 降序) |
q | string | 按照字段查詢(xún) | 空 | {"name": "test"} |
BODY
null成功返回
{"total": 1,
"rc": 0,
"current_page": 1,
"total_page": 1,
"data": [
{
"name": "小叮當",
"chatbotID": "{{chatbotID}}",
"primaryLanguage": "zh_CN",
"fallback": "我不明白您的意思。",
"welcome": "你好!我是機器人客服。",
"description": "智能問(wèn)答和對話(huà)任務(wù)"
},
...
]
}
返回字段說(shuō)明:
total代表聊天機器人數量。
current_page代表當前頁(yè),total_page代表總頁(yè)數。
data是聊天機器人數據。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
DELETE /api/v1/chatbot/:ChatbotID
cURL:刪除一個(gè)聊天機器人curl -X DELETE \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}} \
-H 'Content-Type: application/json' \
刪除一個(gè)聊天機器人
BODY
null成功返回
{"rc": 0,
"data": {
"message": "done."
}
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotID/faq/database
cURL:創(chuàng )建問(wèn)答對curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database \
-H 'Content-Type: application/json' \
-d '{
"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"enabled": true
}'
創(chuàng )建問(wèn)答對
BODY
{"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"enabled": true
}
字段 | 必須 | 類(lèi)型 | 描述 |
post | 是 | string | 問(wèn)答對的問(wèn)題,也稱(chēng)“標準問(wèn)” |
reply | 是 | string | 問(wèn)題對應的回復 |
enabled | 是 | boolean | 是否“啟用”,啟用代表該問(wèn)答對在檢索時(shí)被使用;否則不被檢索 |
成功返回
{"rc": 0,
"data": {
"id": "{{docId}}}"
}
}
返回字段說(shuō)明:
docId代表該問(wèn)答對的唯一標識。
異常返回
{"rc": 3,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID/faq/database/:docId
cURL:根據文檔Id查詢(xún)問(wèn)答對詳情curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}} \
-H 'Content-Type: application/json'
根據文檔Id查詢(xún)問(wèn)答對詳情
BODY
null成功返回
{"rc": 0,
"data": {
"id": "{{docId}}",
"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"enabled": true
}
}
異常返回
{"rc": 3,
"error": {
"msg": "Not Found"
}
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:ChatbotID/faq/database/:docId
cURL:根據文檔ID更新問(wèn)答對curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}} \
-H 'Content-Type: application/json' \
-d '{
"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"enabled": true
}'
根據文檔ID更新問(wèn)答對
BODY
{"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"enabled": true
}
字段 | 必須 | 類(lèi)型 | 描述 |
post | 否 | string | 問(wèn)答對的問(wèn)題,也稱(chēng)“標準問(wèn)” |
reply | 否 | string | 問(wèn)題對應的回復 |
enabled | 否 | boolean | 是否“啟用”,啟用代表該問(wèn)答對在檢索時(shí)被使用;否則不被檢索 |
成功返回
{"rc": 0,
"data": {
"id": "{{docId}}"
}
}
異常返回
{"rc": 3,
"error": {
"msg": "Not Found"
}
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
DELETE /api/v1/chatbot/:ChatbotID/faq/database/:docId
cURL:根據文檔ID刪除問(wèn)答對curl -X DELETE \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}} \
-H 'Content-Type: application/json'
根據文檔ID刪除問(wèn)答對
BODY
null成功返回
{"rc": 0,
"message": "done"
}
異常返回
{"rc": 3,
"error": {
"msg": "Not Found"
}
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID/faq/database
cURL:查詢(xún)問(wèn)答對列表,可根據字段查詢(xún),支持分頁(yè)curl -X GET \
'http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database?limit=30' \
-H 'Content-Type: application/json'
查詢(xún)問(wèn)答對列表,可根據字段查詢(xún),支持分頁(yè)
QUERY
在url中,支持使用檢索條件,比如 /api/v1/chatbot/{{chatbotID}}/faq/database?page=1&limit=10,各參數介紹如下:屬性 | 類(lèi)型 | 描述 | 默認值 | 示例 |
limit | number | 返回本頁(yè)數據的條數 | 5 | 10 |
page | number | 返回哪一頁(yè)(可根據total進(jìn)行判斷) | 1 | 2 |
BODY
null成功返回
{"total": 354,
"current_page": 1,
"total_page": 12,
"data": [
{
"post": "上架商品就不能修改了是嗎?",
"is_original": true,
"reply": "沒(méi)有訂單產(chǎn)生時(shí)可以修改",
"enabled": true,
"id": "{{docId}}"
},
...
]
}
異常返回
{"rc": 3,
"error": {
"msg": "[index_not_found_exception] no such index
}
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:chatbotID/faq/database/:docId/extend
cURL:創(chuàng )建擴展問(wèn)curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}}/extend \
-H 'Content-Type: application/json' \
-d '{
"post": "怎樣支持微信支付?"
}
'
創(chuàng )建擴展問(wèn),擴展問(wèn)關(guān)聯(lián)一個(gè)問(wèn)答對,擴展問(wèn)是標準問(wèn)的另一種問(wèn)法。一個(gè)問(wèn)答對可以關(guān)聯(lián)多個(gè)擴展問(wèn)。
擴展問(wèn)可以使系統更智能,提高檢索的準確率。
BODY
{"post": "怎樣支持微信支付?"
}
字段 | 必須 | 類(lèi)型 | 描述 |
post | 是 | string | 與標準問(wèn)意思一致的另一種問(wèn)法,也稱(chēng)“擴展問(wèn)”。 |
成功返回
{"rc": 0,
"data": {
"id": "{{extendId}}"
}
}
返回字段說(shuō)明:
extendId是該擴展問(wèn)的唯一標識。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:chatbotID/faq/database/:docId/extend
cURL:查詢(xún)擴展問(wèn)curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}}/extend \
-H 'Content-Type: application/json'
查詢(xún)擴展問(wèn)
BODY
null成功返回
{"total": 1,
"current_page": 1,
"total_page": 1,
"data": [
{
"post": "怎樣支持微信支付?",
"is_original": false,
"postId": "{{docId}}",
"enabled": true,
"id": "{{extendId}}"
},
...
],
"rc": 0
}
異常返回
{"rc": 3,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:chatbotID/faq/database/:docId/extend/:extendId
cURL:更新擴展問(wèn)curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}}/extend/{{extendId}} \
-H 'Content-Type: application/json' \
-d '{
"post": "怎樣支持微信支付?"
}
'
更新擴展問(wèn)
BODY
{"post": "怎樣支持微信支付?"
}
字段 | 必須 | 類(lèi)型 | 描述 |
post | 是 | string | 與標準問(wèn)意思一致的另一種問(wèn)法,也稱(chēng)“擴展問(wèn)”。 |
成功返回
{"rc": 0,
"data": {
"id": "{{extendId}}"
}
}
返回字段說(shuō)明:
extendId是該擴展問(wèn)的唯一標識。
異常返回
{"rc": 3,
"error": {
"msg": "Not Found"
}
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
DELETE /api/v1/chatbot/:chatbotID/faq/database/:docId/extend/:extendId
cURL:刪除擴展問(wèn)curl -X DELETE \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/{{docId}}/extend/{{extendId}} \
-H 'Content-Type: application/json'
刪除擴展問(wèn)
BODY
null成功返回
{"rc": 0,
"message": "done"
}
異常返回
{"rc": 3,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID/faq/database/export
cURL:導出問(wèn)答對數據curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/database/export \
-H 'Content-Type: application/json'
導出問(wèn)答對數據
BODY
null成功返回
{"rc": 0,
"data": [
[
true,
"怎么開(kāi)通微信支付?",
"登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付",
"如何支持微信支付"
],
...
]
}
返回字段說(shuō)明:
data是問(wèn)答對的所有數據,每個(gè)元素代表一個(gè)問(wèn)答對。 每個(gè)元素又是一個(gè)數組,按照順序分別代表:[enabled,標準問(wèn),回復,0~多個(gè)擴展問(wèn)]。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotID/faq/synonyms
cURL:創(chuàng )建近義詞curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/synonyms \
-H 'Content-Type: application/json' \
-d '{
"text": "番茄",
"neighbors": ["西紅柿", "狼桃"]
}'
創(chuàng )建近義詞,近義詞可以進(jìn)一步提高系統的智能水平。
BODY
{"text": "番茄",
"neighbors": ["西紅柿", "狼桃"]
}
字段 | 必須 | 類(lèi)型 | 描述 |
text | 是 | string | 詞匯 |
neighbors | 是 | [string] | 與text意思相近的詞匯 |
成功返回
{"rc": 0,
"data": {
"text": "番茄",
"chatbot": "{{chatbotID}}",
"neighbors": [
"西紅柿",
"狼桃"
],
"id": "{{synonymsId}}"
}
}
返回字段說(shuō)明:
synonymsId是該近義詞組的唯一標識。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID/faq/synonyms/:synonymsId
cURL:使用synonymsId獲取近義詞詳情curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/synonyms/{{synonymsId}} \
-H 'Content-Type: application/json'
使用synonymsId獲取近義詞詳情
BODY
null成功返回
{"rc": 0,
"data": {
"text": "番茄",
"neighbors": [
"西紅柿",
"狼桃"
]
}
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:ChatbotID/faq/synonyms/:synonymsId
cURL:更新近義詞curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/synonyms/{{synonymsId}} \
-H 'Content-Type: application/json' \
-d '{
"text": "番茄",
"neighbors": ["西紅柿", "狼桃", "洋柿子"]
}'
更新近義詞
BODY
{"text": "番茄",
"neighbors": ["西紅柿", "狼桃", "洋柿子"]
}
成功返回
{"rc": 0,
"data": {
"text": "番茄",
"neighbors": [
"西紅柿",
"狼桃",
"洋柿子"
]
}
}
異常返回
{"rc": 1,
"error": ...
}
DELETE /api/v1/chatbot/:ChatbotID/faq/synonyms/:synonymsId
cURL:刪除近義詞curl -X DELETE \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/synonyms/{{synonymsId}} \
-H 'Content-Type: application/json'
刪除近義詞
BODY
null成功返回
{"rc": 0,
"message": "done"
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotID/faq/synonyms
cURL:查詢(xún)近義詞列表,支持分頁(yè)和按字段查詢(xún)curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/synonyms \
-H 'Content-Type: application/json'
查詢(xún)近義詞列表,支持分頁(yè)和按字段查詢(xún)
BODY
null成功返回
{"total": 1,
"rc": 0,
"current_page": 1,
"total_page": 1,
"data": [
{
"text": "番茄",
"chatbot": "{{chatbotID}}",
"neighbors": [
"西紅柿",
"狼桃",
"洋柿子"
],
"id": "{{synonymsId}}"
},
...
]
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotID/faq/query
cURL:根據查詢(xún)句子查詢(xún)答案, 返回答案列表,并帶有分數curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/query \
-H 'Content-Type: application/json' \
-d '{
"query": "如何開(kāi)通微信支付"
}'
根據查詢(xún)句子查詢(xún)答案, 返回答案列表,并帶有分數
BODY
{"query": "如何開(kāi)通微信支付"
}
字段 | 必須 | 類(lèi)型 | 描述 |
query | 是 | string | 從知識庫中檢索的目標 |
成功返回
{"rc": 0,
"data": [
{
"id": "{{docId}}",
"score": 0.647,
"post": "怎么開(kāi)通微信支付?",
"reply": "登錄微信公眾號平臺,點(diǎn)擊左側微信支付菜單欄,按照開(kāi)通步驟開(kāi)通微信支付"
}
]
}
返回字段說(shuō)明:
data是一個(gè)數組,包含0~多個(gè)問(wèn)答對,并且按照匹配程度降序,匹配程度就是該問(wèn)答對的問(wèn)題和query的相似度。
相似度是屬于[0-1]區間的值,越大代表語(yǔ)義越相似。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotID/faq/click
cURL:記錄FAQ點(diǎn)擊事件curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/faq/click \
-H 'Content-Type: application/json' \
-d '{
"query": "如何開(kāi)通微信支付",
"groundtruth": "如何支持微信支付",
"negatives": ["如何支持支付", "怎么取消微信支付"]
}'
記錄FAQ點(diǎn)擊事件:在客服人員點(diǎn)擊建議問(wèn)時(shí),將訪(fǎng)客的問(wèn)題和客服點(diǎn)擊的問(wèn)題記錄下來(lái)。
點(diǎn)擊事件具有很重要的價(jià)值:
- 梳理業(yè)務(wù),提高商業(yè)智能;
- 方便統計系統使用情況;
- 評估系統準確率;
- 優(yōu)化系統準確率,比如訓練更好的機器學(xué)習模型。
BODY
{"query": "如何開(kāi)通微信支付",
"groundtruth": "如何支持微信支付",
"negatives": ["如何支持支付", "怎么取消微信支付"]
}
字段 | 必須 | 類(lèi)型 | 描述 |
query | 是 | string | 原始查詢(xún) |
groundtruth | 是 | string | 準確答案 |
negatives | 是 | [string] | 被展示為建議答案但是沒(méi)有被選中的候選回復 |
成功返回
{"rc": 0,
"message": "done"
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:chatbotID/intent/parse
cURL:意圖識別服務(wù)curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/intent/parse \
-H 'Content-Type: application/json' \
-d '{
"query": "can I have my cashback",
"clientId": "gmis"
}'
使用機器學(xué)習模型,分析意圖和實(shí)體。
BODY
{"query": "我想取錢(qián)",
"clientId": "{{clientId}}"
}
字段 | 必須 | 類(lèi)型 | 描述 |
query | 是 | string | 待被分析意圖的句子 |
clientId | 是 | string | 客戶(hù)唯一標識,目前意圖識別模型依賴(lài)每個(gè)客戶(hù)的數據,和客戶(hù)的業(yè)務(wù)關(guān)系緊密,每個(gè)客戶(hù)單獨制作。 |
成功返回
{"rc": 0,
"data": {
"tag": "{{intentId}}",
"score": 2.515
}
}
返回字段說(shuō)明:
如果rc為0,但是data中不包含tag和score時(shí),代表程序未能識別出意圖。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotId/conversation
cURL:獲得對話(huà)列表curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation \
-H 'Content-Type: application/json'
獲得對話(huà)列表
BODY
null成功返回
{"rc": 0,
"total": 1,
"current_page": 1,
"total_page": 1,
"data": [
{
"chatbotID": "{{chatbotID}}",
"name": "{{conversationName}}",
"enabled": true,
"id": "{{conversationId}}"
},
...
]
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:ChatbotId/conversation/:conversationId
cURL:獲得對話(huà)詳情curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/{{conversationId}} \
-H 'Content-Type: application/json' \
獲得對話(huà)詳情
BODY
null成功返回
{"rc": 0,
"data": {
"chatbotID": "{{chatbotID}}",
"name": "course",
"modified": "2018-07-11T09:39:58.349Z",
"created": "2018-07-02T12:02:43.037Z",
"scriptBody": "+ _resolve_course_\n- 您好,我是小云,您的課程顧問(wèn),請問(wèn)您家小孩多大了?\n\n+ 一年級老師\n- ^get_teachers(1)",
"enabled": true,
"id": "{{conversationId}}"
}
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:ChatbotId/conversation/:conversationId/enable
cURL:使對話(huà)處于"啟用"狀態(tài)curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/{{conversationId}}/enable
使對話(huà)處于"啟用"狀態(tài)
BODY
null成功返回
{"rc": 0,
"data": {
"name": "course",
"chatbotID": "{{chatbotID}}",
"enabled": true,
"id": "{{conversationId}}"
}
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:ChatbotId/conversation/:conversationId/disable
cURL:使對話(huà)處于"禁用"狀態(tài)curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/{{conversationId}}/disable \
使對話(huà)處于"禁用"狀態(tài)
BODY
null成功返回
{"rc": 0,
"data": {
"name": "course",
"chatbotID": "{{chatbotID}}",
"enabled": false,
"id": "{{conversationId}}"
}
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /api/v1/chatbot/:chatbotID/conversation/environment
cURL:獲取環(huán)境變量curl -X GET \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/environment \
獲取環(huán)境變量
環(huán)境變量是多輪對話(huà)的在“設計階段”和“部署階段”不共享的變量。具體應用場(chǎng)景見(jiàn)多輪對話(huà)設計器:快速開(kāi)始。
BODY
null成功返回
{"rc": 0,
"data": {
"USERNAME": "張三"
}
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
PUT /api/v1/chatbot/:chatbotID/conversation/environment
cURL:更新環(huán)境變量curl -X PUT \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/environment \
-H 'Content-Type: application/json' \
-d '{
"USERNAME": "李四",
"PASSWORD": "123456"
}'
更新環(huán)境變量
BODY
{"USERNAME": "李四",
"PASSWORD": "123456"
}
成功返回
{"rc": 0,
"msg": "done"
}
返回字段說(shuō)明:
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotId/conversation/query
cURL:對話(huà)問(wèn)答查詢(xún)curl -X POST \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/query \
-H 'Content-Type: application/json' \
-d '{
"fromUserId": "{{uid}}",
"textMessage": "北京今天天氣怎么樣",
"isDebug": false
}'
對話(huà)問(wèn)答查詢(xún)
BODY
{"fromUserId": "{{uid}}",
"textMessage": "北京今天天氣怎么樣",
"isDebug": false
}
成功返回
{"rc": 0,
"data": {
"state": "default",
"createdAt": 1531910247845,
"string": "白天天氣多云,并且空氣濕度偏大,在這種天氣條件下,您會(huì )感到有些悶熱,不很舒適。",
"topicName": "weather",
"subReplies": [],
"logic_is_fallback": false,
"botName": "小叮當"
}
}
返回字段說(shuō)明:
state是一些業(yè)務(wù)需求的約定字段,比如,對話(huà)要完成“用戶(hù)認證”,那么在完成認證后,state會(huì )返回auth_succ;認證失敗時(shí),返回auth_fail,該字段可通過(guò)對話(huà)腳本設定。
logic_is_fallback代表該回復是否是兜底。
topicName代表當前機器人正在聊的話(huà)題。
botName代表聊天機器人的名字。
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
POST /api/v1/chatbot/:ChatbotId/conversation/droplet/import
cURL:導入對話(huà)應用文件ZIPFILE=小叮當-1.0.0-conversations.c66
set -x
curl -i -X POST -H "Content-Type: multipart/form-data" \
-F "droplet=@$ZIPFILE" \
-F "USERNAME=李四" \
-F "PASSWORD=123456" \
http://{{IP}}:8003/api/v1/chatbot/{{chatbotID}}/conversation/droplet/import
導入對話(huà)應用文件
對話(huà)應用文件示例詳見(jiàn)天氣查詢(xún)機器人:多輪對話(huà)示例程序。
BODY
multipart表單,環(huán)境變量使用-F設定鍵值對,對話(huà)應用文件設置droplet的文件路徑,參考cURL樣例程序。成功返回
{"rc": 0,
"data": {
"msg": "Import is done successfully."
}
}
異常返回
{"rc": 1,
"error": ...
}
返回字段說(shuō)明:
rc為正整數時(shí),代表異常,異常描述為error。
GET /ping
cURL:獲取應用健康狀態(tài)curl -X GET \
http://{{IP}}:8003/ping \
-H 'Content-Type: application/json'
獲取應用健康狀態(tài)
BODY
null成功返回
{"timestamp": 1531918165514,
"uptime": 8783.43,
"application": {
"name": "superbrain",
"version": "1.0.0",
"pid": 1,
"title": "node",
"argv": [
"/usr/local/bin/node",
"/app/app.js"
],
"versions": {
"http_parser": "2.8.0",
"node": "8.11.3",
"v8": "6.2.414.54",
"uv": "1.19.1",
"zlib": "1.2.11",
"ares": "1.10.1-DEV",
"modules": "57",
"nghttp2": "1.32.0",
"napi": "3",
"openssl": "1.0.2o",
"icu": "60.1",
"unicode": "10.0",
"cldr": "32.0",
"tz": "2017c"
}
},
"resources": {
"memory": {
"rss": 369848320,
"heapTotal": 130859008,
"heapUsed": 108874240,
"external": 18007788
},
"loadavg": [
0.35302734375,
0.28759765625,
0.2412109375
],
"cpu": [
{
"model": "Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz",
"speed": 2500,
"times": {
"user": 1586270600,
"nice": 0,
"sys": 1050236500,
"idle": 21709890800,
"irq": 0
}
},
{
"model": "Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz",
"speed": 2500,
"times": {
"user": 1562807900,
"nice": 0,
"sys": 1015181800,
"idle": 21782348900,
"irq": 0
}
}
],
"disk": [
{
"filesystem": "overlay",
"size": 123721700,
"used": 94808660,
"available": 22605316,
"capacity": 0.81,
"mount": "/"
},
{
"filesystem": "tmpfs",
"size": 65536,
"used": 0,
"available": 65536,
"capacity": 0,
"mount": "/dev"
},
{
"filesystem": "tmpfs",
"size": 8216392,
"used": 0,
"available": 8216392,
"capacity": 0,
"mount": "/sys/fs/cgroup"
},
{
"filesystem": "/dev/vda1",
"size": 123721700,
"used": 94808660,
"available": 22605316,
"capacity": 0.81,
"mount": "/app/logs"
},
{
"filesystem": "shm",
"size": 65536,
"used": 0,
"available": 65536,
"capacity": 0,
"mount": "/dev/shm"
},
{
"filesystem": "tmpfs",
"size": 8216392,
"used": 0,
"available": 8216392,
"capacity": 0,
"mount": "/sys/firmware"
}
],
"nics": {
"lo": [
{
"address": "127.0.0.1",
"netmask": "255.0.0.0",
"family": "IPv4",
"mac": "00:00:00:00:00:00",
"internal": true,
"cidr": "127.0.0.1/8"
}
],
"eth0": [
{
"address": "172.19.0.15",
"netmask": "255.255.0.0",
"family": "IPv4",
"mac": "02:42:ac:13:00:0f",
"internal": false,
"cidr": "172.19.0.15/16"
}
]
}
},
"system": {
"arch": "x64",
"platform": "linux",
"type": "Linux",
"release": "4.4.0-62-generic",
"hostname": "29866b45ce71",
"uptime": 2453892,
"cores": 2,
"memory": 16827174912
}
}
返回字段說(shuō)明:
描述應用和操作系統的各種數據。