0. 前言
好久不见, 甚是想念~
社区也越做越好了 :) 继续加油! 奥里给!
非常感谢我的老朋友们!
今天给大家带来的是: 在腾讯云上打造你的私人 AI 助手, 没想到腾讯云还可以这样玩.
本文有大量图文, 方便学习者可以一步一步进行参考.
这里给大家准备了一个资料包: assistant.zip
下载地址: https://img.yingjoy.cn/qcloud/assistant.zip
1. 环境准备
点击即可跳转
1.1 腾讯智能对话平台 TBP https://console.cloud.tencent.com/tbp
现在正在公测申请, 可以填写信息进行申请, 秒过
1.1.1 申请 TBP
1.2 腾讯云服务器 https://url.cn/588dJVp
手动滑稽
2. 开始打造
2.1 创建 TBP 的 Bot
Bot 是某一行业或领域 (例如: 音乐, 新闻) 相关意图的集合. 相当于是一个功能模块.
点击创建: https://console.cloud.tencent.com/tbp/bots
Bot 标识名可以按照规则随意取一个
创建完成后点击配置
2.2 配置你的 Bot
下面我来解释一下各指标的含义:
测试
对你的 Bot 进行测试, 会弹出一个对话框.
闲聊
开启后可以进行日常对话, 如果不开启会出现只要不匹配意图就会回复兜底, 如下面的情况:
问答管理 - 阈值设置
调整问答命中灵敏度, 问题和意图之间可接受的误差, 比如下面这句话:
意图: 你吃饭了吗
问题: 你吃了午餐吗 (与意图匹配)
问题: 吃了午餐 (与意图不匹配)
具体想知道意图和问题是否匹配可以使用腾讯云自然语言处理 NLP https://console.cloud.tencent.com/nlp/basicguide 来测试
如图, Similarity 为匹配相似度, 测试结果为 0.95, 意味着我们只要将阈值设置在 0.1 即可匹命中.
这里我不是很清楚这个对话平台是否采用了这个 API 来计算相似度, 不过原理就是这么个原理, 由于该平台还在公测, 所以会存在一些不完善的地方, 我坚信后面都会逐渐完善的.
兜底(fallback)
当机器人无法回复用户时,
若当前 Bot 开启了闲聊, 则通过闲聊进行兜底;
若当前 Bot 没有开启闲聊, 则返回兜底话术.
猜你想问设置
没有命中意图的时候会推荐相似的问题.
2.3 创建一个意图
点击左边导航菜单的: 语义模型 -> 意图管理
点击新建意图, 按照规则创建意图名, 这里我创建了一个 weather
点击配置, 进行配置.
这里我用一个天气查询助手作为示例
这里借助了高德接口, 感谢~
这里先看一下我们最终的成果, 下面是手机端, PC 端也有:
这里只展示天气助手的开发
3. 天气助手
3.1 编写接口
这里我采用了 Python Flask 框架来编写接口.
- # -*- 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?from=10680 点击试用即可.
这里由于我早已不是新用户, 所以我临时购买了一台服务器给大家演示~
我的服务器配置:
3.2.1 安装 Python 环境
登录服务器编写脚本 install.sh, 将如下内容复制进去
- 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
然后执行:
bash install.sh
等待一会服务器的 Python 环境就安装好了
3.2.2 安装 Python 库
我们采用 pipenv 作为服务器的 Python 虚拟环境, 所以执行
pip3 install pipenv
3.2.3 部署接口
注意: 这里要修改 main.py 中的 GD_KEY 为你的 Key 才行, 否则服务会启动失败
将我们的资料包放到服务器上, 并解压
进入 assistant 目录, 执行命令, 安装虚拟环境
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 头
- 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 格式
- {
- "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"
- }
参数具体意思可以见:
我这就不贴出来了, 以免本文篇幅过长.
接口返回规范
这里要注意, 我们的接口返回也是要遵循规范的
HTTP 头
- HTTP/1.1 200 OK
- Content-Type: application/JSON;charset=UTF-8
- Content-Length:
响应正文(JSON)
- {
- "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.HTML
中 iframe 的 src 为你的 src
点击应用接入, 填写你的 API 密钥, 可以通过 API 密钥管理创建一个 https://console.cloud.tencent.com/cam/capi
在点击 Web 接入 -> 接入设置
复制这个 src 属性, 替换服务器上 assistant/templates/index.HTML 的 iframe 的 src 标签
保存退出后, 执行下面的命令启动服务:
bash run.sh
之后用浏览器访问服务器的 4003 端口, 你会得到如下:
注意: 如果发现端口无法访问, 请检查服务器的防火墙是否关闭!
注意: 如果发现端口无法访问, 请检查服务器的防火墙是否关闭!
注意: 如果发现端口无法访问, 请检查服务器的防火墙是否关闭!
重要的事情说三遍
4. 成果
重新打开我们的首页
http://111.230.206.33:4003/
注: 如果失效了, 请自行部署一个, 我的服务器是试用的临时机器 :(
5. 结尾
这里只演示了一个很简单的示例, 有了这个示例, 我相信大家一定能够开发出更好玩的东西~
这里也非常期望未来腾讯智能对话平台 TBP https://console.cloud.tencent.com/tbp 的全新版本, 比如图片交互, 语音交互等等, 这样结合更多 AI 组件, 我们的私人 AI 助手能够越来越智能!
如有疑问请联系我:
社区或者邮箱都可以联系我哦~
邮箱: yingjoy906@gmail.com
发件格式: 请在邮件标题标注: [腾讯云社区 - AI 助手]
谢谢~~~
来源: https://www.qcloud.com/developer/article/1616554