Rasa 基于知识库的问答 音乐百科机器人

news2025/1/16 3:37:12

文章目录

    • 1. 使用 ActionQueryKnowledgeBase
      • 创建知识库
      • NLU数据
    • 2. 音乐机器人
      • nlu.yml
      • stories.yml
      • rules.yml
      • domain.yml
      • config.yml
      • endpoints.yml
      • data.json
      • 自定义动作 actions.py
      • 测试
      • 使用Neo4j

learn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code

机器人返回了一个列表,用户说第X个,你得知道他说的是啥

1. 使用 ActionQueryKnowledgeBase

创建知识库

最简单的知识库 json 文件

{
    "song": [
        {
            "id": 0,
            "name": "晴天",
            "singer": "周杰伦",
            "album": "叶惠美",
            "style": "流行,英伦摇滚"
        },
        {
            "id": 1,
            "name": "江南",
            "singer": "林俊杰",
            "album": "第二天堂",
            "style": "流行,中国风"
        },
    ],
    "singer": [
        {
            "id": 0,
            "name": "周杰伦",
            "gender": "male",
            "birthday": "1979/01/18"
        },
        {
            "id": 1,
            "name": "林俊杰",
            "gender": "male",
            "birthday": "1979/03/27"
        },
    ]
}

格式 key : [object1,object2...]

InMemoryKnowledgeBase 实现中,每个 obj 都有至少有 name,id 属性

NLU数据

意图想要进行知识库信息查询

version: "3.0"
nlu:
  - intent: query_knowledge_base
    examples: |
      - 有什么好听的[歌曲](object_type)?
      - 有什么唱歌好听的[歌手](object_type)?
      - 给我列一些[男](gender)[歌手](object_type)
      - 给我列出一些[周杰伦](singer)的[歌曲](object_type)
      - [刚才那首](mention)属于什么[专辑](attribute)
      - [刚才那首](mention)是[谁](attribute)唱的
      - [刚才那首](mention)的[歌手](attribute)是谁
      - [那首歌](mention)属于什么[风格](attribute)?
      - [晴天](song)这首歌属于什么[专辑](attribute)?
      - [晴天](song)的[专辑](attribute)?
      - [江南](song)属于什么[专辑](attribute)?
      - [江南](song)在什么[专辑](attribute)里面?
      - [第一个](mention)人的[生日](attribute)
      - [周杰伦](singer)的[生日](attribute)
  • object_type歌曲 映射为 song
  • mention第一个,最后一个 的表述标注化为 1,LAST
  • attribute' 知识库中 obj 的属性,在 nlu 训练数据中都要标注为 attribute

同时 domain.yml 文件需要加入

entities:
  - object_type
  - mention
  - attribute
  - object-type
  - song
  - singer
  - gender
slots:
  attribute:
    type: any
    mappings:
      - type: from_entity
        entity: attribute
  gender:
    type: any
    mappings:
      - type: from_entity
        entity: gender
  knowledge_base_last_object:
    type: any
    mappings:
      - type: custom
  knowledge_base_last_object_type:
    type: any
    mappings:
      - type: custom
  knowledge_base_listed_objects:
    type: any
    mappings:
      - type: custom
  knowledge_base_objects:
    type: any
    mappings:
      - type: custom
  mention:
    type: any
    mappings:
      - type: from_entity
        entity: mention
  object_type:
    type: any
    mappings:
      - type: from_entity
        entity: object_type
  singer:
    type: any
    mappings:
      - type: from_entity
        entity: singer
  song:
    type: any
    mappings:
      - type: from_entity
        entity: song

2. 音乐机器人

tree

.
├── actions.py
├── config.yml
├── credentials.yml
├── data
│   ├── nlu.yml
│   ├── rules.yml
│   └── stories.yml
├── data.json
├── data_to_neo4j.py
├── dicts
│   ├── ordinal.txt
│   └── songs.txt
├── domain.yml
├── endpoints.yml
├── en_to_zh.json
├── index.html
├── index.js
├── __init__.py
├── Makefile
├── media
│   ├── demo2.png
│   └── demo.png
├── neo4j_knowledge_base.py
├── README.md
├── run_neo4j_in_docker.bash
└── tests
    └── basic.md

nlu.yml

version: "3.0"
nlu:
  - intent: goodbye
    examples: |
      - 拜拜
      - 再见
      - 拜
      - 退出
      - 结束
  - intent: greet
    examples: |
      - 你好
      - 您好
      - Hello
      - hello
      - Hi
      - hi
      - 喂
      - 在么
  - intent: query_knowledge_base
    examples: |
      - 有什么好听的[歌曲](object_type)?
      - 有什么唱歌好听的[歌手](object_type)?
      - 给我列一些[歌曲](object_type)
      - 给我列一些[歌手](object_type)
      - 给我列一些[男](gender)[歌手](object_type)
      - 给我列一些[男](gender)的[歌手](object_type)
      - 给我列一些[女](gender)[歌手](object_type)
      - 给我列一些[女](gender)的[歌手](object_type)
      - 给我列一些[男性](gender)[歌手](object_type)
      - 给我列一些[女性](gender)[歌手](object_type)
      - 给我[男性](gender)[歌手](object_type)
      - 给我[女性](gender)[歌手](object_type)
      - 给我列出一些[周杰伦](singer)的[歌曲](object_type)
      - 给我列出[周杰伦](singer)的[歌曲](object_type)
      - 给我列出[周杰伦](singer)唱的[歌曲](object_type)
      - 列出[周杰伦](singer)的[歌曲](object_type)
      - 给我列[周杰伦](singer)的[歌曲](object_type)
      - [林俊杰](singer)都有什么[歌曲](object_type)
      - [林俊杰](singer)有什么[歌曲](object_type)
      - [刚才那首](mention)属于什么[专辑](attribute)
      - [刚才那首](mention)是[谁](attribute)唱的
      - [刚才那首](mention)的[歌手](attribute)是谁
      - [那首歌](mention)属于什么[风格](attribute)?
      - [最后一个](mention)属于什么[风格](attribute)?
      - [第一个](mention)属于什么[专辑](attribute)?
      - [第一个](mention)的[专辑](attribute)
      - [第一个](mention)是[谁](attribute)唱的?
      - [最后一个](mention)是[哪个](attribute)唱的?
      - [舞娘](song)是[哪个歌手](attribute)唱的?
      - [晴天](song)这首歌属于什么[专辑](attribute)?
      - [晴天](song)的[专辑](attribute)?
      - [江南](song)属于什么[专辑](attribute)?
      - [江南](song)在什么[专辑](attribute)里面?
      - [第一个](mention)人的[生日](attribute)
      - [周杰伦](singer)的[生日](attribute)
  - intent: play_song
    examples: |
      - 播放这首歌
      - 播这首歌
  - intent: play_album
    examples: |
      - 播放这个专辑
      - 播这个专辑
  - synonym: "1"   # 同义词,第一个 -> 1
    examples: |
      - 第一个
      - 首个
      - 第一首
  - synonym: "2"
    examples: |
      - 第二个
      - 第二首
  - synonym: "3"
    examples: |
      - 第三个
      - 第三首
  - synonym: LAST
    examples: |
      - 最后一个
      - 最后那个
      - 最后的
  - synonym: birthday
    examples: |
      - 生日
  - synonym: song
    examples: |
      - 歌曲
  - synonym: singer
    examples: |
      - 歌手
      - 谁
      - 哪个
      - 哪个歌手
  - synonym: album
    examples: |
      - 专辑
  - synonym: "4"
    examples: |
      - 第四个
      - 第四首
  - synonym: style
    examples: |
      - 风格
      - 类型
      - 流派
  - synonym: male
    examples: |
      - 男
      - 男性
  - synonym: famale
    examples: |
      - 女
      - 女性

stories.yml

version: "3.0"
stories:
  - story: greet
    steps:
      - intent: greet
      - action: utter_greet
  - story: knowledge query
    steps:
      - intent: query_knowledge_base
      - action: action_response_query
      - intent: query_knowledge_base
      - action: action_response_query
  - story: say goodbye
    steps:
      - intent: goodbye
      - action: utter_goodbye

rules.yml

version: "3.0"
rules:
  - rule: 处理NLU低置信度时的规则
    steps:
      - intent: nlu_fallback
      - action: action_default_fallback
  - rule: 处理知识图谱查询
    steps:
      - intent: query_knowledge_base
      - action: action_response_query

domain.yml

version: "3.0"
session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true
intents:
  - goodbye
  - greet
  - query_knowledge_base:
      use_entities: []
  - play_song
  - play_album
entities:
  - object_type
  - mention
  - attribute
  - object-type
  - song
  - singer
  - gender
slots:
  attribute:
    type: any
    mappings:
      - type: from_entity
        entity: attribute
  gender:
    type: any
    mappings:
      - type: from_entity
        entity: gender
  knowledge_base_last_object:
    type: any
    mappings:
      - type: custom
  knowledge_base_last_object_type:
    type: any
    mappings:
      - type: custom
  knowledge_base_listed_objects:
    type: any
    mappings:
      - type: custom
  knowledge_base_objects:
    type: any
    mappings:
      - type: custom
  mention:
    type: any
    mappings:
      - type: from_entity
        entity: mention
  object_type:
    type: any
    mappings:
      - type: from_entity
        entity: object_type
  singer:
    type: any
    mappings:
      - type: from_entity
        entity: singer
  song:
    type: any
    mappings:
      - type: from_entity
        entity: song
responses:
  utter_greet:
    - text: 你好,我是 Silly, 一个可以利用知识图谱帮你查询歌手、音乐和专辑的机器人。
  utter_goodbye:
    - text: 再见!
  utter_default:
    - text: 系统不明白您说的话
  utter_ask_rephrase:
    - text: 抱歉系统没能明白您的话,请您重新表述一次
actions:
  - action_response_query
  - utter_goodbye
  - utter_greet
  - utter_default
  - utter_ask_rephrase

config.yml

recipe: default.v1
language: zh

pipeline:
  - name: JiebaTokenizer
  - name: LanguageModelFeaturizer
    model_name: bert
    model_weights: bert-base-chinese
  - name: RegexFeaturizer
  - name: DIETClassifier
    epochs: 1000
    learning_rate: 0.001
  - name: FallbackClassifier
    threshold: 0.4
    ambiguity_threshold: 0.1
  - name: EntitySynonymMapper     

policies:
  - name: MemoizationPolicy
  - name: TEDPolicy 
  - name: RulePolicy
    core_fallback_threshold: 0.3
    core_fallback_action_name: "action_default_fallback"

endpoints.yml

action_endpoint:
  url: "http://localhost:5055/webhook"

data.json

{
    "song": [
        {
            "id": 0,
            "name": "晴天",
            "singer": "周杰伦",
            "album": "叶惠美",
            "style": "流行,英伦摇滚"
        },
        {
            "id": 1,
            "name": "江南",
            "singer": "林俊杰",
            "album": "第二天堂",
            "style": "流行,中国风"
        },
        {
            "id": 2,
            "name": "舞娘",
            "singer": "蔡依林",
            "album": "舞娘",
            "style": "流行"
        },
        {
            "id": 3,
            "name": "后来",
            "singer": "刘若英",
            "album": "我等你",
            "style": "流行,抒情,经典"
        }
    ],
    "singer": [
        {
            "id": 0,
            "name": "周杰伦",
            "gender": "male",
            "birthday": "1979/01/18"
        },
        {
            "id": 1,
            "name": "林俊杰",
            "gender": "male",
            "birthday": "1979/03/27"
        },
        {
            "id": 2,
            "name": "蔡依林",
            "gender": "female",
            "birthday": "1980/09/15"
        },
        {
            "id": 3,
            "name": "刘若英",
            "gender": "female",
            "birthday": "1969/06/01"
        }
    ]
}

自定义动作 actions.py

import os
import json

from typing import Any, Dict, List, Text

from rasa_sdk import utils
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.knowledge_base.actions import ActionQueryKnowledgeBase
from rasa_sdk.knowledge_base.storage import InMemoryKnowledgeBase

USE_NEO4J = bool(os.getenv("USE_NEO4J", False))

if USE_NEO4J:
    from neo4j_knowledge_base import Neo4jKnowledgeBase


class EnToZh:
    def __init__(self, data_file):
        with open(data_file) as fd:
            self.data = json.load(fd)

    def __call__(self, key):
        return self.data.get(key, key)


class MyKnowledgeBaseAction(ActionQueryKnowledgeBase):
    def name(self) -> Text:
        return "action_response_query"

    def __init__(self):
        if USE_NEO4J:
            print("using Neo4jKnowledgeBase")
            knowledge_base = Neo4jKnowledgeBase(
                "bolt://localhost:7687", "neo4j", "43215678"
            )
        else:
            print("using InMemoryKnowledgeBase")
            knowledge_base = InMemoryKnowledgeBase("data.json")

        super().__init__(knowledge_base)

        self.en_to_zh = EnToZh("en_to_zh.json")

    async def utter_objects(
        self,
        dispatcher: CollectingDispatcher,
        object_type: Text,
        objects: List[Dict[Text, Any]],
    ) -> None:
        """
        Utters a response to the user that lists all found objects.
        Args:
            dispatcher: the dispatcher
            object_type: the object type
            objects: the list of objects
        """
        if objects:
            dispatcher.utter_message(text="找到下列{}:".format(self.en_to_zh(object_type)))

            repr_function = await self.knowledge_base.get_representation_function_of_object(
                    object_type
            )


            for i, obj in enumerate(objects, 1):
                dispatcher.utter_message(text=f"{i}: {repr_function(obj)}")
        else:
            dispatcher.utter_message(
                text="我没找到任何{}.".format(self.en_to_zh(object_type))
            )

    def utter_attribute_value(
        self,
        dispatcher: CollectingDispatcher,
        object_name: Text,
        attribute_name: Text,
        attribute_value: Text,
    ) -> None:
        """
        Utters a response that informs the user about the attribute value of the
        attribute of interest.
        Args:
            dispatcher: the dispatcher
            object_name: the name of the object
            attribute_name: the name of the attribute
            attribute_value: the value of the attribute
        """
        if attribute_value:
            dispatcher.utter_message(
                text="{}的{}是{}。".format(
                    self.en_to_zh(object_name),
                    self.en_to_zh(attribute_name),
                    self.en_to_zh(attribute_value),
                )
            )
        else:
            dispatcher.utter_message(
                text="没有找到{}的{}。".format(
                    self.en_to_zh(object_name), self.en_to_zh(attribute_name)
                )
            )

测试

rasa train
rasa run --cors "*"
rasa run actions
python -m http.server

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用Neo4j

图数据库
docker 安装 docker run --env=NEO4J_AUTH=none --publish=7474:7474 --publish=7687:7687 neo4j

pip install neo4j

导入数据

python data_to_neo4j.py

windows

set USE_NEO4J=1
rasa run actions

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

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

相关文章

从“小螺栓血案”谈装配体模型连接螺栓6个正确的处理方法

经调查发现:“江苏启安建设工程有限公司提供了支吊架膨胀螺栓计算书,但计算书上无企业相关人员签字,未经监理单位审核同意,未报施工总包单位,未经设计单位审定;计算书认为支吊架应采用直径为12mm 的膨胀螺栓…

成为全栈程序员太难了?这个低代码高效率的报表工具绝对不能错过

现在程序员有个很奇怪的归宿,就是都在主动或被动地成为全栈程序员。前端被要求写后端的代码,后端被要求能看懂前端,美名其曰加速成长或为老板省钱! 但一个人能做到全栈真的很难!就拿报表开发而言,学习整个…

朴素贝叶斯

概要 前文介绍了贝叶斯公式基础以及在统计领域的基本应用贝叶斯基础_zhanglehes的博客-CSDN博客,本文将介绍它的一种新的转换形式,以及在机器分类领域的应用。 分类的数学描述 朴素贝叶斯公式推理 贝叶斯公式 在分类领域,将其改写如下 我们…

在conda虚拟环境中安装OpenCv并在pycharm中使用

目录 一. 在下面的网站中下载OpenCV文件 二. 在虚拟环境中使用pip安装该文件 三、官网下载OpenCV源代码(后续使用) 四、pycharm中打开该虚拟环境 五、安装numpy和matplotlib 六、pycharm找不到cv2模块解决: 七、在pyhcharm中使用cv不自…

在服务器安装jupyter并在本地访问

一、安装 1.1安装jupyter notebook pip install jupyter1.2安装jupyter lab pip install jupyterlab # 中文界面包 pip install jupyterlab-language-pack-zh-CN二、本地使用 我们在远程登录Linux服务器时,经常希望在本地浏览器端打开jupyter notebook&#xff…

需求的收集,筛选和排序

对需求的把握是否准确,很大程度上决定了产品的成与败,需求分析对于产品经理是必须要掌握的技能,接下来聊下需求收集的目标和方式。 一、收集渠道: 1、用户反馈: 用户提出的反馈有可能也是我们没有意识到的问题&#…

SMT工厂及PCB工程师的福音!可视化BOM交互焊接工具来了

目前电子产品已经渗透到我们生活的各个角落,其产品涵盖通信、医疗、计算机及周边视听产品、玩具、家用电器、军工用品等。关于电子产品的PCBA焊接,在试样阶段一般采用手工焊接。手工焊接的好处是成本低,一把电络铁就搞定了,如果样…

记一次简单的白加黑测试

前一阵子成了小洋人,所以很长的时间也没更新了,今天更一篇PHP代码审计的吧,此次分享的内容十分的简单,大家简单的看看即可 命令注入 -1 从上述代码,我们可以看出来,$ip变量接收过来之后通过合并运算符(??…

【OpenCV-Python】教程:7-3 理解KMeans

OpenCV Python KMeans 的理解 【目标】 理解KMeans聚类的基础概念KMeans是如何工作的, 【理论】 Tshirt尺寸问题 有个公司,打算投放一批T-shirt到市场上售卖,但是不知道人们需要什么样的尺寸,而且工厂也不会制作所有的尺寸样…

联想C2E摄像头的折腾

背景 老苏的巨峰摄像头坏了,一直也没在意,因为监控也不是什么刚需。朋友送的,比较古老,不像现在的家用监控摄像头,都有 app,而这台巨峰摄像头不光不支持 app,后台设置还只能用 IE,因…

OLSR路由协议学习

OLSR路由协议概述两种分组路由发现与维护算法步骤链路感知邻居侦听MPR选择拓扑建立路由表的建立与维护总结概述 优化链路状态路由(Optimized Link State Routing)协议,即 OLSR 路由协议是一种平面拓扑的先验式路由协议(主动式路由…

使用mosquitto部署MQTT服务

本次实验使用版本:mosquitto-1.6.7 查看版本命令:mosquitto -v 1安装 make && make install,安装mosquitto。 安装完毕后放开防火墙 查看防火墙某个端口是否开放 firewall-cmd --query-port1883/tcp 开放防火墙端口80 firewall-…

BHG Mall超级宠粉节攻略收藏,商业IP化出圈新玩法

购物中心作为人们生活的第三空间,除了满足物质需求外,是人们精神消费的最主要空间之一。中国连锁经营协会发布《中国购物中心对经济社会发展贡献力报告》,报告中显示,购物中心不断转变,发展成为城市能够识别时代精神符…

关于我转行嵌入式的那些事

文章目录**为什么想转行了?****一、工作环境问题****二、无休止的出差加班和混乱的作息时间****三、工作压力大****四、薪资上限低,行业前景差****为什么选择嵌入式****转行前的学习****一、单片机开发****二、Linux应用开发****三、Linux驱动开发和Andr…

高校GIS系统有何作用?

根据高校信息化管理平台的基本建设,全方位提高数据服务团体的管理服务质量。根据综合性平台全方位地服务项目出示,更为全方位地掌握老师学生的主题活动特性,并根据云计算技术对老师学生的个人行为数据信息开展发掘剖析,进而精确掌…

VSCode远程连接Linux服务器上的项目,并连接GitHub

一、Linux中创建ssh密钥 以centos为例,创建ssh密钥 ssh-keygen -t rsa -C "your_emailexample.com" 后面连续点击回车即可。 如此便会在 ~/.ssh 目录下生成身份验证所需的公钥和私钥两个文件. 上文中使用的 RSA 算法, 所以得到的文件默认应为 id_rsa…

基于FPGA的 TMDS 编码 及 HDMI 显示

目录 引言 TMDS 编码 原理简介 TMDS编码实现 HDMI差分数据串行 实现方法 源码 HDMI显示方法 思路 实现 工程结构 源代码分享 板级调试视频 引言 最近在开发板上倒腾了一下 TMDS 视频编码的原理以及实现。特在此做一个记录。文附 全部设计源码、MATLAB源码&#xf…

【IE】信息抽取任务简述

1 信息抽取任务 信息抽取(Information extraction,IE)任务指从非结构化或半结构化的文本中抽取出结构化信息。根据被抽取的对象,信息抽取可以分为以下4个任务: (1) 实体抽取(Entity…

单商户商城系统功能拆解51—应用中心—评价助手

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

用维度概念来定义初级、中级、高级程序员

网络上众说纷纭,大都站立在对某一技术的知识掌握量上来界定,或者有些人说着说着,发现无法自圆其说,然后就说这三种人就是一种叫法,你觉得你是高级你就高级了,从概念上讲,这三者之间必然有质的区…