gossip

前几个星期双11的时候,腾讯服务器搞活动,我就入手一台轻量应用服务器,然后买了一个2H4G的,它是真的便宜,我一下买了3年的,然后就打算捣鼓一下它,当然这个聊天机器人就是其中一个,因为之前捣鼓过一次了,比上一次好了许多,有一点轻车熟路的感觉。

Start

目前市面上也有很多大厂做聊天机器人,比如,腾讯,百度,微软等,而且也有一下开源的提供接口,比如青云客,思知。但是我想做一个自己的自己的聊天机器人,对于我这种不太会机器学习的人来说,难度很大,但是偶然一次我看到百度开源的paddlepaddle,它里面已经开源了一些模型,包括一个聊天的模型,并且提供了部署的框架,可谓是非常的贴心,话不多说,开始干。

Work

首先要安装一些它的库。

pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple

这两个是必要的,如果下面提示缺少什么就安装什么就好了,这些都是基本操作,不多说,那下面就是开始搭建聊天机器人,官方是给了一个微信聊天的机器人demo,而我想封装成一个api调用,这里先从简单的开始,先使用官方的那个一键启动。

hub serving start -m plato-mini

这里第一次使用会进行模型下载,然后运行完成之后,就可以发送请求了。

import requests
import json

texts = [["今天是个好日子"], ["天气预报说今天要下雨"]]
data = {"data": texts}
# 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip
url = "http://127.0.0.1:8866/predict/plato-mini"
# 指定post请求的headers为application/json方式
headers = {"Content-Type": "application/json"}

r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.json())

但是这个只是一个人家官方给出的,我想要的是再添加一些自己的功能,这时候我们可以用另一种方式,调用模型,进行一些处理

# 非交互模式
import paddlehub as hub

model = hub.Module(name='plato-mini')
data = [["你是谁?"], ["你好啊。", "吃饭了吗?",]]
result = model.predict(data)
# 交互模式
import paddlehub as hub

model = hub.Module(name='plato-mini')
with model.interactive_mode(max_turn=3):
    while True:
        human_utterance = input("[Human]: ").strip()
        robot_utterance = model.predict(human_utterance)[0]
        print("[Bot]: %s"%robot_utterance)

细心地可以发现在交互模式下有个max_turn,这个是代表是否与上面信息相关联,如果关联,关联多少条,这里写的3,代表3条。这个就搭建一个简单的了,但是又有问题了,比如,我如果发个它一个英语,但是它不会的,这就造成无法对话了,那怎么呢?学习一下机器学习,重新搞一下吗,不可能的。时间周期太长,还有就是时间不充裕,所以我选择翻译,这里我们用一下我们爬虫人的极速,逆向一下某度,某道的翻译,等于说发一段英语时,我们要先把它翻译成中文,然后预测,然后把预测的结果翻译成英文返回给用户,这样就ok了,这里就不细说它们的逆向了,反正不难。这样这个就ok了。我们看一下效果。

基于tcp协议的简易聊天机器人 聊天机器人搭建_基于tcp协议的简易聊天机器人

通过上图可以看到,我给它发的是Do you speak English?,它回答我的是Sure, would you?,还是非常不错的。但是接下来是我又想到一个问题,我想知道知道某个地方的天气,这个也想让机器人回答,这个怎么做,对于天气信息获取,我采用的高德的,但是怎么分析是否在获取天气呢,这里我才用的是paddlepaddle的语句分析,首先询问一个地方的天气肯定里面含有天气二字,然后里面肯定会有地方,对于时间这个不要求,如果有时间要求,就就返回对应时间的,如果没有就返回全部的。

这里我们看一段简单的代码,关于这个中文分析的。

import paddlehub as hub

lac = hub.Module(name="lac")
test_text = ["宁波明天天气怎么样"]

results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)
print(results)
#[{'word': ['宁波', '明天', '天气', '怎么样'], 'tag': ['LOC', 'TIME', 'n', 'r']}]

可以看到返回的信息,word是已经分好的词,而tag是其对应的词性。很明显,宁波对应地方,明天对应时间。我们完全可以通过这个实现。然后对接高德的查询天气接口就好了。

我们看一下效果。

基于tcp协议的简易聊天机器人 聊天机器人搭建_paddle_02

因为我是把它应用于qq机器人的,所以这里返回的信息做了专门的处理,大致长下面这样。

基于tcp协议的简易聊天机器人 聊天机器人搭建_paddle_03

好了,这样就做好了一个对话机器人,然后这仅仅是一部分,后面会加入很多,比如歌曲歌词的获取,点歌(已经实现网易云的了),还有玩游戏什么的,等等等。

END

其实这个过程还是有点小困难的,这里我仅仅说一个思路,有空我就代码上传github了,里面我加入,感兴趣的到时可以试试玩玩。好了,这一期就这样结束了,下期再见。

# paddlepaddle的github,也有gitee
https://github.com/PaddlePaddle
# paddlepaddle官网
https://www.paddlepaddle.org.cn/