rasa-X替代-(预留坑位)
GitHub - nesterapp/rasa-admin: An open-source alternative for Rasa-X
识别意图
小鸭子:ner_duckling(组件)
查找表:lookup tables + ner_crf (可以是那种可列举的列表类型)
定义NLU组件“NLU是"自然语言理解"
需要在load这里去实现怎么去加载这个数据。
增加nlu中的数据
重点:
NLU数据增强
强化学习
注意:!
1、避免意图混淆
解决:意图分类等
根据分的大类再去整理向下寻找
2、尽可能增加数据
优化策略Policy:
policy是并行的,每个模型都会生成一个结果,并且会生成一个执行度。
pipeline是串行的policy是并行的。
在Rasa中,max_history
参数确实与记忆的对话轮次有关。具体来说,它控制着对话管理部分(Rasa Core)在决定下一个最佳行动(action)时应考虑的过往对话轮次数量。换句话说,max_history
定义了模型在进行决策时会回看多少之前的交互(包括用户的消息和机器人的回应),以此来理解上下文并做出更加准确的响应。
例如,如果你设置max_history: 5
,那么模型在预测下一个动作时,会基于最近的5个交互(包括意图、实体和其他相关信息)来做出决策。这个参数对于处理依赖上下文的复杂对话场景尤为重要,因为它影响到模型理解对话流程的能力。
值得注意的是,这个参数只对使用MaxHistoryTrackerFeaturizer
的策略有效,而对于FullDialogueTrackerFeaturizer
,模型会默认考虑整个对话历史。因此,在配置Rasa的策略时,根据实际对话的复杂性和对历史信息的需求来调整max_history
是很关键的。
Rule Policy
在Rasa中,Rule Policy
是一种特殊的策略(Policy),它允许你基于预定义的规则来直接控制对话流程,而不是依赖于机器学习模型来预测下一步的动作。这意味着你可以用它来实现一些简单且明确的对话逻辑,或者处理那些机器学习模型难以捕捉的特殊情况。
规则政策生效的情况:
-
明确定义的场景:当你在对话中需要对特定的用户输入或对话状态做出精确且预先定义好的反应时,Rule Policy就会生效。例如,当用户说“再见”时,可以直接配置规则让机器人回复“期待再次为您服务”。
-
表单未激活时:如果对话中没有激活表单(Forms),Rule Policy会正常工作。一旦表单被激活,规则通常会被忽略,直到表单处理完成。
-
优先级考虑:在Rasa中,如果有多个策略预测了不同的动作,并且它们的置信度相同,Rasa会根据策略的优先级来选择动作。Rule Policy通常具有较高的优先级(例如,在Rasa 2.x及以后版本中,默认优先级为6),意味着在同等条件下,Rule Policy定义的规则会优先于其他策略生效。
如何使用Rule Policy:
配置文件中启用:在Rasa的配置文件(通常是config.yml
)中,你需要包含RulePolicy
来启用它。例如:
policies:
- name: RulePolicy
编写规则:在训练数据文件(通常是domain.yml
或单独的rules.yml
)中,编写具体的规则。规则通常包括触发条件和相应的响应或执行的动作。例如:
rules:
- rule: Greeting
steps:
- intent: greet
- action: utter_greet
这里,当检测到用户的意图(intent)为greet
时,机器人会执行动作(action)utter_greet
,即回复问候语。
训练对话模型:在添加或修改规则后,重新训练你的Rasa模型以使规则生效。使用命令行工具执行训练指令,如:
rasa train
-
测试与调试:利用Rasa Shell或API测试你的对话模型,确保规则按照预期工作,并根据反馈进行调整。
通过这种方式,Rule Policy为开发者提供了一种灵活的方法来结合机器学习驱动的对话管理和硬编码的逻辑,以应对复杂的对话场景。
Action
rasa的action是用了微服务的概念,要使用
rasa run actions
来启动这个actions
在Rasa中,自定义Action允许你使用代码来完成更复杂的任务,这些任务超出了简单响应的范畴,可能涉及外部API调用、数据库查询、复杂的逻辑处理等。以下是定义和使用自定义Action的基本步骤:
定义Action
首先,你需要创建一个新的Python类来定义你的自定义Action。这个类应该继承自rasa_sdk.Action
。在类中,你需要实现run
方法,该方法负责执行Action的具体逻辑并返回结果给Rasa。
示例代码 (actions.py
):
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
class ActionGetWeather(Action):
def name(self) -> Text:
return "action_get_weather"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# 假设这里调用了天气API获取数据
city = tracker.get_slot("city")
weather_data = get_weather_from_api(city)
response = f"The weather in {city} is {weather_data['description']} with a temperature of {weather_data['temperature']}°C."
dispatcher.utter_message(text=response)
return []
配置Action
在domain.yml
文件中,你需要声明这个自定义Action,以便Rasa知道它的存在。
actions:
- action_get_weather
编写 stories
在stories.yml
或相关的story文件中,使用action_name
来指明何时调用这个自定义Action。这有助于Rasa理解何时以及在何种上下文中使用这个Action。
stories:
- story: ask for weather
steps:
- intent: ask_weather
- slot_was_set:
- city: New York
- action: action_get_weather
- intent: affirm
- action: utter_thank_you
启动Action Server
为了使自定义Action生效,你需要运行一个独立的Action服务器。在项目的根目录下执行以下命令:
rasa run actions
训练和运行Rasa
确保你的Rasa模型已经包含了最新的domain定义、stories和自定义Action的引用,然后重新训练Rasa模型并启动它:
rasa train
rasa shell
使用顺序总结:
- 编写Action代码:在
actions.py
中定义自定义Action类。 - 配置Action:在
domain.yml
中声明Action。 - 编写Stories:在story文件中使用Action来描述对话流程。
- 启动Action Server:运行
rasa run actions
以启动Action服务器。 - 训练Rasa:使用
rasa train
命令训练模型。 - 运行Rasa:使用
rasa shell
或rasa run
启动Rasa以进行测试或部署。
事件Event
在Rasa中,event
(事件)是一种核心概念,用于表示对话中发生的重要状态变化或行为。事件是Rasa对话管理机制中的基本信息单元,用于追踪和控制对话的状态(对话状态由Dialogue State Tracker
管理)。每个事件代表了对话历史中的一个时刻,记录了对话的动态变化,如用户的消息、意图识别结果、执行的动作或者是对话管理的决策等。
Rasa中的事件类型多样,主要包括但不限于以下几种:
-
用户消息事件:当用户发送一条消息时,会产生一个代表该消息的事件,通常包含消息内容和识别出的意图。
-
意图识别事件:表示识别到的用户意图,例如
UserUttered
事件。 -
行动执行事件:当一个Action被执行后,系统会产生一个
ActionExecuted
事件来记录该动作及其结果。 -
槽位设置事件:
SlotSet
事件用于记录槽位(Slots)值的变化,即对话状态中存储的关键信息更新。 -
表单激活与提交事件:在处理表单填写时,会有表单激活(
Form
)和表单提交(FormValidation
)相关的事件。 -
重置事件:如
Restarted
事件,用于指示对话应重新开始。 -
结束对话事件:如
SessionEnded
事件,标记一次对话的结束。
这些事件不仅用于记录对话的历史,也是Rasa决策逻辑的基础。Rasa的策略(Policies),特别是像Rule Policy这样的,会根据当前对话中的事件序列来决定下一步应采取的行动。开发者还可以通过自定义Action来生成特定的事件,以此来改变对话的流向或状态。
简而言之,事件是构建和管理Rasa对话流程的基石,它们帮助系统理解对话的进展,作出决策,并维持对话上下文的一致性。
Rasa中的Event是用来表示对话流程中特定状态变化或动作的对象,它们通常是Python类的形式定义在Rasa的源代码中。例如,提到的SlotSet
事件就是一个Python类,它继承自基类Event
,并实现了特定的行为来更新对话跟踪器(Tracker)中的槽位(Slots)信息。
这些事件类通常位于Rasa的不同模块中,比如rasa.shared.core.events
或之前的版本中可能位于rasa.core.events
。每个事件类都有其构造方法(__init__
),用于初始化事件所需的参数,并可能包含额外的方法来处理特定逻辑。
以SlotSet
为例,这个事件类允许你设置或更新对话中的一个槽位值。当你实例化一个SlotSet
对象时,通常需要提供至少一个参数,即你要设置的槽位的键名以及对应的值,然后这个对象可以被自定义Action通过Action Server返回,进而影响对话状态。
以下是简化的SlotSet
事件类的示例代码,展示其基本结构(注意实际代码可能更复杂,包含更多细节和错误处理):
from rasa.shared.core.events import Event
class SlotSet(Event):
def __init__(self, key: Text, value: Any, timestamp: Optional[float] = None) -> None:
self.key = key
self.value = value
super().__init__(timestamp)
def as_dict(self) -> Dict[Text, Any]:
"""Converts the event into a dictionary for serialization."""
return {"event": "slot", "name": self.key, "value": self.value}
在这个例子中,as_dict
方法常用于将事件转换为字典形式,便于序列化和存储,或者通过网络传输到其他服务。
Knowledge Base Actions-知识库
rasa中一个可以基于数据库作为知识库的回复-知识库
要在Rasa中使用Knowledge Base Actions
并以MySQL作为知识库的数据源,你可以遵循以下步骤来实现:
安装必要的依赖
确保你已经安装了Rasa SDK和用于连接MySQL的Python库,如pymysql
或mysql-connector-python
。可以通过pip安装:
pip install rasa-sdk pymysql
创建MySQL数据库和表
设计并创建一个适合你应用需求的数据库表结构。例如,如果你要构建一个FAQ系统,可能需要一个包含问题、答案和其他相关信息的表。
编写自定义知识库Action
你需要创建一个继承自rasa_sdk.knowledge_base.actions.ActionQueryKnowledgeBase
的自定义Action类。在这个类中,你将实现从MySQL数据库查询知识的方法。
from rasa_sdk.knowledge_base.actions import ActionQueryKnowledgeBase
from rasa_sdk import Tracker
from rasa_sdk.executor import CollectingDispatcher
import pymysql
class ActionMySQLKnowledgeBase(ActionQueryKnowledgeBase):
def __init__(self):
super().__init__()
# 初始化数据库连接
self.conn = pymysql.connect(host='your_host', user='your_user', password='your_password', db='your_db')
self.cursor = self.conn.cursor()
def retrieve(self, query: str, **kwargs: Any) -> List[Dict[Text, Any]]:
"""
查询MySQL数据库以获取匹配项。
"""
self.cursor.execute(f"SELECT answer_column FROM your_table WHERE question_column LIKE '%{query}%'")
results = self.cursor.fetchall()
answers = [{"answer": res[0]} for res in results]
return answers
def shutdown(self):
"""关闭数据库连接"""
self.cursor.close()
self.conn.close()
def name(self) -> Text:
return "action_mysql_knowledge_base"
请注意替换host
、user
、password
、db
、your_table
、question_column
和answer_column
为你的实际数据库配置和表结构字段。
配置Rasa Domain
在你的Rasa项目的domain.yml
文件中,添加自定义Action的引用,并定义相关的意图和实体(如果有的话)。
actions:
- action_mysql_knowledge_base
故事和训练数据
编写故事和NLU训练数据来定义用户如何提问以及期望的回答。确保你的故事中包含调用新创建的Action。
训练和测试
训练你的Rasa模型,并使用Rasa shell或Webchat进行测试,看看是否能正确地从MySQL数据库中获取答案并响应用户。
注意事项
- 安全性:上述示例代码中直接在SQL查询中使用了字符串拼接,这在实际应用中存在SQL注入风险。应该使用参数化查询来提高安全性。
- 性能与缓存:频繁的数据库查询可能影响性能,考虑在Action中加入缓存机制来存储最近查询的结果。
- 错误处理:增加适当的异常处理逻辑,确保在数据库连接失败或查询出错时能够优雅地处理。
按照这些步骤,你就能够基于MySQL知识库构建一个能够回答问题的Rasa聊天机器人了。