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源码)相关推荐

  1. 如何用tf2.0训练中文聊天机器人chatbot

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一个可以自己进行训练的中文聊天机器人, 根据自己的语料训练出自己想要的聊天机器人,可以用于智能 ...

  2. VC++6.0+MFC网络聊天工具(含源码)

    毕业一年多了,晒晒自己做的毕业设计,VC++6.0+MFC完成,所有代码都是自己一步步编写完成,当初也没有什么经验,全靠网上找资料试验,大家有意见轻拍. 功能包括: 0.普通聊天(文字.图片) 1.聊 ...

  3. python:实现中文转英文(附完整源码)

    python:实现中文转英文 import requestsimport jsonwhile True:string=input("请输入待翻译的内容:")#百度翻译的网址url= ...

  4. 2023 人工智能在线聊天机器人网页HTML源码

    测试了一下就是对接的外部接口,无加密有能力的可以二开.使用教程,上传主机,服务器后解压使用,当然了,电脑解压后点击index.html也能用.

  5. Python AIML搭建聊天机器人(附遇到的问题及解决)

    Python AIML搭建聊天机器人(附遇到的问题及解决) AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理 ...

  6. 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划

    作者 | 无名之辈FTER 责编 | 夕颜 出品 | 程序人生(ID:coder_life) 本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展, ...

  7. 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 ...

  8. Rasa 中文聊天机器人项目

    Rasa 中文聊天机器人项目 RASA 开发中文指南系列博文: Rasa中文聊天机器人开发指南(1):入门篇 Rasa中文聊天机器人开发指南(2):NLU篇 Rasa中文聊天机器人开发指南(3):Co ...

  9. 在 Linux 上搭建 Hubot 聊天机器人服务器

    在 Linux 上搭建 Hubot 聊天机器人服务器 1. 先确定安装了 Node.js 如果还没安装Node.js,就先安装Node.js.Node.js是绿色软件,只要解压安装包即可.这里假设已经 ...

  10. 基于seq2seq的中文聊天机器人(一)

    系列文章 1.基于seq2seq的中文聊天机器人(一) 2.基于seq2seq的中文聊天机器人(二) 3.基于seq2seq的中文聊天机器人(三) 1 背景介绍 聊天机器人的研究可以追溯到上个世纪五十 ...

最新文章

  1. RequireJS 主入口加载模块经常会加载失败的问题
  2. Python学习笔记——time模块和datatime模块【时间处理】
  3. WP7应用开发笔记(3) 界面设计
  4. ASP.NET Core应用程序的参数配置及使用
  5. android手机 scala环境,在Android中使用Scala中的Java常量
  6. underscore.js 源码分析5 基础函数和each函数的使用
  7. 数据库中的DbUtils
  8. Codeforces Round #223 (Div. 2): E. Sereja and Brackets(线段树)
  9. 二十三、Java异常捕获与处理
  10. 2022-2028全球气动测试探针行业调研及趋势分析报告
  11. MATPOWER快速上手及应用实例
  12. tp交换机管理页面_tplink交换机设置步骤使用方法
  13. 详解win10装回win7不开机的原因和解决方法
  14. CorelDRAW教程大全集
  15. 苹果7支持快充吗_苹果支持20W快充了,什么20W还叫快充,国内都到120W了
  16. Android高手笔记 - IO优化
  17. offer来了java面试百度云版,精心整理
  18. 结构型模式--Proxy代理模式
  19. PPC修改注册表大全 (注册表必看)(转载)
  20. git 命令 简单介绍

热门文章

  1. 湖南大学计算机学院唐汝英,王宪思-教师简历(湖南大学物理与微电子科学学院)...
  2. 闭眼推荐,9 个不能错过的机器学习数据集
  3. cesium.js获取经度、纬度、高度
  4. 第十一周项目一·项目二----定义点类
  5. (电脑硬件)台式机主板音频端口功能详解
  6. MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限
  7. 2019年四月计算机语言排名,2019程序语言排行榜_编程语言排行榜2019年4月 TIOBE编程语言排行榜2019年最...
  8. 实战十:基于lstm+crf实现电子病历实体信息识别 完整的代码+数据集+说明 毕设
  9. 【LeetCode 134】 Gas Station
  10. 【接口自动化测试基础之路 09】allure报告定制