UNIT是百度推出的智能对话定制和服务平台,搭载业界领先的需求理解、对话控制及底层的自然语言处理、知识挖掘等核心技术,可以让您的产品快速拥有对话交互能力。
UNIT及时推出了丰富的预置技能,开发者可一键获取技能,接入公众号、小程序、硬件产品、虚拟服务机器人等众多产品形态。下面通过简单几步,介绍如何通过百度小程序实现手动搭建闲聊机器人。
1 添加“闲聊”预置技能
1.1进入UNIT主页,点击“进入UNIT”,https://ai.baidu.com/unit/home
1.2 点击“我的技能”选项卡,在预置技能处点击“获取技能”。此处生成的技能ID在后续程序中调用。
1.3 选中“闲聊”,在右侧可以输入对话,初步测试。点击“获取该技能”,即可将该技能加入到我的技能。
2 百度小程序开发过程
2.1下载并安装百度开发者工具:
https://smartprogram.baidu.com/docs/develop/tutorial/install/
2.2小程序开发流程参考开发文档:https://smartprogram.baidu.com/docs/develop/tutorial/startdevelop/
2.3创建项目
在根目录的全局配置文件app.json中增加:"pages/contact/contact" ,会自动创建相关页面文件,结构如下:
contact.js:功能逻辑模块
contact.css:页面样式文件
contact.swan:页面布局文件
contact.json:页面配置文件
3.回复内容个性化干预
UNIT在今年3月份的升级中支持开发者对闲聊技能进行多维度干预。比如根据闲聊中用户问题或闲聊答复的文本、对话行为、情感情绪进行单条件或多条件组合设定干预规则,当用户在闲聊过程中触发了干预规则,则可以对用户输出固定答复、替换答复中的关键词、生产满足特定条件的答复,还可以在答复内容前加上特定的前后缀。可以针对开发者使用场景中的敏感闲聊内容进行灵活高效地干预,从而避免产生影响产品形象、商业目标的闲聊对话行为,从整体上保障、改善产品的人机对话体验。
以询问机器人年龄为例,可以自主设定机器人的年龄。
3.1配置个性化干预规则
3.2发布并生效新模型
3.3测试模型效果
4.调用UNIT接口
4.1 首先要在控制台创建应用,调用UNIT接口,“获取API Key/Secret Key”。
接口文档地址:https://ai.baidu.com/docs#/UNIT-v2-API/top
请求URL: https://aip.baidubce.com/rpc/2.0/unit/bot/chat
4.2核心代码
const app = getApp();
var api = require('../../utils/get_token.js');
const recorderManager = swan.getRecorderManager();
const fs = swan.getFileSystemManager();
var inputVal = '';
var msgList = [];
var windowWidth = swan.getSystemInfoSync().windowWidth;
var windowHeight = swan.getSystemInfoSync().windowHeight;
var keyHeight = 0;
var that;
var chatListData = [];
var filePath;
/**
* 获取token
*/
//header文件
var content_type = "application/json";
//client_id 为官网获取的AK, client_secret 为官网获取的SK
var client_id = '*****************';
var client_secret = '***************';
var tts_token = '';
/**
* 初始化数据
*/
function initData(that) {
inputVal = '';
//获取TTS_token
that.read_token(client_id, client_secret, content_type);
}
Page({
/**
* 页面的初始数据
*/
data: {
// 自定义欢迎语的语料
defaultCorpus: '',
// 用户输入
askWord: '',
// 发送按钮disable
sendButtDisable: true,
// 用户信息
userInfo: {},
// 对话信息
chatList: [],
// 对话滚动标志
scrolltop: '',
toView: '',
// 用户Logo,如果用户不授权,则使用默认图像
userLogoUrl: '/res/image/user_default.png',
keyboard: '',
scrollHeight: '92vh',
inputBottom: 0,
value: '',
focus: true,
hasResult: false,
showEmptyResult: false,
blur: true
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
initData(this);
});
that = this;
// 取得用户信息,把用户头像放入用户Logo中
app.getUserInfo(function (userInfo) {
var aUrl = userInfo.avatarUrl;
if (aUrl != null) {
that.setData({
userLogoUrl: aUrl
});
}
});
// 自定义欢迎语
// this.sendRequest(this.data.defaultCorpus);
that.addChat('万众一心,抗击疫情。您可以这样问我:最新确诊病例?', 'l');
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
swan.setPageInfo({
title: '智子问答',
keywords: ' ',
description: ' ',
success: res => {
console.log('setPageInfo success', res);
},
fail: err => {
console.log('setPageInfo fail', err);
}
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {},
/**
* 获取聚焦
*/
focus: function (e) {
keyHeight = e.detail.height;
this.setData({
scrollHeight: windowHeight - keyHeight + 'px'
});
this.setData({
toView: 'msg-' + (msgList.length - 1),
inputBottom: keyHeight + 'px'
});
//计算msg高度
// calScrollHeight(this, keyHeight);
},
//失去聚焦(软键盘消失)
blur: function (e) {
this.setData({
scrollHeight: '90vh',
inputBottom: 0
});
this.setData({
toView: 'msg-' + (msgList.length - 1)
});
},
// 监听用户输入
Typing: function (e) {
var inputVal = e.detail.value;
var buttDis = true;
if (inputVal.length != 0) {
var buttDis = false;
}
that.setData({
sendButtDisable: buttDis
});
},
searchFocus(e) {
this.setData({
focus: true
});
},
searchInput(e) {
const value = e.detail.value;
this.setData({
value,
component: [],
api: [],
hasResult: false,
showEmptyResult: false
});
if (!value) {
this.resetResult();
return false;
}
if (value.length === 1 && /[a-zA-Z]/.test(value)) {
this.resetResult();
return false;
}
},
searchConfirm(e) {
const value = this.getData('value').replace(/\s/gi, '');
that.addChat(value, 'r');
// 请求函数
that.sendRequest(value);
if (value) {
this.setData({
showEmptyResult: true,
hasHistory: true
});
}
},
searchBlur(e) {
this.setData({
focus: false
});
},
searchClear() {
this.setData({
value: '',
hasResult: false,
showEmptyResult: false
});
},
// 调用语义接口
sendChat: function (e) {
let word = e.detail.value.ask_word ? e.detail.value.ask_word : e.detail.value;
that.addChat(word, 'r');
that.setData({
askWord: '',
sendButtDisable: true
});
// 请求函数
that.sendRequest(word);
// that.voiceAnalysis(word);
},
// 发送UNIT网络请求
sendRequest(corpus) {
that.read_token(client_id, client_secret, content_type);
console.log("ok!! tts_token:", tts_token);
app.NLIRequest(corpus, {
'success': function (res) {
if (res.status == "error") {
swan.showToast({
title: '返回数据有误!'
});
return;
}
that.NLIProcess(res);
},
'fail': function (res) {
swan.showToast({
title: '请求失败!'
});
return;
}
});
},
// 处理语义(拿到回答)
NLIProcess: function (res) {
var nlires = JSON.parse(res);
var nliArray = nlires.result.response.action_list[0].say;
// var nliArray = nlires.result;
// console.log(nliArray);
that.addChat(nliArray, 'l');
that.tts(nliArray);
return;
},
// 显示回答,并滚动到最新位置
addChat: function (word, orientation) {
that.addChatWithFlag(word, orientation, true);
},
// 显示回答并选择是否滚动到最新位置(true为是,false为否)
addChatWithFlag: function (word, orientation, scrolltopFlag) {
let ch = { 'text': word, 'time': new Date().getTime(), 'orientation': orientation };
chatListData.push(ch);
var charlenght = chatListData.length;
if (scrolltopFlag) {
that.setData({
chatList: chatListData,
scrolltop: "roll" + charlenght
});
} else {
that.setData({
chatList: chatListData
});
}
},
switchInputType: function () {
this.setData({
keyboard: !this.data.keyboard
});
},
// 获取token
read_token: function (client_id, client_secret, content_type) {
api.get_token(client_id, client_secret, content_type, {
'success': function (res) {
var resData = JSON.parse(res);
tts_token = resData.access_token;
// console.log("[Console log]access_token:" + tts_token);
return;
},
'fail': function (res) {
swan.showToast({
title: '请求token失败!'
});
return;
}
});
},
});
5.测试效果
向大佬学习,O(∩_∩)O哈哈~
你是百度小程序。
我是微信小程序。
还差QQ、抖音、支付宝小程序示例就齐活了。哈哈哈哈