《AI企业级知识库》-rasa爆改中文版本-实战!

news2025/3/1 16:52:55

阿丹:

        之前有同学反应分享的东西有点概念化,表示不看着代码无法更深刻能理解。那么今天直接上代码!!!

有两种方式使用自己训练好的nlu

1、rasa与nul分开启动,就是在rasa中的配置中配置好目标对应的nlu的服务器,然后使用rasa和nlu分开启动。(下文为启动方式1)

2、使用已经训练好的rasa组件,从别人那里获取来直接一整个整体启动(下文为启动方式2)

rasa官网中推荐的博客文章-启动方式1

用Rasa NLU构建自己的中文NLU系统

训练中文模型-启动方式1

语料获取以及预先预处理

使用的解决方案是MITIE模型,我们需要一个规模比较大的中文语料。

下面的这个网址是一个解决方案的git项目:

GitHub - crownpku/Awesome-Chinese-NLP: A curated list of resources for Chinese NLP 中文自然语言处理相关资料

这个项目中包含了很多例子等,可以保证在需要的时候快速的构建起来库。

下载jieba分词器-启动方式1:

获取一些初级的语料作为训练基础,让模型开始初步理解中文。

下载安装jieba:

pip install jieba

下载基础中文语料-启动方式1: 

需要自己从社区获取,以及一些专业的名词来完成这个举动。

 将一个语料文件分词,以空格为分隔符:

python -m jieba -d " " ./test > ./test_cut

 语句解释(根据自己的实际情况修改文件名字):

这个命令行语句是在使用Python的jieba分词库对一个名为test的文件进行中文分词处理,并将处理结果输出到另一个名为test_cut的文件中。具体来说,各部分含义如下:

  • python -m jieba: 这部分是通过Python的 -m 选项来调用jieba模块(一个常用的中文分词库)作为脚本运行。

  • -d " ": 这是一个参数,传递给jieba分词器,指定分隔符为一个空格。这意味着在分词结果中,每个词语之间将由一个空格隔开。

  • ./test: 这是指定的输入文件路径,即jieba将会读取这个文件中的文本内容进行分词处理。

  • > ./test_cut: 这是Unix/Linux shell中的重定向操作符,它表示将前面命令的输出结果不是打印到屏幕上,而是写入到./test_cut这个文件中。换句话说,jieba处理test文件产生的分词结果会被保存到test_cut文件里。

综上所述,该命令的功能是读取test文件中的文本,使用jieba进行分词处理(词语间以空格分隔),并将分词后的结果保存到test_cut文件中。

MITIE模型训练-启动方式1

我们把所有分好词的语料文件放在同一个文件路径下。接下来我们要训练MITIE模型。

首先将MITIE clone下来:

git clone https://github.com/mit-nlp/MITIE.git

 我们要使用的只是MITIE其中wordrep这一个工具。我们先build它。

cd MITIE/tools/wordrep
mkdir build
cd build
cmake ..
cmake --build . --config Release

 然后训练模型,得到total_word_feature_extractor.dat。注意这一步训练会耗费几十GB的内存,大概需要两到三天的时间

./wordrep -e /path/to/your/folder_of_cutted_text_files

因为需要很长时间,这里我就直接使用别人使用中文wikipedia和百度百科语料生成 的文件

 大家需要的话直接自取就可以了。

链接:https://pan.baidu.com/s/1teZYgkkTPB-WNb6gy9ghZw?pwd=0iza 
提取码:0iza

 total_word_feature_extractor.dat

构建rasa_nlu语料和模型-启动方式1

将rasa_nlu_chi clone下来并安装:

git clone https://github.com/crownpku/rasa_nlu_chi.git
cd rasa_nlu_chi
python setup.py install

 构建尽可能多的示例数据来做意图识别和实体识别的训练数据:

data/examples/rasa/demo-rasa_zh.json

格式是json,例子如下。’start’和’end’是实体对应在’text’中的起止index。

 {
        "text": "找个吃拉面的店",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 3,
            "end": 5,
            "value": "拉面",
            "entity": "food"
          }
        ]
      },
      {
        "text": "这附近哪里有吃麻辣烫的地方",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 7,
            "end": 10,
            "value": "麻辣烫",
            "entity": "food"
          }
        ]
      },
      {
        "text": "附近有什么好吃的地方吗",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "肚子饿了,推荐一家吃放的地儿呗",
        "intent": "restaurant_search",
        "entities": []
      }

使用MitieNLP作为预训练的中文模型 -方式2

 完整config.yml的配置文件-方式2 

# 指定模型架构的方案,这里使用默认版本v1
recipe: default.v1

# 助手唯一标识符,需要替换为实际部署中唯一的助手名称
assistant_id: placeholder_default

# 配置Rasa NLU部分,指定使用的自然语言
language: zh

# Rasa NLU管道组件配置
pipeline:
- name: "MitieNLP"  # 使用MITIE进行自然语言处理,需要预先训练好的模型文件
  model: "data/total_word_feature_extractor_zh.dat"  # MITIE模型路径
- name: "JiebaTokenizer"  # 使用jieba进行中文分词
#  dictionary_path: "data/jieba_userdict"  # 可选,自定义词典路径,用于增强jieba的分词理解,默认不启用
- name: "MitieEntityExtractor"  # 使用MITIE进行实体提取
  epochs: 100  # 实体提取器训练轮数
- name: "EntitySynonymMapper"  # 映射实体别名
  epochs: 50  # 同样
- name: "RegexFeaturizer"  # 使用正则表达式特征化器增强特征
- name: "MittieFeaturizer"  # 注意拼写错误,应为"MitieFeaturizer",使用MITIE生成特征
- name: "DIETClassifier"  # 使用DIET分类器进行意图识别和实体抽取
  epochs: 10  # 训练轮数

# Configuration for Rasa Core.
# https://rasa.com/docs/rasa/core/policies/
#对话管理
- # Rasa Core(对话管理)策略配置
policies:
  - name: "TEDPolicy"  # TED (Transformer Embedding Dialogue) Policy,利用Transformer网络提高对话管理性能
      max_history: 5  # 对话历史的最大轮数,用于构建对话上下文的序列
      epochs: 10  # 训练轮数
      batch_size: 64  # 批量大小
      embedding_dimension: 256  # 词嵌入维度
      # 其他可选参数如dropout rates, learning rate等可以根据需求调整

  - name: "MemoizationPolicy"  # 记忆策略,用于直接记住并重用之前成功的对话路径
    max_history: 10  # 决定了记忆的对话深度

  - name: "RulePolicy"  # 规则策略,允许直接编写规则来指导对话流程
    # rule_persistence: "policies/rules.yml"  # 规则文件位置,如果需要从外部文件加载规则

  - name: "FallbackPolicy"  # 回退策略,当系统不确定如何响应时触发特定动作
    nlu_threshold: 0.4  # NLU部分的置信度阈值
    core_threshold: 0.3  # 核心对话管理部分的置信度阈值
    fallback_action_name: 'action_default_fallback'  # 回退时执行的动作名称

  - name: "MappingPolicy"  # 映射策略,直接将特定的用户输入映射到动作

    #KerasPolicy已经有更先进的配置组件来完成这个需求
#  - name: "KerasPolicy"
#  epochs: 120
#  featurizer:
#    - name: MaxHistoryTrackerFeaturizer
#      max_history: 5
#      state_featurizer:
#        - name: BinarySingleStateFeaturizer
#  - name: "rasa.core.policies.memoization.MemoizationPolicy"
#    max_history: 10
#  - name: "rasa.core.policies.mapping_policy.MappingPolicy"
#  - name: "rasa.core.policies.fallback.FallbackPolicy"
#    nlu_threshold: 0.4
#    core_threshold: 0.3
#    fallback_action_name: 'action_donknow'

定义配置文件中的 action_default_fallback

 在Rasa中,action_default_fallback是一个预设的回退动作,当所有其他策略都无法确定一个合适的回复时,系统会调用此动作。这个动作通常用于处理未能理解用户意图或实体的情况,你可以自定义它的行为,比如提示用户重新表述问题、提供帮助信息,或者转接到人工客服。

要在Rasa项目中实现action_default_fallback,你需要做两件事:、

定义Action

首先,在actions文件夹下创建或编辑一个Python文件,比如actions.py,然后定义一个名为action_default_fallback的函数。这个函数应该接受一个参数dispatcher(用于发送消息给用户),以及可选的tracker(跟踪对话状态)和domain(定义了所有可能的行动和实体)。下面是一个简单的示例:

from typing import Any, Text, Dict, List

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

class ActionDefaultFallback(Action):

    def name(self) -> Text:
        return "action_default_fallback"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        # 定义当触发回退时要发送给用户的回复消息
        message = "对不起,我没有理解你的意思。请尝试用另一种方式告诉我你的问题或需求。"
        
        # 使用dispatcher发送消息给用户
        dispatcher.utter_message(text=message)

        return []

 注册Action

确保你的自定义Action在Rasa配置文件(通常是endpoints.yml)中被注册。如果你使用的是Rasa SDK开发动作,且你的Action位于默认的actions模块中,通常不需要额外配置,因为Rasa默认会寻找这个文件。但是,如果你的动作位于不同的路径或模块中,你可能需要在endpoints.yml中指定actions端点:

actions:
  - endpoint: 
      url: "http://localhost:5055/webhook"
  # 如果你的actions.py在默认位置,这一段通常不需要

整个配置文件中我都写好了对应的解释注释,注意在使用的时候需要安装对应的组件,

然后我们在domain中尝试使用一些中文并归类意图。

要注意在rasa 3.0以上的时候兜底的

FallbackPolicy已经被舍弃了。只需要使用最基础的兜底action来完成就OK了。

接下来使用rasa train来训练,训练之后运行就OK了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语法04 C++ 标准输入语句

标准输入 使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,…

全球知名哲学家思想家教育家颜廷利:清明节的教育意义

在21世纪全球公认十大思想家的行列中,颜廷利大师以其独到的见解和深刻的哲学思考而备受推崇。随着清明节的临近,人们纷纷前往先人的墓地进行祭奠,其中烧纸钱是一项重要仪式。然而,亚洲十大顶级杰出人物、当代易学泰斗三大人物颜廷…

Python 围棋游戏【含Python源码 MX_008期】

简介: 围棋,源自中国,是一种两人对弈的策略棋类游戏。它被认为是世界上最复杂的棋类游戏之一,因为它的规则简单,但变化复杂多样。围棋的游戏目标是在棋盘上占领更多的地盘,并用自己的棋子围住对手的棋子&am…

禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作

方案一: 下载火绒杀毒,在联网请求上禁用Adobe软件的联网请求,甚至还可以额外发现哪些是它要想要偷偷摸摸干的。 方案二: 最后注意: 用盗版软件只是获得了使用权!

Mcgs 屏幕Modbus RTU通讯调试

目录 1. 设备窗口1.1 添加设备构件1.2 设备配置1.2.1 通用串口父设备配置1.2.2 设备0--ModbusRTU配置2. 设计用户窗口2.1 关联设备通道与实时数据库2.3 用户窗口3. 通信测试本文想要实现通过Modbus协议与Mcgs屏幕进行通信收发数据。在使用Mcgs屏幕进行Modbus通信时,一般Mcgs屏…

个股期权103call是什么意思?

个股期权103call是什么意思? 在金融市场中,个股期权作为一种金融衍生工具,为投资者提供了多样化的投资策略。其中,“103call”这一术语,特指一种特定的期权交易策略,它涉及到看涨期权与虚值状态。 文章来…

ROS——publisher、subscriber的实现

发布、订阅关系架构 创建发布者代码 通过CMakeList设置代码编译规则 add_executable(velocity_publisher src/velocity_publisher.cpp)target_link_libraries(velocity_publisher ${catkin_LIBRARIES}) Velocity Velocity这个词有多重含义,具体意思根据上下文有所…

eNSP学习——配置高级的访问控制列表

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置Telnet 4、配置高级ACL控制访问 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp配置命令大全资源-…

有哪些ai聊天推荐?简单分享三款

有哪些ai聊天推荐?在当今数字化时代,人工智能(AI)聊天软件已经成为我们日常生活中不可或缺的一部分。无论是与朋友、家人还是同事交流,这些智能聊天软件都能为我们提供极大的便利。那么,市面上有哪些值得推…

ghost备份系统/恢复系统

准备工作 准备一个微PE镜像或者一个微PE启动U盘 操作步骤 我们这里用虚拟机(win10)进行模拟。首先进入到镜像微PE中(微PE镜像制作请参考微PE工具箱制作成ISO镜像-CSDN博客) 进入微PE 我们先进行微PE镜像的挂载。先右键虚拟机…

Leetcode 刷题第三天|链表

链表理论 什么是链表 链表是一种通过指针串联在一起的线性结构,每个节点有两个部分组成: 数据域和指针域。最后一个节点的指针域指向null 链表的入口节点为链表的头结点也就是head。 链表的类型 单链表 如上图就是单链表 双链表 单链表的指针域只…

【个人博客搭建】(22)申请QQ开发者

这里我们要引入的一个概念是OAuth - OAuth 2.0是一个行业标准的授权协议,用于处理用户数据访问和分享的安全问题。它允许用户将他们对某些服务的访问权限授权给第三方应用,而无需分享他们的用户名和密码。以下是对OAuth 2.0的介绍: 基本概念 …

2024年数据中心能源十大趋势白皮书(免费下载)

数据中心能源是确保数据中心正常运行的关键组成部分,涉及为数据中心提供电、水、油、气等多种能源的相关设备。以下是关于数据中心能源的详细概述: 一、数据中心能源的重要性 数据中心作为信息存储、处理和传输的核心设施,对能源的需求极高…

基于深度学习的电池健康状态预测(Python)

电池的故障预测和健康管理PHM是为了保障设备或系统的稳定运行,提供参考的电池健康管理信息,从而提醒决策者及时更换电源设备。不难发现,PHM的核心问题就是确定电池的健康状态,并预测电池剩余使用寿命。但是锂电池的退化过程影响因…

Golang——gRPC认证

一. OpenSSL 1.1 介绍 OpenSSL是一个开放源代码的软件库包,用于支持网络通讯过程中的加密。这个库提供的功能包含了SSL和TLS协议的实现,并可用于生成密钥、证书、进行密码运算等。 其组成主要包括一下三个组件: openssl:多用途的命…

智能售货机的成功关键点

智能售货机的成功关键点 智能售货机的盈利水平是众多投资者关注的焦点。尽管常有人认为该行业利润丰厚,但实际上,智能售货机的利润率通常维持在一个相对适中的范围,大约在5%至15%之间。这一数据背后,涵盖了包括物流配送、日常运维…

Java---BigInteger和BigDecimal和枚举

1.简介 1.BigInteger可以支持任意长度的整数 2.BigDecimal可以支持任意精度的浮点数 3.用来做精确计算 2.创建方式 new BigInteger(); new BigInteger(参数1,进制):可以将不同进制转成10进制显示 new BigDecimal(); BigInteger.valueOf(); BigDecimal.valueOf();…

transformers之text generation解码策略

目录 参数TemperatureTop-p and Top-k1. 选择最上面的token:贪婪解码2. 从最上面的tokens中选择:top-k3. 从概率加起来为15%的top token中选择:top-pFrequency and Presence Penaltiestransformers库中的解码策略贪婪搜索对比搜索多项式采样beam搜索解码beam搜索多项式采样多样…

中国大模型站起来了!甚至被美国团队反向抄袭

一直以来,美国是公认的AI领域强者,我国AI技术虽然差不多,但始终落人一步。然而,近日斯坦福团队的AI模型却被指控抄袭中国AI模型,这下许多人都坐不住了。 被实锤抄袭的,是斯坦福大学AI团队,他们…

WWDC 2024及其AI功能的引入对中国用户和开发者的影响

WWDC(Apple Worldwide Developers Conference)是苹果公司一年一度的重要活动,吸引了全球开发者的关注。WWDC 2024引入了许多新技术和功能,尤其是AI功能的加入,引发了广泛讨论。本文将深入探讨中国开发者如何看待WWDC 2…