一、前言说明

  博客声明:此文链接地址https://www.cnblogs.com/Vrapile/p/12427326.html请尊重原创,未经允许禁止转载!!!

  1. 功能简述

  (1)将chatterbot机器人框架的的聊天与训练功能封装成API接口,并部署在服务器,可以供其它系统调用(此文主要讲解点)

  (2)额外封装百度图像识别和语音识别的API接口

  (3)实现前端后台管理机器人对话的增删改查导等功能

  (4)最终效果图如下,提供我的工作台,欢迎观摩:地址http://www.ninecloud.top/msw||账号visitor||密码1

  (为防止未经允许转载,密码定期更新,文章内容也会根据读者反馈不断更新)

  (5)实现下述效果,综合技术有SpringBoot+Mybatis+Mysql管理登录、菜单权限、机器人权限等,Python提供机器人API,VUE开发前端框架,服务器Nginx负载均衡等。

  

  2. 我的开发环境

  (1)开发系统环境Win10,运行环境Python3.8,运行工具Pycharm,服务器Centos7.4,前端框架Vue,前端工具VSCode,服务器工具Xshell5和Xftp5,其它Idea工具、java语言、SpringBoot+Mybatis搭建登录权限等

二、接口源码设计

  

  1. 文件结构说明

  (1)config包文件夹,放配置文件

  (2)db路径文件夹,放本地sqlite3数据库,只需建文件夹即可

  (3)file路径文件夹,放临时上传和下载文件,只需建文件夹即可

  (4)log路径文件夹,放在服务器运行的日志(只在服务器部署需要)

  (5)test包文件夹,放测试代码等,可忽略

  (6)tool包文件夹,放封装的公用函数的代码

  (7)gunicorn.py,服务器启动配置文件(只在服务器部署需要)

  (8)mychatbot.py,系统入口文件

  (9)README.md,说明文件

  2. 配置config文件

  (1)基本配置,含路径baseConfig.py

 1 import os
2
3 # 运行路径
4 runPath = os.getcwd()
5
6 # 数据库地址
7 databasePath = "sqlite:///"+os.path.join(runPath, "db/mychat.sqlite3")
8 # databasePath = 'mongodb://localhost:27017/mychat'
9
10 # 导出文件路径
11 export_json_path = os.path.join(runPath, r"file/my_export.json")
12
13 # 导入文件保存路径前缀
14 import_json_path = os.path.join(runPath, r"file")

baseConfig.py

  

  (2)百度配置baiduConfig.py

   其中百度的秘钥和私钥,是博主在百度智能云申请,仅供个人学习使用,禁止作为其它用途 !!!

 1 # 百度图像
2 Img_App_ID = "10681976"
3 Img_API_Key = "cHNlTXmj8FG9ZHXtRwQMRXwa"
4 Img_Secret_Key = "CYgOfjxKr2qWGGd8zpmiVgFCPTwK9ivC"
5 Img_Options = {
6 'detect_direction': 'true',
7 'language_type': 'CHN_ENG',
8 }
9
10 # 百度语音
11 Voice_App_ID = "10623076"
12 Voice_API_Key = "2NagVAULCYCnOnamrc8MNUPc"
13 Voice_Secret_Key = "af4860b64e77d187643db05ccdb060e4"
14 Voice_Api_Url = r"http://tts.baidu.com/text2audio"
15 # 参数设置
16 Voice_Api_Set = {"idx": 1, "cuid": "baidu_speech_demo", "cod": 2, "lan": "zh",
17 "ctp": 1, "pdt": 1, "spd": 4, "per": 4, "vol": 5, "pit": 5}
18 # Token认证
19 Voice_OpenApi_Url = r"https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&" \
20 r"client_id="+Voice_API_Key+"&client_secret="+Voice_Secret_Key
21 # 上传路径
22 Voice_Up_Url = r"http://vop.baidu.com/server_api"

baiduConfig.py

  3. 工具tool文件

  (1)ResponseMessage.py封装返回的统一接口格式

 1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 """
4 Created on Feb 23, 2020
5 @author: Vrapile
6 """
7
8 import json
9
10 retutn_format = {"code": 200, "success": True, "data": "", "message": "", "flag": 0}
11
12
13 def ok(data, code=200):
14 return_dict = retutn_format
15 return_dict["code"] = code
16 return_dict["success"] = True
17 return_dict["data"] = data
18 return_dict["message"] = None
19 return_dict["flag"] = 0
20 return json.dumps(return_dict, ensure_ascii=False)
21
22
23 def error(message, code=500):
24 return_dict = retutn_format
25 return_dict["code"] = code
26 return_dict["success"] = False
27 return_dict["data"] = None
28 return_dict["message"] = message
29 return_dict["flag"] = 1
30 return json.dumps(return_dict, ensure_ascii=False)
31
32
33 def res(data):
34 if data[0]:
35 return ok(data[1])
36 else:
37 return error(data[1])

ResponseMessage.py

  (2)BaiduUtil.py百度智能识别封装

 1 import json
2 import random
3 import urllib.request
4 import base64
5 from aip import AipOcr
6 from config import baiduConfig
7 from tool import IOUtil
8
9
10 # 百度语音转文本
11 def get_image_content(path):
12 # noinspection PyBroadException
13 try:
14 # 初始化AipFace对象
15 aip = AipOcr(baiduConfig.Img_App_ID, baiduConfig.Img_API_Key, baiduConfig.Img_Secret_Key)
16 # 调用通用文字识别接口
17 result = aip.basicGeneral(IOUtil.get_file_content(path), baiduConfig.Img_Options)
18 return True, result['words_result']
19 except:
20 return False, "Something Wrong!"
21
22
23 # 百度语音转文本
24 def get_voice_content(path):
25 # 获取access_token
26 token = get_token()
27 data = {}
28 data['format'] = 'wav'
29 data['rate'] = 16000
30 data['channel'] = 1
31 data['cuid'] = str(random.randrange(123456, 999999))
32 data['token'] = token
33 wav_fp = open(path, 'rb')
34 voice_data = wav_fp.read()
35 data['len'] = len(voice_data)
36 data['speech'] = base64.b64encode(voice_data).decode('utf-8')
37 post_data = json.dumps(data)
38 r_data = urllib.request.urlopen(baiduConfig.Voice_Up_Url, data=bytes(post_data, encoding="utf-8")).read()
39 print(json.loads(r_data))
40 err = json.loads(r_data)['err_no']
41 if err == 0:
42 return True, json.loads(r_data)['result'][0]
43 else:
44 return False, json.loads(r_data)['err_msg']
45
46
47 # 获取百度API调用的认证,实时生成,因为有时间限制
48 def get_token():
49 token_url = baiduConfig.Voice_OpenApi_Url
50 r_str = urllib.request.urlopen(token_url).read()
51 token_data = json.loads(r_str)
52 token_str = token_data['access_token']
53 return token_str
54
55 if __name__ == '__main__':
56 filepath = r'E:\Python_Doc\voice_say\beijing.wav'
57 print(get_voice_content(filepath))

BaiduUtil.py

  

  (3)IOUtil.py文件交互封装

1 # 读取文件
2 def get_file_content(path):
3 with open(path, 'rb') as fp:
4 return fp.read()

IOUtil.py

  4. gunicorn.py文件,服务器配置文件,只在本地运行不需要

 1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 """
4 Created on Feb 23, 2020
5 @author: Vrapile
6 """
7 import multiprocessing
8
9 bind = "127.0.0.1:8000"
10 timeout = 30
11 daemon = True
12 workers = multiprocessing.cpu_count() * 2 + 1 #进程数
13 threads = 2 #指定每个进程开启的线程数
14 loglevel = 'info' #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
15 access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' #设置gunicorn访问日志格式,错误日志无法设置
16 # proc_name = 'jlchat'
17 accesslog = "/home/python/mychat/log/gunicorn_access.log" #访问日志文件
18 errorlog = "/home/python/mychat/log/gunicorn_error.log" #错误日志文件

gunicorn.py

  

  5. mychatbot.py文件,启动文件,启动系统运行此文件即可

  1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 """
4 Created on Feb 23, 2020
5 @author: Vrapile
6 """
7
8 import os
9 import json
10 from chatterbot import ChatBot
11 from flask import Flask, request
12 from chatterbot.trainers import ListTrainer
13 from chatterbot.trainers import ChatterBotCorpusTrainer
14 from config.baseConfig import databasePath, import_json_path, export_json_path
15 from tool import ResponseMessage, BaiduUtil
16
17
18 mychatbot = Flask(__name__)
19
20 mychat = ChatBot(
21 "mychat",
22 storage_adapter='chatterbot.storage.SQLStorageAdapter',
23 logic_adapters=[
24 {
25 'import_path': 'chatterbot.logic.BestMatch'
26 },
27 {
28 'import_path': 'chatterbot.logic.BestMatch',
29 'default_response': 'I am sorry, but I do not understand.',
30 'maximum_similarity_threshold': 0.90
31 }
32 ],
33 read_only=True, # 为False会记录对话并录入训练
34 database_uri=databasePath)
35
36
37 @mychatbot.errorhandler(404)
38 def not_found(error):
39 return ResponseMessage.error("Not found !", 404)
40
41
42 @mychatbot.route("/get_answer", methods=['POST', 'GET'])
43 def get_answer():
44 # noinspection PyBroadException
45 try:
46 question = request.args.to_dict().get('question')
47 answer = mychat.get_response(question)
48 except:
49 return ResponseMessage.error("Something Wrong!")
50 finally:
51 return ResponseMessage.ok(str(answer))
52
53
54 @mychatbot.route("/import_qa", methods=["POST"])
55 def import_qa():
56 # noinspection PyBroadException
57 try:
58 question = request.values.get("question")
59 answer = request.values.get("answer")
60 except:
61 return ResponseMessage.error("Something Wrong!")
62 list_trainer = ListTrainer(mychat)
63 list_trainer.train([question, answer])
64 return ResponseMessage.ok("问答对话训练成功!")
65
66
67 @mychatbot.route("/import_jsonfile", methods=["POST"])
68 def import_jsonfile():
69 # noinspection PyBroadException
70 try:
71 jsonfile = request.files['jsonfile']
72 filepath = os.path.join(import_json_path, jsonfile.filename)
73 jsonfile.save(filepath)
74 except:
75 return ResponseMessage.error("Something Wrong!")
76 corpus_trainer = ChatterBotCorpusTrainer(mychat)
77 corpus_trainer.train(filepath)
78 return ResponseMessage.ok("JsonFile训练成功!")
79
80
81 @mychatbot.route("/export_json", methods=['POST', 'GET'])
82 def export_json():
83 corpus_trainer = ChatterBotCorpusTrainer(mychat)
84 corpus_trainer.export_for_training(export_json_path)
85 with open(export_json_path, 'r', encoding='utf8')as fp:
86 json_data = json.load(fp)
87 return ResponseMessage.ok(json_data)
88
89
90 @mychatbot.route("/get_image_content", methods=["POST"])
91 def get_image_content():
92 # noinspection PyBroadException
93 try:
94 imgefile = request.files['imgefile']
95 filepath = os.path.join(import_json_path, imgefile.filename)
96 imgefile.save(filepath)
97 except:
98 return ResponseMessage.error("Something Wrong!")
99 return ResponseMessage.res(BaiduUtil.get_image_content(filepath))
100
101
102 @mychatbot.route("/get_voice_content", methods=["POST"])
103 def get_voice_content():
104 # noinspection PyBroadException
105 try:
106 voicefile = request.files['voicefile']
107 filepath = os.path.join(import_json_path, voicefile.filename)
108 voicefile.save(filepath)
109 except:
110 return ResponseMessage.error("Something Wrong!")
111 return ResponseMessage.res(BaiduUtil.get_voice_content(filepath))
112
113
114 if __name__ == "__main__":
115 mychatbot.run(debug=True)

mychatbot.py

三、本地运行

  1. 打开mychatbot.py,Ctrl+Shift+F10运行此文件,可看控制台是否启动成功,成功情况如下:  

  

  2. Postman请求测试

  

四、服务器部署

  1. 服务器安装python3.8

    说明a:博主保留默认python2.7环境变量为python变量,新装python3.8变量为python3

    说明b:网上有改python2.7位改为python2,新装python3.8改变量为python,看个人喜好

  (1)安装依赖包

    yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel zlib zlib-devel gcc make

  (2)下载python3.8压缩包(最好在/home路径下载,方便后期管理)

    wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz

  (3)解压

    tar -zxvf Python-3.8.0.tgz

  (4)配置安装

    cd Python-3.8.0

    ./configure --prefix=/usr/local/python3

    make && make install

  (5)添加软链接(如果已经有,改-s为-sf强行替换)

    ln -s /usr/local/python3/bin/python3 /usr/bin/python3

    ln -s /usr/local/python3/bin/pip3  /usr/bin/pip3

  2. 服务器安装gunicorn,用于启动python项目

  (1)直接pip安装

    pip3 install gunicorn

  (2)添加软链接

    ln -s /usr/local/python3/bin/gunicorn  /usr/bin/gunicorn

  (3)常用命令介绍

    开启服务:gunicorn -c gunicorn.py filename:flaskname

    查看服务:pstree -ap|grep gunicorn

    重启服务:kill -HUP 99999(99999为上一步查到的主进程ID,上传修改项目文件后,重启即可生效)

    关闭服务:kill -9 99999

  (4)将常用命令添加到/root/.bashrc

    vi /root/.bashrc

    ****添加内容****

    alias cdmychat='cd /home/python/mychat'

    alias psgun='pstree -ap|grep gunicorn'

    alias gunc='gunicorn -c gunicorn.py'

    ****添加内容****

    source /root/.bashrc

  3. 服务器安装mychat项目的依赖

    说明a. 我用的全局环境成功的,最好用网上说的Python配置虚拟环境

    说明b. 我的方式是,服务器运行报错了,缺什么安装什么的,最好用本地生成requirements.txt方式

  (1)安装chatterbot

    命令:pip3 install chatterbot,安装的是1.0.5版本,如果失败可以选择源码安装,源码实时是1.1.0版本(2020/03/06),命令如下:

    git clone https://github.com/gunthercox/ChatterBot.git

    pip install ./ChatterBot

    chatterbot会请求spacy>=2.1,<2.2依赖,这个有时会不成功,博主因升级python出现的问题状况比较复杂,但最终还是解决了,如果失败,可以评论区留言询问

  (2)安装其它依赖,以下是本人服务器安装依赖包情况,不必完全一样或者照搬,能运行就好

    查看所有依赖的命令:pip3 list

    

  (3)运行项目系统

    将文件上传到服务器

    

    启动命令:gunc mychatbot:mychatbot

    查看命令:psgun

    (如果运行报错,查看/home/python/mychat/loggunicorn_error.log报错内容,一般是缺少依赖,对应安装依赖就好)

  (3)nginx把域名转接到gunicorn.py中配置的端口,在nginx.conf添加并重启nginx

    # python的api应用
    server {
      listen 80;
      server_name 你的API域名地址;
        location / {
        root html;
        index index.html index.htm;
        proxy_pass http://127.0.0.1:8000;
      }
    }

    (不用nginx也可以端口地址访问,需阿里云开启8000端口,如果服务器上防火墙开启也要开启8000端口)

  (4)验证是否成功,同上面可以用浏览器或Postman测试

    

五、前端开发

  1. 此部分不做详细介绍只放效果图

  (1)脚手架直接弄个Vue工程

    

  (2)所写API接口可以嵌入其它任何项目,部署后部分效果界面(python源码需相应改动支持)

    (机器聊天,选择机器人,我这里有sqlite3和mongo两种数据库的机器人,每个机器人我分开建立一个数据库)

    

    (图灵聊天,调用Tuling的Api实现)

    

    (Json训练,可直接导入Json文件训练,适合数据库迁移)

    

    (对话管理,可对训练语句进行删改查导出)

    

  (3)VUE访问会有跨域问题,我选择在mychatbot.py中引入flash_cors包,在接口添加:CORS(mychatbot, supports_credentials=True)

     

六、编写接口文档 

  1. 博主自己服务器搭建的showdoc,用起来挺方便的,下面是接口文档样式

    

七、总结

  1. 后端开发的代码较简单,难的环境搭建,我本地环境从Python3.6升级到3.8折腾了一两天,服务器搭建也折腾了两三天,最终证实这个是可以实现的。

  2. chatterbot的主要工作在于训练,核心价值在于取相似问题的算法,深入学习和了解可以自行注入算法。

  3. 作为商用聊天机器人,还需要一个相似问题查看的API接口,目前还在钻研中(场景类似于:输入一个问题,匹配返回最相似的五个问题,选择要问的那个问题)

  4. 上文中的图像识别和语音识别是调用百度的API,如果商用还需考虑费用问题

  5.改动日志,提供我的工作台地址账号密码,可自己查看效果

Python实现聊天机器人接口封装部署的更多相关文章

  1. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  2. 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post

    以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...

  3. Python 简易聊天机器人

    聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...

  4. 情人节用Python智能聊天机器人的实现|制作一个虚拟恋人

    首先项目需要的包 import urllib.request import urllib.parse from tkinter import * import time PS:另外很多人在学习Pyth ...

  5. python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送

    最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容.于是开始了分析思路.博主是采用了多线程群发,因为微信对 ...

  6. 用python玩微信(聊天机器人,好友信息统计)

    1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...

  7. QQ 聊天机器人小薇 2.1.0 发布!

    本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...

  8. 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享

    福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...

  9. 【python】使用python十分钟创建个人聊天机器人教程

    以青云客和图灵机器人接口示范python创建个人聊天机器人教程 一.以青云客聊天机器人为例示范get请求 官方网址:http://api.qingyunke.com/ 1.接入指引 请求地址 http ...

  10. Python进阶开发之网络编程,socket实现在线聊天机器人

    系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战 ...

随机推荐

  1. go语言中的数据类型

    数据类型可分为四类 基础类型 数字.字符串和布尔型 复合类型 数组.结构体 引用类型 指针.切片.map.函数.通道channel 接口类型 interface

  2. python模块Configparser读取 ini(cfg,txt)等配置文件

    一个ini文件的组成: 一个ini文件是由多个section组成,每个section中以key=vlaue形式存储数据: 示例 # 安装 pip install ConfigParser # 1.导包 ...

  3. 【C++ OOP 01】封装

    封装 封装的意义 封装是C++面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物 将属性和行为加以权限控制 封装意义一 ​ 在设计类的时候,属性和行为写在一起,表现事物 语 ...

  4. 如何在矩池云上运行 AI 图像编辑工具 DragGAN

    5 月,DragGAN 横空出世,在开源代码尚未公布前,就在Github上斩获近 20000 Star,彼时,页面上只有效果图和一句"Code will be released in Jun ...

  5. 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践

    作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...

  6. 获取一段时间内,以月/季度为单位,第N天在各个月/季度是几几年几月几号

    /** * 获取一段时间内(可跨年),以季度为单位,第N天在各个季度是几月几号 * @param $sTime 时间戳 * @param $eTime 时间戳 * @param $number 第N天 ...

  7. Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)

    Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能.然而, ...

  8. vscode 翻译插件推荐 Easy Translator,只因为有音标,和位置好

    vscode 翻译插件推荐 Easy Translator,只因为有音标,和位置好

  9. c语言中的指针,数组和结构体结合的一个经典案例

    一 你真正懂了C语言了吗? 很多人刚把c语言用了两年,就以为很懂,等遇到稍微深层次一点的问题,就卡住了.这里,有一个问题,可以考察你对这三者理解如何. 二 一个例子: #include <std ...

  10. Linux Daemon & 单例模式 设计与实现

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...