【玩转腾讯云】打造你的私人 AI 助手

2020-04-21 11:12:06 浏览数 (2)

0. 前言

好久不见,甚是想念~

社区也越做越好了 :) 继续加油! 奥里给!

非常感谢我的老朋友们!


今天给大家带来的是:在腾讯云上打造你的私人 AI 助手,没想到腾讯云还可以这样玩。

本文有大量图文,方便学习者可以一步一步进行参考。

这里给大家准备了一个资料包:assistant.zip

下载地址:https://img.yingjoy.cn/qcloud/assistant.zip

1. 环境准备

点击即可跳转

1.1 腾讯智能对话平台 TBP

现在正在公测申请,可以填写信息进行申请,秒过

1.1.1 申请 TBP

1.2 腾讯云服务器

手动滑稽

2. 开始打造

2.1 创建 TBP 的 Bot

Bot 是某一行业或领域(例如:音乐、新闻)相关意图的集合。相当于是一个功能模块。

点击创建:https://console.cloud.tencent.com/tbp/bots

Bot 标识名可以按照规则随意取一个

创建完成后点击配置

2.2 配置你的 Bot

下面我来解释一下各指标的含义:

测试

对你的 Bot 进行测试,会弹出一个对话框。

闲聊

开启后可以进行日常对话,如果不开启会出现只要不匹配意图就会回复兜底,如下面的情况:

问答管理-阈值设置

调整问答命中灵敏度,问题和意图之间可接受的误差,比如下面这句话:

  • 意图: 你吃饭了吗
  • 问题: 你吃了午餐吗 (与意图匹配)
  • 问题: 吃了午餐 (与意图不匹配)

具体想知道意图和问题是否匹配可以使用腾讯云自然语言处理 NLP来测试

如图,Similarity 为匹配相似度,测试结果为 0.95,意味着我们只要将阈值设置在 0.1 即可匹命中。

这里我不是很清楚这个对话平台是否采用了这个 API 来计算相似度,不过原理就是这么个原理,由于该平台还在公测,所以会存在一些不完善的地方,我坚信后面都会逐渐完善的。

兜底(fallback)

当机器人无法回复用户时,

  1. 若当前 Bot 开启了闲聊,则通过闲聊进行兜底;
  2. 若当前 Bot 没有开启闲聊,则返回兜底话术。

猜你想问设置

没有命中意图的时候会推荐相似的问题。

2.3 创建一个意图

点击左边导航菜单的: 语义模型 -> 意图管理

点击新建意图,按照规则创建意图名,这里我创建了一个weather

点击配置,进行配置。

这里我用一个天气查询助手作为示例

这里借助了高德接口,感谢~

这里先看一下我们最终的成果,下面是手机端,PC端也有:

这里只展示天气助手的开发

3. 天气助手

3.1 编写接口

这里我采用了Python Flask框架来编写接口。

代码语言:txt复制
# -*- coding: utf8 -*-

import requests
import pandas as pd
from flask import Flask, make_response, jsonify, request, render_template

__author__ = 'YingJoy'

app = Flask(__name__)
GD_KEY = '高德地图的Key,可以去申请'


@app.route('/')
def index():
    """助手首页"""
    return render_template('index.html')


@app.route('/weather', methods=['POST'])
def weather_assistant():
    """
    天气查询助手,用于【玩转腾讯云】打造你的私人 AI 助手
    """
    request_body = request.json

    # 获取参数,这里为了演示就不做其他校验,直接取数据
    city_name = request_body['SlotInfoList'][0]['SlotValue']
    request_id = request_body['RequestId']

    # 读取城市编号,这是采用了高德地图的接口,详见:https://lbs.amap.com/api/webservice/guide/api/weatherinfo
    df = pd.read_excel('static/AMap_adcode_citycode_2020_4_10.xlsx', encoding='utf8')
    adcode = df[df['中文名'] == city_name]['adcode']
    if adcode.empty:
        # 如果城市不存在,返回错误,TBP会自动进行追问,当然也可以返回TBP支持的Response Body, 在WebHookStatus中指定错误
        return make_response('城市错误', 400)

    resp = requests.get(f'https://restapi.amap.com/v3/weather/weatherInfo?key={GD_KEY}&city={int(adcode)}')
    # 如果高德地图接口调用失败报错
    if resp.json()['status'] != '1':
        return make_response(str(resp.json()), 500)

    # 格式化天气格式
    weather_result = resp.json()['lives'][0]
    query_date = weather_result['reporttime']
    province = weather_result['province']
    weather = weather_result['weather']
    temperature = weather_result['temperature']
    humidity = weather_result['humidity']
    winddirection = weather_result['winddirection']
    windpower = weather_result['windpower']
    response_message = f"截至{query_date},{province} - {city_name}的天气为{weather}," 
                       f"温度:{temperature}°,湿度:{humidity},风向:{winddirection},风力:{windpower}。"

    # 构造返回体
    return jsonify({
        "RequestId": request_id,
        "SessionAttributes": "string",
        "ResponseMessage": {
            "ContentType": "PlainText",
            "Content": response_message
        },
        "WebHookStatus": ""
    })


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=4006, debug=True)

将接口部署到服务器即可。

3.2 接口部署

新用户可以免费体验 https://cloud.tencent.com/act/free 点击试用即可。

这里由于我早已不是新用户,所以我临时购买了一台服务器给大家演示~

我的服务器配置:

3.2.1 安装Python环境

登录服务器编写脚本install.sh,将如下内容复制进去

代码语言:txt复制
yum groupinstall "Development Tools" -y
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
yum install libffi-devel -y

wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
tar xvf Python-3.8.1.tgz
cd Python-3.8.1/
./configure --prefix=/opt/python38
make && make install

echo "export PATH=$PATH:/opt/python38/bin" >> /etc/profile
source /etc/profile

然后执行:

代码语言:txt复制
bash install.sh

等待一会服务器的Python环境就安装好了

3.2.2 安装Python库

我们采用pipenv作为服务器的Python虚拟环境,所以执行

代码语言:txt复制
pip3 install pipenv
3.2.3 部署接口

注意:这里要修改main.py中的GD_KEY为你的Key才行,否则服务会启动失败

将我们的资料包放到服务器上,并解压

进入assistant目录,执行命令,安装虚拟环境

代码语言:txt复制
pipenv install

3.3 创建城市词典

点击 语义模型 -> 词典管理 -> 新建自定义词典

城市词典内置词典里也有,这里为了通用性,直接带大家创建一个自定义词典,内置词典直接点引用即可。

新建词典 city,点击配置

在添加词条处点击批量上传

选择资料包中的static/词条批量上传模板.xlsx

这个文件就是点击下载模板后填入城市名称的表

也可以手动添加你喜欢的城市,用分号隔开

导入成功后你可以得到这个词典。

3.4 配置意图

点击我们刚刚创建的weather意图,进行配置

3.2.1 创建用户说法

用户说法就是内置的问题,这里先介绍一下,这里的用户说法是可以使用{}进行参数申明的(即后面的槽位)。

根据这个槽位我们可以拿到主干信息进行对应的业务响应。

如:我要创建一个查询天气的问题:

别忘了点添加哦

这里的CityName即为一个槽位

3.2.2 创建槽位

创建槽位用于接受参数,创建一个CityName接受之前说法中的城市名

这里填写槽位名称为CityName,词典选择我们创建的city词典,可以选择必填。

追问是指如果没有在词典中找到对应的词系统就会回复该语句继续追问。

别忘了点添加哦

3.2.3 服务实现

这里我们选用外部服务调用 (Web Service),让服务调用我们的接口。

这里我们填写我们上面部署的接口地址

这里填入你的接口地址

这里延申一下接口的参考:

当用户发起提问时,服务器会受到包含JSON主体的POST请求

HTTP 头

代码语言:txt复制
POST / HTTP/1.1
Content-Type : application/json;charset=UTF-8
Host : your.application.endpoint
Content-Length :
Accept : application/json
Accept-Charset : utf-8

JSON 格式

代码语言:txt复制
{
  "RequestId": "string",
  "AppId": int,
  "BotId": "string",
  "BotName": "string",
  "IntentName": "string",
  "SlotInfoList": [
    {
      "SlotName": "string",
      "SlotValue": "string"
    },
    {
      "SlotName": "string",
      "SlotValue": "string"
    },
    {
      "SlotName": "string",
      "SlotValue": "string"
    },
    {
      "SlotName": "string",
      "SlotValue": "string"
    }
  ],
  "UserId": "string",
  "SessionAttributes": "string"
}

参数具体意思可以见:https://cloud.tencent.com/document/product/1060/37447

我这就不贴出来了,以免本文篇幅过长。

接口返回规范

这里要注意,我们的接口返回也是要遵循规范的

HTTP 头

代码语言:txt复制
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length:

响应正文(JSON)

代码语言:txt复制
{
  "RequestId": "响应的ID,返回req中的RequestId",
  "SessionAttributes": "string",
  "ResponseMessage": {
    "ContentType": "PlainText",
    "Content": "返回消息内容"
  },
  "WebHookStatus": ""
}

暂时只支持回复文本,很期待后面的图片和视频,结合AI可以有更多玩法,如果可以我后面会持续更新。

注:意图串联就是将多个意图组合成复杂逻辑,归根到底都是一个一个的意图,本文就不展开了

最后点击保存意图。即可。

3.5 修改接口配置

3.3.1 修改main.py中的GD_KEY为你的Key为你的Key
3.3.2 发布你的Bot

点击左边导航的发布管理,点击发布上线,即可发布我们的Bot

3.3.3 修改templates/index.htmliframesrc为你的src

点击应用接入,填写你的API密钥,可以通过API密钥管理创建一个

在点击Web接入-> 接入设置

复制这个src属性,替换服务器上assistant/templates/index.htmliframesrc标签

保存退出后,执行下面的命令启动服务:

代码语言:txt复制
bash run.sh

之后用浏览器访问服务器的4003端口,你会得到如下:

注意:如果发现端口无法访问,请检查服务器的防火墙是否关闭!

注意:如果发现端口无法访问,请检查服务器的防火墙是否关闭!

注意:如果发现端口无法访问,请检查服务器的防火墙是否关闭!

重要的事情说三遍

4. 成果

重新打开我们的首页

http://111.230.206.33:4003/

注:如果失效了,请自行部署一个,我的服务器是试用的临时机器 :(

5. 结尾

这里只演示了一个很简单的示例,有了这个示例,我相信大家一定能够开发出更好玩的东西~

这里也非常期望未来腾讯智能对话平台 TBP的全新版本,比如图片交互,语音交互等等,这样结合更多AI组件,我们的私人AI助手能够越来越智能!

如有疑问请联系我:

社区或者邮箱都可以联系我哦~

邮箱: yingjoy906@gmail.com

发件格式:请在邮件标题标注: 【腾讯云社区 - AI助手】

谢谢~~~

0 人点赞