基于PaddleHub的QQ聊天机器人

在这里插入图片描述

一. 项目背景

本项目是参加【AI达人特训营】的作品。
当你在和朋友在QQ群里划水摸鱼时,你是否会感到有一丝枯燥,没事别担心。为了增加群友们的划水乐趣,提高群友的文化水平。笔者在这里简单搭建了一个QQ聊天机器人,这个bot的功能包括但不限于实时聊天,自由问答,百度百科,对联生成等。

二. 项目方案

本项目是基于go-cqhttp和PaddleHub以及flask实现的QQ机器人项目
go-cqhttp是用来模拟QQ登录并获取QQ信息的开源软件

PaddleHub我选择了Plato-mini预训练模型,生成对话,还有ernie_zeus大模型实现对联生成和自由问答

Flask是一个轻量级的基于python的web框架,我们使用它来搭建机器人的后端系统

三. Plato-mini预训练模型的介绍和本地安装

近年来,人机对话系统受到了学术界和产业界的广泛关注并取得了不错的发展。开放域对话系统旨在建立一个开放域的多轮对话系统,使得机器可以流畅自然地与人进行语言交互,既可以进行日常问候类的闲聊,又可以完成特定功能,以使得开放域对话系统具有实际应用价值。
plato-mini包含6层的transformer结构,头数为12,隐藏层参数为768,参数量为89M。该模型在十亿级别的中文对话数据上进行预训练,通过PaddleHub加载后可直接用于对话任务。

#安装paddlepaddle 和 paddlehub
#在本地安装需要去掉!哟
!pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
#先来在体验一下安装plato-mini模型
!hub install plato-mini==1.0.0
# 进入交互模式
# 第一次进入可能会比较慢,需要下载参数文件。
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)

四. 关于go-cqhttp

1. 下载go-cqhttp

首先我们去官网下载go-cqhttp,官网地址在这点击

进入官网后我们可以看到,发行下载这个选项,点击进入。

接着我们进来了go-cqhttp的储存库向下划即可看到各种各样版本的go-cqhttp。

下载这个go-cqhttp_windows_amd64.zip文件就行,如果想部署到服务器上就下载linux版本的。

2. 安装go-cqhttp

下载到本地后我们解压文件并进入文件夹,

点击exe文件后会弹出这个提示选择确定,然后再确定。

完成上述的操作后会生成go-cqhttp.bat文件,我们点击这个文件:

点击bat文件进入后,会弹出命令行窗口,我们输入0在按回车,选择http通信

3. 配置go-cqhttp文件

接下来会看见文件夹下有config.yml的文件生成,我们点击进入修改配置:

进入config.yml文件后我们需要修改一下配置:

uin是机器人的QQ号password是QQ号的密码
下滑倒配置文件最下面去掉-url和secret前的#。(注意要持缩进一致,如果缩进不一致会导致配置文件不合法,无法生效,这里推荐用VScode自动提示缩进对齐。)


基本配置已经完成接下来直接打开go-cqhttp.bat就行了,
进去是这样的效果。

五. Flask搭建后端监听平台

当我们安装好go-cqhttp和plato后,我们可以继续在电脑上搭建一个后端的监听平台来获取信息调用以及调用模型

首先导入我们需要的库
如果没有可以选择pip安装

关于下面url发送群消息使用send_group_msg,group_id则对应发送的QQ群号
发送私聊消息使用send_private_msg,user_id则对应发送的QQ号
requests.get(url=‘http://127.0.0.1:5700/send_group_msg?group_id=761150083&message=’ + robot_utterance )

from flask import Flask,request
import requests
import paddlehub as hub
app = Flask(__name__)
model = hub.Module(name='plato-mini')
@app.route('/', methods=["POST"])
def post_data():
    message = ' '
    if request.get_json().get('message_type') == 'group':
        uid  = request.get_json().get('sender').get('user_id')
        message = request.get_json().get('raw_message')
        print(message)
    if  message.split(' ')[0] =='聊天':
        with model.interactive_mode(max_turn=3):
            human_utterance = message.split(' ')[1]
            robot_utterance = model.predict(human_utterance)[0]
            requests.get(url='http://127.0.0.1:5700/send_group_msg?group_id=761150083&message=' + robot_utterance )
    return "OK"
if __name__ == '__main__':
    pp.run(debug=True, host='127.0.0.1', port=5701) 

运行我们的后端平台,就可以开始聊天了

六. 调用ernie_zeus模型

这里先简单介绍一下ernie_zeus模型

ERNIE 3.0 Zeus 是 ERNIE 3.0 系列模型的最新升级。其除了对无标注数据和知识图谱的学习之外,还通过持续学习对百余种不同形式的任务数据学习。实现了任务知识增强,显著提升了模型的零样本/小样本学习能力。
ERNIE 3.0 Zeus提供很多API接口写作文,写文案,对联等功能。读者如果有兴趣的话可以去这个项目了解PaddleHub:使用 ERNIE 3.0 Zeus 大模型进行高质量文本生成
我们简单介绍一下API的调用。

申请API的ak和sk

首先点击链接进入官网:
文心大模型官网
点击开放API下的ERNIE 3.0 文本理解与创作

然后,点击右上角的登录,使用百度账号等即可登录,登录后可以看到查看AK/SK这个选项点击即可

可以看到有创建API key这个选项,点击就会生成API Key 和 Secret key这就是我们所需的ak和sk了。

调用作文创作API

作文创作
请设置 ‘ak’ 和 ‘sk’ 参数
ak和sk的参数可以去文心的官网申请https://wenxin.baidu.com/

import paddlehub as hub 
model = hub.Module(name='ernie_zeus',ak ='' ,sk  ='')
result = model.composition_generation(
text="论诚信")
print(result)

调用对联生成API

调用对联生成的API ak和sk同上

import paddlehub as hub
model = hub.Module(name='ernie_zeus',ak ='' ,sk  ='')
result = model.couplet_continuation(
text='年年岁岁花相似')
print(result)

将调用的API接入我们的后端框架

model1 = hub.Module(name=‘ernie_zeus’,ak =‘’ ,sk =‘’)
调用对联生成,为了方便我将模型初始化放在了开头

if request.get_json().get(‘message_type’) == ‘group’:
用来判断是否为群聊信息,
如果需要判断是否为好友信息可以将’group’替换’private’
这个if语句是为了打印出我们在后台监听的消息

if message.split(’ ')[0] ==‘聊天’:
此处我们将收到的消息进行分割,并判断获取聊天内容,通过模型预测发送预测结果

from flask import Flask,request
import requests
import paddlehub as hub
app = Flask(__name__)
model = hub.Module(name='plato-mini')
model1 = hub.Module(name='ernie_zeus',ak ='' ,sk  ='')

@app.route('/', methods=["POST"])
def post_data():
    message = ' '
    if request.get_json().get('message_type') == 'group':
        uid  = request.get_json().get('sender').get('user_id')
        message = request.get_json().get('raw_message')
        print(message)
    if  message.split(' ')[0] =='聊天':
        with model.interactive_mode(max_turn=3):
            human_utterance = message.split(' ')[1]
            robot_utterance = model.predict(human_utterance)[0]
            requests.get(url='http://127.0.0.1:5700/send_group_msg?group_id=761150083&message=' + robot_utterance )
    if message.split(' ')[0] == '对联':
        result = model1.couplet_continuation(text=message.split(' ')[1])
        requests.get(url='http://127.0.0.1:5700/send_private_msg?user_id=1018875507&message='+result)
    if message.split(' ')[0] == '作文':
        result1 = model1.composition_generation(text=message.split(' ')[1])
        requests.get(url='http://127.0.0.1:5700/send_private_msg?user_id=1018875507&message='+result1)

    return "OK"
if __name__ == '__main__':
    app.run(debug=True, host='127.0.0.1', port=5701)

后台启动后效果如下:

我们前端QQ界面的效果如下:

当然了我们也可以加入一点其他东西,比如百度百科的爬虫

#爬虫
import urllib.request
import urllib.parse
from lxml import etree
import requests


def query(content):
    # 请求地址
    url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content)
    # 请求头部
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    # 利用请求地址和请求头部构造请求对象
    req = urllib.request.Request(url=url, headers=headers, method='GET')
    # 发送请求,获得响应
    response = urllib.request.urlopen(req)
    # 读取响应,获得文本
    text = response.read().decode('utf-8')
    # 构造 _Element 对象
    html = etree.HTML(text)
    # 使用 xpath 匹配数据,得到匹配字符串列表
    sen_list = html.xpath('//div[contains(@class,"lemma-summary") or contains(@class,"lemmaWgt-lemmaSummary")]//text()')
    # 过滤数据,去掉空白
    sen_list_after_filter = [item.strip('\n') for item in sen_list]
    # 将字符串列表连成字符串并返回
    result = ''.join(sen_list_after_filter)
    requests.get(url='http://127.0.0.1:5700/send_private_msg?user_id=1018875507&message=' + str(result))

效果如下

七. 项目总结

本项目只是在本地搭建了一个QQ机器人,实现了人机对话的能力,整个项目的源码已经放在目录work的bot文件夹下了。当然也有百度百科,写作文这些趣味性的能力,但是对话模型较小,聊天内容有些单调和重复,相信这些功能可以在你平常娱乐时增添几分不一样的色彩,如果感兴趣的话,可以在上述内容中接入天气预报API,接入文心模型的绘画API。当然你也可以把机器人部署到服务器上,这样就能24小时与机器人快乐的学习了。

关于作者

项目作者: 姓名:李俊 AI Studio昵称:封刀隐没 个人主页

飞桨导师: 姓名: 黄灿桦 AI Studio昵称:炼丹师233 个人主页

传说中的飞桨社区最菜代码人,让我们一起努力!
记住:封刀隐没出品必是精品 (不要脸系列)

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐