基于Python+AIML+Tornado的智能聊天机器人(NLP+深度学习)含全部工程源码+语料库 适合个人二次开发
目录
- 前言
- 总体设计
- 系统整体结构图
- 系统流程图
- 运行环境
- Python 环境
- Tornado 环境
- 模块实现
- 1. 前端
- 2. 后端
- 3. 语料库
- 4. 系统测试
- 其它资料下载

前言
本项目旨在利用AIML技术构建一个聊天机器人,实现用户通过聊天界面与机器人交互的功能。通过提供的工程源代码,用户可以轻松地进行二次开发,例如使用网页与机器人进行交互,实现智能问答等。通过网页与机器人的交互,您可以实现智能问答、情感分析等多种功能,为您的应用场景带来更多可能性。快来一起探索AI技术的无限魅力吧!
当然针对现在最火爆的ChatGPT等通用大语言模型,伙伴们可以直接将其应用在模块实现第2部分,其它详细的接口使用操作,大家可以关注我博客的其它关于ChatGPT接口使用的说明。
总体设计
本部分主要包括系统整体结构图和系统流程图。
系统整体结构图
系统整体结构如图所示。

系统流程图
AIML系统流程如下:
第一步:系统初始化
AIML系统在启动时,首先根据配置文件进行系统的初始化操作,把需要替换的词串(如把it’s替换为itis)、自身的相关信息(如名字、性别等)、人称转换信息以及此前的对话情景变量读入系统,并把AIML文件内容(即知识库)以树的结构形式加载到内存当中,形成内存知识树,这样当系统在响应用户输入的问句时,可直接在内存树中进行推理,提高了响应速度。加载完毕之后,等待用户输入问句。
第二步:接收用户输入,进行问句规范化处理
当AIML解析器接收到一行用户的输入后,首先把输入的文字分成单独的句子,进行问句规范化处理,分析当前句子中是否包含需要替换的字符串,如果有,则替换之。例如把问句中出现的“you’ve”替换为“youhave”,“I’m”替换为“Iam”等等。问句规范化处理完以后,以规范问句到内存知识树中查询推理答案。
第三步:问句查询推理
这一过程是AIML的核心部分,将规范化处理后的问句与内存知识树中的模式进行匹配,寻找最佳匹配结果,找到之后,读出该匹配模式对应的模板信息,进行下一步处理。
第四步:模板处理
也就是答案的后处理,模板中可能包含一些特殊标记需要处理,如读出机器人名字标记所代表的实际名称,还原星号部分所代表的内容,如果包含跳转标记,还需要在内存知识树中以跳转部分的内容做进一步的推理。模板处理完后返回用户结果,等待用户输入新问句。
系统流程如图所示:

运行环境
本部分包括 Python 环境、Tornado 环境。
Python 环境
需要 Python 2.7,下载地址:https://www.python.org/downloads/windows/。
Tornado 环境
Tornado 是使用 Python 编写的一个强大的、可扩展的 Web 服务器。
模块实现
本项目主要包括 3 个模块,前端、后端、语料库,下面分别给出各模块的功能介绍及相关代码。
1. 前端
前端框架地是采用 Bootstrap 框架。Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它在 jQuery 的基础上进行了更为个性化和人性化的完善,形成一套自己独有的网站风格,并兼容大部分 jQuery 插件。Bootstrap 简洁灵活,使得 Web 开发更加快捷。其最大的优势是响应式布局,使得开发者
可以方便的让网页无论在台式机、平板设备、手机上都获得最佳的体验。
<!DOCTYPE html>
<html>
<head><!-- <meta charset="utf-8"> --><title>ChatBotx</title><!-- 新 Bootstrap 核心 CSS 文件 --><link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><!-- jQuery文件。务必在bootstrap.min.js 之前引入 --><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><!-- 最新的 Bootstrap 核心 JavaScript 文件 --><script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script><style type="text/css">.top-margin-20{margin-top: 20px; //设置上边距}#result_table,#result_table thead th{text-align: center;}#result_table .td-width-40{width: 40%;}</style><script type="text/javascript">var AppDomain = 'http://localhost:8000/'$(document).ready(function(){$("#btn_sub").click(function(){var user = 'XXX';var resUser = 'Bot';var request_txt = $("#txt_sub").val();setView(user,request_txt);$.ajax({type: 'post',url: AppDomain+'chat',async: true,//异步dataType: 'json',// contentType: "application/x-www-form-urlencoded; charset=utf-8", data: ({"msg":encodeURI(request_txt)}),success: function (data){console.log(JSON.stringify(data));if (data.is_success == true) {setView(resUser,data.message);}},error: function (data){console.log(JSON.stringify(data));}});});});function setView(user,text){var subTxt = user + " "+new Date().toLocaleTimeString() +'\n·'+ decodeURI(text);$("#txt_view").val($("#txt_view").val()+'\n\n'+subTxt);var scrollTop = $("#txt_view")[0].scrollHeight; $("#txt_view").scrollTop(scrollTop); }</script>
</head>
<body class="container"><header class="row"><header class="row"><a href="/" class="col-md-2" style="font-family: SimHei;font-size: 20px;text-align:center;margin-top: 30px;"><span class="glyphicon glyphicon-home"></span>Home</a><font class="col-md-4 col-md-offset-2" style="font-family: SimHei;font-size: 30px;text-align:center;margin-top: 30px;">ChatBot</font></header></header><hr><article class="row"><section class="col-md-10 col-md-offset-1" style="border:border:solid #7FFFD4 1px;padding: 0; background-color: #FFDEAD;"><span class="glyphicon glyphicon-user"></span> User: XXX </section><section class="col-md-10 col-md-offset-1 row" style="border:solid #7FFFD4 1px;padding:0"><section class="col-md-9" style="height: 400px;"><section class="row" style="height: 270px;"><textarea class="form-control" style="width:100%;height: 100%;resize: none;overflow-x: none;overflow-y: scroll;background-color:antiquewhite" readonly="true" id="txt_view"></textarea></section><section class="row" style="height: 130px;border-top:solid #7FFFD4 1px; "><textarea class="form-control" style="overflow-y: scroll;overflow-x: none;resize: none;width: 100%;height:70%;border: #fff;background-color:rgb(107, 170, 189)" id="txt_sub"></textarea><button class="btn btn-primary" style="float: right;margin: 0 5px 0 0;background-color:gray" id="btn_sub">Submit</button></section></section><section class="col-md-3" style="height: 400px;border-left: solid #7FFFD4 1px;"></section></section></article>
</body>
</html>
2. 后端
后端我们采用的是 tornado 架构,之所以使用 tornado 是因为 Tornado 是使用 Python编写的一个强大的、可扩展的 Web 服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。Tornado 和主流 Web服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
#!/usr/bin/env python# -*- coding: utf-8 -*-import os.path
import tornado.auth
import tornado.escape
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, optionsimport os
import aimlos.chdir(r'C:\Users\clys\Desktop\AIML\example1')
k = aiml.Kernel()
k.learn("cn-startup.xml")
k.respond("load aiml cn")define('port', default=8000, help='run on the given port', type=int)class Application(tornado.web.Application):def __init__(self):handlers = [ #handlers,它告诉 Tornado 应该用哪个类来响应请求。(r'/', MainHandler),(r'/chat', ChatHandler),]settings = dict(template_path=os.path.join(os.path.dirname(__file__), 'templates'), #该句作是告诉 tornado 在哪里找模板文件static_path=os.path.join(os.path.dirname(__file__), 'static'),debug=True, #设置调制模式,默认为 false)tornado.web.Application.__init__(self, handlers, **settings)class MainHandler(tornado.web.RequestHandler):def get(self): #get 的作用是渲染界面self.render('index.html') #发送 index.HTML 文件给浏览器def post(self): #post 的作用是获取参数,并分析,返回结果result = {'is_success': True,'message': '123'}respon_json = tornado.escape.json_encode(result)self.write(str(respon_json))def put(self):respon_json = tornado.escape.json_encode("{'name':'XXX','age':123}")#tornado.escape.json_encode(result)的作用是:json 对指定的 python 对象进行编码self.write(respon_json)class ChatHandler(tornado.web.RequestHandler): # 定 义 一 个tornado.web.RequestHandler 的子类为 ChatHandlerdef get(self):self.render('chat.html')def post(self):try:message = self.get_argument('msg', None)print(str(message))result = {'is_success': True,'message': str(k.respond(message))}print(str(result))respon_json = tornado.escape.json_encode(result)self.write(respon_json)except Exception as ex:repr(ex)print(str(ex))result = {'is_success': False,'message': ''}self.write(str(result))def main():tornado.options.parse_command_line()http_server = tornado.httpserver.HTTPServer(Application())http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()if __name__ == '__main__':print('HTTP server starting ...')main()
3. 语料库
1)标签解释:
<aiml>:定义一个 aiml 文件的开始与结束
<category>:定义一个知识的单元
<pattern>:定义一个模板,来匹配用户可能的输入
<template>:定义根据用户的输入需要返回的回答
因此表现在聊天界面的效果就是:
user:你好
bot:嗨,好久不见
user:你是谁
bot:我是灰太狼 1234
但是光是以上如此简单的模式,要适应大量的人类语言与句式,显得异常笨重,aiml 提供了许多其他 tag 来帮助人们构建更有效更灵活的问答模式。
代码示例:
<?xml version="1.0" encoding="UTF-8"?><aiml version="1.0"><meta name="author" content="Andelf"/>
<meta name="language" content="zh"/><category>
<pattern>登录</pattern>
<template>
你的用户名是?
</template>
</category><category>
<pattern>*</pattern>
<template><condition><li name="password" value="123456">密码正确, <get name="username" />已通过验证.</li><li name="password" value="">请登陆.</li></condition>
</template>
</category><category>
<pattern>*</pattern>
<that>你的用户名是</that>
<template>
<think><set name="username"><star/></set></think>
你的密码是?
</template>
</category><category>
<pattern>*</pattern>
<that>你的密码是</that>
<template>
<think><set name="password"><formal><star/></formal></set></think>
谢谢.
</template>
</category></aiml>
2)在正式构建聊天机器人之前,需要创建一个名为后缀为.xml 的启动文件,用于作为加载AIML 文件的主入口点。
代码示例:
<aiml version="1.0"><category>
<pattern>LOAD AIML CN</pattern>
<template><!-- Template是模式的响应 --><!-- 这里学习一个aiml文件 -->n<learn>zhoudk.aiml</learn><learn>corpus1000.aiml</learn><learn>maimeng.aiml</learn><learn>rude.aiml</learn><learn>sex.aiml</learn><learn>shengji.aiml</learn><!-- 你可以在这里添加更多的aiml文件 --><!--<learn>chat.aiml</learn>-->
</template>
</category></aiml>
4. 系统测试
1) 运行后端服务器
运行后端服务器界面如图所示:

2) 后台运行结果
在浏览器中输入以下地址
http://localhost:8000/
聊天界面如图所示:

后台运行结果如图所示:

其它资料下载
如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。
相关文章:
基于Python+AIML+Tornado的智能聊天机器人(NLP+深度学习)含全部工程源码+语料库 适合个人二次开发
目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Tornado 环境 模块实现1. 前端2. 后端3. 语料库4. 系统测试 其它资料下载 前言 本项目旨在利用AIML技术构建一个聊天机器人,实现用户通过聊天界面与机器人交互的功能。通过提供的工程源代码…...
算法Day15 | 层序遍历,102,107,199,637,429,515,116,117,104,111,226,101
Day15 层序遍历102.二叉树的层序遍历107.二叉树的层次遍历 II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度 226…...
Prometheus+Grafana学习(十一)安装使用pushgateway
Pushgateway允许短暂和批量作业将其指标暴露给 Prometheus。由于这些工作的生命周期可能不足够长,不能够存在足够的时间以让 Prometheus 抓取它们的指标。Pushgateway 允许它们可以将其指标推送到 Pushgateway,然后 Pushgateway 再将这些指标暴露给 Prom…...
深入理解C/C++预处理器指令#pragma once以及与ifndef的比较
#pragma once用法总结 为了防止重复引用造成二义性 在C/C中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式 第一种是#ifndef指令防止代码块重复引用,比如说 #ifndef _CODE_BLOCK #define _CODE_BLO…...
git 环境配置 + gitee拉取代码
好嘛 配环境的时候 老是忘记这个命令行 干脆自己写一个记录一下 也不用搜了 1.先从git官网下载git 安装 2.然后从gitee拉取代码的时候提示 这是因为换了新电脑没有加入新的公钥啦 哎 所以老是记不住命令行 first : git config --global user.name “Your Name” …...
港联证券|港股拥抱特专科技企业 内资券商“修炼内功”蓄势而为
港股市场新一轮改革举措渐次落地。特别是港交所推出特专科技公司上市机制,吸引符合资格的科技企业申请赴港上市,成为这一轮港股市场改革的“重头戏”。 作为香港资本市场的重要参与者,内资券商立足香港、背靠内地、辐射全球,走出一…...
多项创新技术加持,实现零COGS的Microsoft Editor语法检查器
编者按:Microsoft Editor 是一款人工智能写作辅助工具,其中的语法检查器(grammar checker)功能不仅可以帮助不同水平、领域的用户在写作过程中检查语法错误,还可以对错误进行解释并给出正确的修改建议。神经语法检查器…...
Python编程环境搭建:Windows中如何安装Python
在 Windows 上安装 Python 和安装普通软件一样简单,下载安装包以后猛击“下一步”即可。 Python 安装包下载地址:https://www.python.org/downloads/ 打开该链接,可以看到有两个版本的 Python,分别是 Python 3.x 和 Python 2.x&…...
Sui Builder House首尔站倒计时!
Sui主网上线后的第一场Builder House活动即将在韩国首尔举行,同期将举办首场线下面对面的黑客松。活动历时两天,将为与会者提供独特的学习、交流和娱乐的机会。活动详情请查看:Sui Builder House首尔站|主网上线后首次亮相。 Sui…...
Java设计模式-状态模式
简介 在软件开发领域,设计模式是一组经过验证的、被广泛接受的解决问题的方案。其中之一是状态模式,它提供了一种优雅的方式来管理对象的不同状态。 状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为。状态模式将对…...
智慧社区用什么技术开发
智慧社区是指利用信息技术和先进的管理理念,将社区内的各种公共服务进行整合和优化,提高社区居民的生活品质和社区管理的效率。为了实现智慧社区的建设,需要采用多种技术,包括但不限于以下几种: 1.物联网技术…...
多线程 线程池饱和策略
RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。 这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。 在JDK 1…...
进程间通信之信号
进程间通信之信号 1. 信号2. 信号由谁产生?3. 有哪些信号4. 信号的安装5. 信号的发送1) 使用kill函数2)使用alarm函数3) 使用raise6.发送多个信号7. 信号集1. 信号 什么是信号? 信号是给程序提供一种可以处理异步事件的方法,它利用软件中断来实现。不能自定义信号,所有信号…...
二分查找三道题
二分查找 两种写法:左闭右闭[left,right]、左闭右开[left,right) 主要有几点不同:1. right是从num.length开始还是从num.length-1开始。2.left<还是<right。3.rightmid还是mid1 左闭右闭写法: public int search(int[] nums, int targ…...
MyBatis 框架
MyBatis 框架 MyBatis 简介搭建 MyBatis 开发环境核心配置文件详解mapper 映射文件(实现增删改查)MyBatis获取参数值的两种方式MyBatis的各种查询功能特殊SQL的执行自定义映射resultMapresultMap 字段和属性的映射多对一映射处理一对多映射处理 动态SQLM…...
【C++】虚表和虚基表到底有哪些区别?
虚表和虚基表 虚表虚基表虚拟继承和虚函数都存在时的对象模型 虚表 我们知道,如果类中声明了的方法是用virtual进行修饰的,则说明当前这个方法要作为虚函数,而虚函数的存储和普通函数的存储是有区别的 当有虚函数声明时,编译器会…...
剑指 Offer 04. 二维数组中的查找解题思路
文章目录 标题解题思路优化 标题 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整…...
冯诺依曼体系结构详解
一.冯诺伊曼体系结构的概念: 约翰冯诺依曼(John von Neumann,1903.1.28-1957.2.8),美籍匈牙利数学家,计算机科学家,物理学家。是20世纪最重要的数学家之一,后来被称为计算机之父。 后…...
ISO证书“带标”与“不带标”的区别是什么?
ISO9001质量管理体系认证是企业产品获得“通行绿卡”的最直接最有效的途径。 通过认证在打破贸易壁垒,提高产品知名度,降低生产成本,提高经济效益,维护消费者权益,减少重复审核负担等方面的作用越来越为企业界所共知。…...
RocketMQ 领域模型概述
本文为您介绍 Apache RocketMQ 的领域模型。 Apache RocketMQ 是一款典型的分布式架构下的中间件产品,使用异步通信方式和发布订阅的消息传输模型。通信方式和传输模型的具体说明,请参见下文通信方式介绍和消息传输模型介绍。 Apache RocketMQ 产品具备…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
