如何落地一個智能機器人
如何落地一個智能機器人
https://www.zoo.team/article/intelligent-robot

前言
隨著智能 AI 的普及,對話式人工智能產(chǎn)品也越來越常見。從產(chǎn)品定義出發(fā),智能問答類產(chǎn)品最根本的價值在于以低成本的優(yōu)勢取代人工工作中大量重復性的部分。我司由于業(yè)務(wù)系統(tǒng)較為復雜,開發(fā)同學大部分的時間都在處理技術(shù)支持、業(yè)務(wù)方、測試同學反饋的真線"問題"。有些"問題"重復性極高,完全可以沉淀為 FAQ。但現(xiàn)狀是開發(fā)同學依然在重復性地回答之前已經(jīng)處理過的類似問題,這也占用了同學們大量的時間去進行無效的"溝通"。基于目前的痛點,我們覺得有必要使用智能問答機器人來管理這部分 FAQ,除此之外,智能問答機器人內(nèi)部也閉環(huán)了線上 ONCALL 問答機制,這樣更加方便管理所有問題的生命流程,也方便后續(xù)問題數(shù)據(jù)的總結(jié)分類及復盤。實現(xiàn)了 ONCALL 跟蹤,QA 應答的自動化能力。本文簡單聊一聊賦能給政采云同學們的智能問答機器人"賈維斯"的設(shè)計及落地推廣。

架構(gòu)設(shè)計
為什么要取名為"賈維斯"呢?相信喜歡鋼鐵俠的同學們都知道,它是鋼鐵俠的智能助手,也是美國漫威(https://baike.baidu.com/item/%E6%BC%AB%E5%A8%81)漫畫旗下的人工智能。全稱為 Just A Rather Very Intelligent System(是一個相當聰明的智能系統(tǒng)(https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E7%B3%BB%E7%BB%9F/5802566))。"賈維斯"的架構(gòu)設(shè)計大體如下:

"賈維斯"整體的設(shè)計理念是微服務(wù)化的。這樣易于拓展,方便打通我司現(xiàn)有的任何能力,也反哺了現(xiàn)有能力的建設(shè)及落地場景。"賈維斯"的優(yōu)勢便是能力易接入、體積更小巧、離用戶更近,當然我們最初給它的定位也很簡單明了,能為我司的同學們提供解決常見 QA 的應答以及自動化的能力。下面我就以這兩部分來介紹一下"賈維斯"。
QA 應答能力
第一部分是 QA 應答能力。秉承著"能用 JS 做的最后都會用 JS" 的態(tài)度,我們的第一版 QA 能力是由 node-nlp(https://www.npmjs.com/package/node-nlp) 提供的,為什么使用 node-nlp?第一個原因是于我們前端小伙伴來說它使用起來非常方便,第二個原因是我們想快速探索一下落地的可能性及真實使用場景。于是乎,我們的 V1.0 版本的"賈維斯"便誕生了,下面是它簡易的實現(xiàn)過程:
賈維斯 V1.0 版本
第一步:搭建項目
打開您常用的 IDEA,新建一個工程文件夾,創(chuàng)建如下所示的項目結(jié)構(gòu):
├──?buildable.js
├──?dist
│???└──?bundle.js
├──?index.html
└──?package.json
在 buildable.js 里寫入如下基礎(chǔ)代碼:
const?core?=?require('@nlpjs/core');
const?nlp?=?require('@nlpjs/nlp');
const?langenmin?=?require('@nlpjs/lang-en-min');
const?requestrn?=?require('@nlpjs/request-rn');
window.nlpjs?=?{?...core,?...nlp,?...langenmin,?...requestrn?};
因為我們只使用 NLP 的核心代碼和一個小的英語語言包,所以只需要向你的?package.json?寫入以下代碼:
{
??"name":?"nlpjs-web",
??"version":?"1.0.0",
??"scripts":?{
????"build":?"browserify?./buildable.js?|?terser?--compress?--mangle?>?./dist/bundle.js",
??},
??"devDependencies":?{
????"@nlpjs/core":?"^4.14.0",
????"@nlpjs/lang-en-min":?"^4.14.0",
????"@nlpjs/nlp":?"^4.15.0",
????"@nlpjs/request-rn":?"^4.14.3",
????"browserify":?"^17.0.0",
????"terser":?"^5.3.8"
??}
}
我們可以提前在 index.html 文件內(nèi)引用后面打包出來的 bundle.js 文件,寫入以下代碼:
<html>
<head>
????<title>NLP?in?a?browsertitle>
????<script?src='./dist/bundle.js'>script>
????<script>
????????const?{containerBootstrap,?Nlp,?LangEn,?fs}?=?window.nlpjs;
????????const?setupNLP?=?async?corpus?=>?{
????????????const?container?=?containerBootstrap();
????????????container.register('fs',?fs);
????????????container.use(Nlp);
????????????container.use(LangEn);
????????????const?nlp?=?container.get('nlp');
????????????nlp.settings.autoSave?=?false;
????????????await?nlp.addCorpus(corpus);
????????????nlp.train();
????????????return?nlp;
????????};
????????const?onChatSubmit?=?nlp?=>?async?event?=>?{
????????????event.preventDefault();
????????????const?chat?=?document.getElementById('chat');
????????????const?chatInput?=?document.getElementById('chatInput');
????????????chat.innerHTML?=?chat.innerHTML?+?`you:?${chatInput.value}
`;
????????????const?response?=?await?nlp.process('en',?chatInput.value);
????????????chat.innerHTML?=?chat.innerHTML?+?`chatbot:?${response.answer}
`;
????????????chatInput.value?=?'';
????????};
????????(async?()?=>?{
????????????const?nlp?=?await?setupNLP('https://raw.githubusercontent.com/jesus-seijas-sp/nlpjs-examples/master/01.quickstart/02.filecorpus/corpus-en.json');
????????????const?chatForm?=?document.getElementById('chatbotForm');
????????????chatForm.addEventListener('submit',?onChatSubmit(nlp));
????????})();
????script>
head>
<body>
<h1>NLP?in?a?browserh1>
<div?id="chat">div>
<form?id="chatbotForm">
????<input?type="text"?id="chatInput"?/>
????<input?type="submit"?id="chatSubmit"?value="send"?/>
form>
body>
html>
第二步:打包項目
將 buildable.js 源文件打包到 dist/bundle.js 中,運行如下命令:
npm?run?build
第三步:運行項目
接下來在瀏覽器中打開 index.html,此時你應該看到了一個可以簡單互動的聊天機器人,如下圖所示:

使用它很方便也很香,因為這三步下來,你已經(jīng)訓練了一個人工智能,這種感覺可太棒了。但考慮到瀏覽器缺少對語料庫的安全和隱私保護,以及常見的自然語言處理功能。比如無法提供主動學習、實體提取、個性化需求定制的能力,所以 V1.0 版本我們也只是更多的去探索可能性,有興趣的同學可以跟著這篇文章(https://juejin.cn/post/6899707995828174861)把玩一波。
賈維斯 V2.0 版本
鑒于第一版能力的局限,所以我們在開發(fā)第二版的時候,依靠著公司強大的資源,同 AI 團隊的同學進行協(xié)作,底層的訓練能力完全由 AI 團隊托管。比如使用市面上更流行的 BM25 快速算法(https://juejin.cn/post/7012533060398743583)進行匹配搜索以及 BERT(https://zhuanlan.zhihu.com/p/51413773)進行語義解析構(gòu)建網(wǎng)絡(luò)模型等。我們只需要提供標準的訓練數(shù)據(jù)源以及對應的落地頁來承載它即可。這樣一來,真正意義上打造了一個屬于我們公司自己的安全可靠的智能問答機器人。
如何同 AI 團隊進行協(xié)作呢?我們約定使用 RESTful 標準設(shè)計接口來進行底層的通信。這樣一來,我們便擁有了更多的交互形態(tài),比如 web 端、移動端、各類插件...,這些場景"賈維斯"都能應付自如。除此之外,我們還賦予了"賈維斯"更加豐富的交互形式,比如支持點贊、點踩、評論...,這些反饋數(shù)據(jù)后期都會作為負樣本進行模型訓練。

關(guān)于 web 端的搭建,我們使用了流行的 ChatUI(https://chatui.io/)來幫助我們開發(fā)。它是一個服務(wù)于對話領(lǐng)域的設(shè)計和開發(fā)體系,助力智能對話機器人的搭建框架,簡單幾步就可以搭建出來:
使用 ChatUI
編寫一個 HTML 文件(index.html)和運行文件(setup.js):
在 index.html 中寫入以下代碼:
html>
<html?lang="zh-CN">
??<head>
????<meta?name="renderer"?content="webkit"?/>
????<meta?name="force-rendering"?content="webkit"?/>
????<meta?http-equiv="X-UA-Compatible"?content="IE=edge,chrome=1"?/>
????<meta?charset="UTF-8"?/>
????<meta?name="viewport"?content="width=device-width,?initial-scale=1.0,?user-scalable=0,?minimum-scale=1.0,?maximum-scale=1.0,?viewport-fit=cover"?/>
????<title>賈維斯title>
????<link?rel="stylesheet"?href="http://g.alicdn.com/chatui/sdk-v2/0.2.4/sdk.css">
??head>
??<body>
????<div?id="root">div>
????<script?src="http://g.alicdn.com/chatui/sdk-v2/0.2.4/sdk.js">script>
????<script?src="http://g.alicdn.com/chatui/extensions/0.0.7/isv-parser.js">script>
????<script?src="/setup.js">script>
????<script?src="http://g.alicdn.com/chatui/icons/0.3.0/index.js"?async>script>
??body>
html>
在 setup.js 中寫入以下代碼:
var?bot?=?new?ChatSDK({
??config:?{
????navbar:?{
??????title:?'智能助理'
????},
????robot:?{
??????avatar:?'//gw.alicdn.com/tfs/TB1U7FBiAT2gK0jSZPcXXcKkpXa-108-108.jpg'
????},
????messages:?[
??????{
????????type:?'text',
????????content:?{
??????????text:?'智能助理為您服務(wù),請問有什么可以幫您?'
????????}
??????}
????]
??},
??requests:?{
????send:?function?(msg)?{
??????if?(msg.type?===?'text')?{
????????return?{
??????????url:?'//api.server.com/ask',
??????????data:?{
????????????q:?msg.content.text
??????????}
????????};
??????}
????}
??},
??handlers:?{
????parseResponse:?function?(res,?requestType)?{
??????if?(requestType?===?'send'?&&?res.Messages)?{
????????//?解析?ISV?消息數(shù)據(jù)
????????return?isvParser({?data:?res?});
??????}
??????return?res;
????}
??}
});
bot.run();
在瀏覽器中打開 index.html 即可看到如下:

更詳細的使用文檔可以參考官網(wǎng)(https://chatui.io/sdk/getting-started)。
搭建釘釘機器人
除了以上的載體,我們還深度結(jié)合釘釘機器人及釘釘推送的能力做了很多有意思的事。一方面是公司同事都是使用釘釘辦公,另一方面是消息推送的即時性能夠更好地體現(xiàn)出來。如何開發(fā)一個企業(yè)內(nèi)部機器人呢?以下流程可簡單快速的搭建一個釘釘機器人:
登錄釘釘開發(fā)者后臺(https://open-dev.dingtalk.com/),依次選擇應用開發(fā) > 企業(yè)內(nèi)部開發(fā) > 機器人,點擊創(chuàng)建應用。并完善相關(guān)的配置機器人的基本信息。
當用戶 @機器人時,釘釘會通過機器人開發(fā)者的 HTTPS 服務(wù)地址,把消息內(nèi)容發(fā)送出去,報文協(xié)議如下。
{
??"Content-Type":?"application/json;?charset=utf-8",
??"timestamp":?"1577262236757",
??"sign":"xxxxxxxxxx"
}開發(fā)者可以根據(jù)自己的業(yè)務(wù)需要,選擇回復一段消息到群中。目前支持 text、Markdown、整體跳轉(zhuǎn) actionCard 類型、獨立跳轉(zhuǎn) actionCard 類型、feedCard 這 5 種消息類型。詳情參考消息類型和數(shù)據(jù)格式(https://open.dingtalk.com/document/group/message-types-and-data-format?spm=ding_open_doc.document.0.0.7f49722fzvKj2p#topic-2098229)。
當然你也可以去自定義更多的消息模版(https://open.dingtalk.com/document/chatgroup/create-message-template),甚至在釘釘上完成一些復雜人機交互形式,讓你的機器人看起來更酷。比如下面這樣:
企業(yè)成員使用路徑:進入要使用機器人的群依次點擊 群設(shè)置 > 智能群助手 > 添加機器人,在企業(yè)機器人列表中即可找到。
更詳細的使用文檔可以參考這篇文章《企業(yè)內(nèi)部開發(fā)機器人》(https://open.dingtalk.com/document/robots/enterprise-created-chatbot)。這樣一來我們便完成了釘釘機器人的搭建,后續(xù)使用需要手動在群內(nèi)引入企業(yè)機器人即可。
打通釘釘推送
釘釘推送能力則是使用 ding-bot-sdk(https://www.npmjs.com/package/ding-bot-sdk)來實現(xiàn)的:
const?Bot?=?require('ding-bot-sdk')
const?bot?=?new?Bot({
??access_token:?'xxx',?//?Webhook?地址后的?access_token?//?必填
??secret:?'xxx'?//?安全設(shè)置:加簽的 secret 必填
})
bot.send({
??"msgtype":?"text",
??"text":?{
??????"content":?"我就是我,?@150XXXXXXXX?是不一樣的煙火"
??},
??"at":?{
??????"atMobiles":?[
??????????"150XXXXXXXX"
??????],
??????"isAtAll":?false
??}
})
完成以上這些,借助釘釘機器人推送能力,我們的 QA 應答能力便更方便落地。
自動化能力
第二部分是"自動化能力"。自動化是相對人工概念而言的。指的是在沒人參與的情況下,利用腳本使被控對象或過程自動地按預定規(guī)律運行。其最大好處是可以節(jié)省勞動力、將繁瑣的動作一鍵化,我們只需要提前將相應的系統(tǒng)流程編排起來的就可以實現(xiàn)自動化的工作。
"賈維斯"通過指令作為載體來觸發(fā)對應的腳本。這里我們有一個思考,如何區(qū)分用戶輸入的問題是不是我們內(nèi)置的指令呢?我們簡單地做了兩件事。
指令模式
一是內(nèi)置的指令盡可能的簡短,我們定義為某個特定單詞或者限定長度的字符,比如:ONCALL、值班、前端小報、百策這種關(guān)鍵詞觸發(fā)背后對應的腳本。

當然,除了純指令的場景,我們還支持通過交互形式獲取到更多的參數(shù),支持更多自定義的能力。如下所示:

這部分能力的實現(xiàn)只需要確定好一個參數(shù)標識,通過截取就可以拿到。類似于我們 npm install webpack --save 中定義為 -- 來作為參數(shù)標識。稍微復雜的一個例子是,我們可以直接打通公司的基建百策(https://juejin.cn/post/6887580440803311630)系統(tǒng),為我們提供頁面檢測功能,如下所示:

閾值計算模式
二是基于閾值進行弱匹配模式,我們會基于用戶的問題分數(shù)進行檢測,只有在低于閾值時才會走指令弱匹配模式并提示相關(guān)指令使用方式。這很類似于我們在終端使用腳手架拼錯單詞時,大部分 CLI 都會有一個很友好的提示一樣:
下面是偽代碼實現(xiàn)方式:
const?THRESHOLD?=?0.25;
const?questionStr?=?'今天誰值班';
const?instructionMap?=?[
????{
????????instruction:?'值班',
????????handler:?()?=>?console.log('獲取當前值班人員'),
????},
????{
????????instruction:?'oncall',
????????handler:?()?=>?console.log('觸發(fā)ONCALL相關(guān)'),
????},
];
const?{?scroe,?qaAns?}?=?await?getQA(questionStr);
if?(scroe?>?THRESHOLD)?{
????return?qaAns;
}
//?獲取到指令及對應的腳本動作
const?[{?instruction,?handler?}]?=?instructionMap
????.filter(({?instruction?})?=>?questionStr.indexOf(instruction)?>?-1);
return?handler();
實現(xiàn)的效果如下所示:

系統(tǒng)編排
除了單一系統(tǒng)實現(xiàn)自動化外,我們還可以將多個系統(tǒng)的核心邏輯進行編排組合。比如"賈維斯"的 ONCALL 能力,便是基于我司的值班系統(tǒng)、ICS 系統(tǒng)、語音系統(tǒng)及賈維斯內(nèi)置的工單系統(tǒng)組合而成的一套解決線上問題告警及跟蹤的方案。
再結(jié)合"賈維斯"自身的 AI 能力,不僅可以對一個 ONCALL 問題進行跟蹤管理,還可以把 ONCALL 結(jié)單的數(shù)據(jù)反哺給 QA 進行訓練,這樣便形成了 ONCALL 提問,QA 解答的閉環(huán)能力。
提問同學視角:

值班同學視角:

下次用戶再遇到類似的問題時,只需要問"賈維斯"就可以獲取答案。于用戶而言,我們只需要去使用賈維斯即可,背后的那些自動化動作則全部由"賈維斯"托管。

推廣落地
首先我們需要肯定自己的產(chǎn)品,并清楚自己做的產(chǎn)品是有價值的,可以從以下角度思考:
解決了什么問題 如何解決 用戶及場景分析
智能機器人的定位就是幫助同學們解決常見 QA 的應答以及自動化的能力。明白了產(chǎn)品價值,下面一步就是推廣使用。
本著以小到大的策略,我們選擇從身邊的研發(fā)同學推廣起來。研發(fā)同學更多的是訴求問題,比如支持腳本錄入 QA 數(shù)據(jù)、支持外部系統(tǒng)一鍵接入"賈維斯"...,通過不斷的調(diào)研,我們完成了其中部分"需求",不斷優(yōu)化體驗甚至是添加功能,目的是留住這些寶貴的 VIP 用戶。初期的用戶口碑是非常重要的,他們能給產(chǎn)品帶來更多的推廣。
最后一步就是收集用戶反饋及使用痛點,可以用問卷調(diào)查的形式,也可以通過收集埋點數(shù)據(jù)進行復盤。目的是更好地清楚自己的產(chǎn)品使用情況。既能做到及時地查漏補缺也能了解到用戶的聲音。總體來看就是以一個小點作為突破口,不斷探索發(fā)現(xiàn)更多的可能。在這個過程中不斷去調(diào)研并進行能力抽象,最后肯定它推廣它,后面落地也是很簡單的一件事。
總結(jié)和未來規(guī)劃
"賈維斯"的能力體系如下圖所示:
未來,"賈維斯"還有很多事情要做,比如支持上下文對話,能實現(xiàn)更精準的 QA 能力,或者打通更多的外部系統(tǒng),沉淀出一套通用的編排能力,又或者是更好的分析同學們遇到的真實問題,合力解決問題,提升幸福感。未來希望"賈維斯"能夠小而美,巧而強,這一切都未完待續(xù)......。
看完兩件事
如果你覺得這篇內(nèi)容對你挺有啟發(fā),我想邀請你幫我兩件小事
1.點個「在看」,讓更多人也能看到這篇內(nèi)容(點了「在看」,bug -1 ??)
