RASA2.0 搭建中文聊天机器人(附gitee源码)
RASA2.0搭建中文聊天机器人
环境搭建
# 优先安装这几个python包,后面缺什么补充什么
rasa==2.0.0
rasa-sdk==2.4.1
tensorflow==2.3.2
Flask==1.1.2
开始搭建
初始化项目
# 命令创建rasa项目所需的所有文件,并根据一些示例数据训练一个简单的机器人 rasa init
初始化后会创建以下文件,介绍几个重要的文件,当然这些文件结构你也可以自己调整
文件名 作用 config.yml 配置NLU和Core的文件 /data/nlu.yml NLU的训练语句,意图加包含意图的话术 /data/stories.yml 对话的故事,可以理解为剧本 domain.yml 作用域,里面注册你定义的意图,对话模板,自定义action,槽位等 endpoints.yml action的端口,action对外暴露的接口配置文件 /models/xxxx.tar,gz 训练的模型 我项目的目录结构是这样的,可以作为参考
. ├── actions │ ├── action_kn_test.py │ ├── action_trademark_analy.py │ ├── action_trademark_explain.py │ ├── action_trademark_keyword.py │ ├── action_weather_query.py │ ├── __init__.py │ └── __pycache__ │ ├── action_kn_test.cpython-36.pyc │ ├── action_trademark_analy.cpython-36.pyc │ ├── action_trademark_explain.cpython-36.pyc │ ├── action_trademark_keyword.cpython-36.pyc │ ├── action_weather_query.cpython-36.pyc │ └── __init__.cpython-36.pyc ├── App │ ├── def_func.py │ ├── def_settings.py │ ├── ext.py │ ├── __init__.py │ ├── models.py │ ├── __pycache__ │ │ ├── ext.cpython-36.pyc │ │ ├── __init__.cpython-36.pyc │ │ └── views.cpython-36.pyc │ ├── settings.py │ ├── static │ │ ├── css │ │ │ └── style2.css │ │ ├── images │ │ │ ├── ai.png │ │ └── js │ │ ├── chat.js │ │ └── jquery-3.3.1.min.js │ ├── templates │ │ └── chat.html │ └── views.py ├── configs │ ├── config.yml │ ├── credentials.yml │ ├── domain.yml │ ├── endpoints.yml │ ├── zh_jieba_mitie_embeddings_config.yml │ └── zh_jieba_supervised_embeddings_config.yml ├── data │ ├── dict │ │ ├── cityname.txt │ │ └── userdict.txt │ ├── nlu │ │ └── nlu.yml │ ├── rules.yml │ ├── stories │ │ ├── stories.yml │ │ └── story1.md │ └── total_word_feature_extractor_zh.dat ├── models │ └── 20210420-153935.tar.gz ├── __pycache__ ├── server.py ├── shell_diectory │ ├── run_shell │ └── train_shell
开始构建聊天机器人的第一个例子(查天气)
定义你的NLU
- intent: query_weatherexamples: |- 我想查询天气- 我想查询[广州]{"entity":"address"}的天气- [明天]{"entity":"datetime"}天气怎么样?- 我想查询[明天]{"entity":"datetime"}[深圳]{"entity":"address"}的天气
准备地名词库
定义你stories剧本
## query_weather(天气查询) * query_weather- weather_form- active_loop{"name":"weather_form"}
在domain.yml 注册,注册你定义的意图,实体,槽位,问话模板,表单,自定义的action等
version: "2.0"intents:- greet- goodbye- affirm- deny- mood_great- mood_unhappy- bot_challenge- query_weather # 意图查天气entities:- kn_question_num- datetime # 实体时间- address # 实体地址actions:- action_testslots:kn_question_num:type: textdatetime:type: text # 你需要填入的槽位时间address:type: text # 你需要填入的槽位地址requested_slot:type: unfeaturizedresponses:utter_greet:- text: "Hey! How are you?"utter_cheer_up:- text: "Here is something to cheer you up:"image: "https://i.imgur.com/nGF1K8f.jpg"utter_did_that_help:- text: "Did that help you?"utter_happy:- text: "Great, carry on!"utter_goodbye:- text: "Bye"utter_iamabot:- text: "I am a bot, powered by Rasa."utter_ask_datetime:- text: "请问你要查询什么时候的天气?" # 自动询问模板utter_ask_address:- text: "请问你要查询哪里的天气?" #自动询问模板forms:weather_form: {} #多轮问话表单session_config:session_expiration_time: 60carry_over_slots_to_new_session: true
自定义action.py
‘’‘ @author: 小帆芽芽 date: 2021/04/25 ‘’‘ from rasa_sdk.types import DomainDict from typing import Dict, Text, Any, List, Union from flask import jsonify from rasa_sdk import Tracker, Action from rasa_sdk.events import UserUtteranceReverted, Restarted, SlotSet, EventType from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.forms import FormAction # from actions import ChatApis # from actions.WeatherApis import get_weather_by_day from requests import (ConnectionError,HTTPError,TooManyRedirects,Timeout ) # from test.qachat import get_qa from rasa_sdk import ActionExecutionRejection from rasa_sdk.events import SlotSet, AllSlotsReset from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.forms import FormAction, REQUESTED_SLOT import requests, random, math import re import json # import jieba import logginglogger = logging.getLogger(__name__)# 查询天气 class QueryWeather(FormAction):'''心知天气API'''def __init__(self):super().__init__()# 天气查询私钥self.KEY = '你的私钥'self.LOCATION = 'beijing' # 所查询的位置,可以使用城市拼音、v3 ID、经纬度等self.url = 'https://api.seniverse.com/v3/weather/daily.json' # API URL,可替换为其他 URLself.UNIT = 'c' # 单位self.LANGUAGE = 'zh-Hans' # 查询结果的返回语言self.data={'key': self.KEY,'location': self.LOCATION,'language': self.LANGUAGE,'unit': self.UNIT,'start': 0,'days': 10}# 0 代表今天,1 代表明天,2代表后天self.num = 0def name(self) -> Text:return "weather_form"@staticmethoddef required_slots(tracker):return ['address','datetime']# 槽值映射,不管用户说什么都将填入槽中def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict[Text, Any]]]]:return {'address':[self.from_text()],'datetime':[self.from_text()]}# 槽值验证def validate_address(self,slot_value, dispatcher, tracker, domain):# list=['北京','上海','深圳','广州']path = './data/dict/cityname.txt'd_ = [i.strip() for i in open(path, 'r').readlines()]# if slot_value in list:if slot_value in d_:return {"address":slot_value}else:dispatcher.utter_message('您输入的不是地名哟')return {"address":None}# 槽值验证def validate_datetime(self,slot_value, dispatcher, tracker, domain):d_list = ['今天','明天','后天']if slot_value in d_list:# if slot_value in d_:return {"datetime":slot_value}else:dispatcher.utter_message('暂不支持查询 {} 的天气'.format(slot_value))return {"datetime":None}def submit(self,dispatcher, tracker, domain):date = tracker.get_slot('datetime')address = tracker.get_slot('address')self.judge_time(date)text_day, text_night, high, low, wind_direction, humidity, wind_speed, wind_scale,date_ = self.get_weather(address)s='{}{}({})的天气情况是:白天{},晚上{}.当天最高温度是{}摄氏度,最低温度是{}摄氏度.风向{},风速{},风力等级为{},空气湿度为{}%'.format(address,date,date_, text_day,text_night,high,low,wind_direction,wind_speed,wind_scale,humidity)dispatcher.utter_message('小娜为您查询到:')dispatcher.utter_message(s)# return [AllSlotsReset()]return [Restarted()]def judge_time(self,date):if date == '今天':self.num = 0elif date == '明天':self.num = 1elif date == '后天':self.num = 2def get_weather(self,address):self.LOCATION = addressstr_ = requests.get(url=self.url,params=self.data,timeout=2).textdic = json.loads(str_)print(dic)# 白天天气text_day = dic['results'][0]['daily'][self.num]['text_day']# 夜晚天气text_night = dic['results'][0]['daily'][self.num]['text_night']# 最高温度high = dic['results'][0]['daily'][self.num]['high']# 最低温度low = dic['results'][0]['daily'][self.num]['low']# 风向wind_direction = dic['results'][0]['daily'][self.num]['wind_direction']# 湿度(百分比)humidity = dic['results'][0]['daily'][self.num]['humidity']# 风速wind_speed = dic['results'][0]['daily'][self.num]['wind_speed']# 风力等级wind_scale = dic['results'][0]['daily'][self.num]['wind_scale']# 日期date_ = dic['results'][0]['daily'][self.num]['date']return text_day,text_night,high,low,wind_direction,humidity,wind_speed,wind_scale,date_
采用flask外部调用接口
''' @author:小帆芽芽 @date:2021/04/25 ''' import json import reimport requests from flask import Blueprint, render_template, requestblue = Blueprint('rasa', __name__)REQUEST_URL = "http://localhost:5005/webhooks/rest/webhook" HEADERS = {'Content-Type': 'application/json; charset=utf-8'}def init_route(app):app.register_blueprint(blue)@blue.route('/', methods=['GET', 'POST']) def test():# return 'this a test page', 200return render_template('chat.html')@blue.route('/chat',methods=['GET']) def chat():data=request.args.to_dict()message=data['message']if message:answer = rasaresponse('xiaofangyaya',message)return answerdef rasaresponse(user,msg):requestDict={'sender':user,'message':msg}rsp=requests.post(REQUEST_URL, data=json.dumps(requestDict),headers=HEADERS)# content=rsp.text.encode('utf-8').decode("unicode-escape")if rsp.status_code == 200:rsp_json=json.loads(rsp.text.encode())content_text = ''if len(rsp_json):# print(rsp_json)for i in range(len(rsp_json)):# txt_=rsp_json[i]['text']txt_=rsp_json[i].get('text')print('rasa返回内容是---------->{}'.format(txt_))if txt_:content_text=content_text+txt_else:content_text=content_text + '\n' + rsp_json[i]['image']return content_textelse:return '哎呀,这个小娜也不懂呢~~~'else:return '返回错误,请重新输入问话。'
运行rasa,依次执行以下命令
# 启动服务 # 1. 启动rasa server python -m rasa run --port 5005 -m models/20210420-153935.tar.gz --endpoints configs/endpoints.yml --credentials configs/credentials.yml --debug # 2. 启动action server python -m rasa run actions --port 5055 --actions actions --debug # 3. 启动server.py python server.py
页面测试
- 我的源码地址:
https://gitee.com/menfeng/rasa-weather-edition
希望点赞关注支持哦!!!!
后期还有大波福利发送
RASA2.0 搭建中文聊天机器人(附gitee源码)相关推荐
- 如何用tf2.0训练中文聊天机器人chatbot
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 一个可以自己进行训练的中文聊天机器人, 根据自己的语料训练出自己想要的聊天机器人,可以用于智能 ...
- VC++6.0+MFC网络聊天工具(含源码)
毕业一年多了,晒晒自己做的毕业设计,VC++6.0+MFC完成,所有代码都是自己一步步编写完成,当初也没有什么经验,全靠网上找资料试验,大家有意见轻拍. 功能包括: 0.普通聊天(文字.图片) 1.聊 ...
- python:实现中文转英文(附完整源码)
python:实现中文转英文 import requestsimport jsonwhile True:string=input("请输入待翻译的内容:")#百度翻译的网址url= ...
- 2023 人工智能在线聊天机器人网页HTML源码
测试了一下就是对接的外部接口,无加密有能力的可以二开.使用教程,上传主机,服务器后解压使用,当然了,电脑解压后点击index.html也能用.
- Python AIML搭建聊天机器人(附遇到的问题及解决)
Python AIML搭建聊天机器人(附遇到的问题及解决) AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理 ...
- 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划
作者 | 无名之辈FTER 责编 | 夕颜 出品 | 程序人生(ID:coder_life) 本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展, ...
- Rasa中文聊天机器人开发指南(3):Core篇
文章目录 1. 对话管理 1.1 多轮对话 1.2 对话管理 2. Rasa Core 2.1 Stories 2.2 Domain 2.3 Responses 2.4 Actions 2.5 Pol ...
- Rasa 中文聊天机器人项目
Rasa 中文聊天机器人项目 RASA 开发中文指南系列博文: Rasa中文聊天机器人开发指南(1):入门篇 Rasa中文聊天机器人开发指南(2):NLU篇 Rasa中文聊天机器人开发指南(3):Co ...
- 在 Linux 上搭建 Hubot 聊天机器人服务器
在 Linux 上搭建 Hubot 聊天机器人服务器 1. 先确定安装了 Node.js 如果还没安装Node.js,就先安装Node.js.Node.js是绿色软件,只要解压安装包即可.这里假设已经 ...
- 基于seq2seq的中文聊天机器人(一)
系列文章 1.基于seq2seq的中文聊天机器人(一) 2.基于seq2seq的中文聊天机器人(二) 3.基于seq2seq的中文聊天机器人(三) 1 背景介绍 聊天机器人的研究可以追溯到上个世纪五十 ...
最新文章
- RequireJS 主入口加载模块经常会加载失败的问题
- Python学习笔记——time模块和datatime模块【时间处理】
- WP7应用开发笔记(3) 界面设计
- ASP.NET Core应用程序的参数配置及使用
- android手机 scala环境,在Android中使用Scala中的Java常量
- underscore.js 源码分析5 基础函数和each函数的使用
- 数据库中的DbUtils
- Codeforces Round #223 (Div. 2): E. Sereja and Brackets(线段树)
- 二十三、Java异常捕获与处理
- 2022-2028全球气动测试探针行业调研及趋势分析报告
- MATPOWER快速上手及应用实例
- tp交换机管理页面_tplink交换机设置步骤使用方法
- 详解win10装回win7不开机的原因和解决方法
- CorelDRAW教程大全集
- 苹果7支持快充吗_苹果支持20W快充了,什么20W还叫快充,国内都到120W了
- Android高手笔记 - IO优化
- offer来了java面试百度云版,精心整理
- 结构型模式--Proxy代理模式
- PPC修改注册表大全 (注册表必看)(转载)
- git 命令 简单介绍
热门文章
- 湖南大学计算机学院唐汝英,王宪思-教师简历(湖南大学物理与微电子科学学院)...
- 闭眼推荐,9 个不能错过的机器学习数据集
- cesium.js获取经度、纬度、高度
- 第十一周项目一·项目二----定义点类
- (电脑硬件)台式机主板音频端口功能详解
- MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限
- 2019年四月计算机语言排名,2019程序语言排行榜_编程语言排行榜2019年4月 TIOBE编程语言排行榜2019年最...
- 实战十:基于lstm+crf实现电子病历实体信息识别 完整的代码+数据集+说明 毕设
- 【LeetCode 134】 Gas Station
- 【接口自动化测试基础之路 09】allure报告定制