新闻详情

新闻详情

首页 / 资讯中心 / 详情

Rasa Reminderbot 实战指南:用 ReminderScheduled 事件实现外部事件触发与定时提醒

发布时间:2026/9/13 20:18:53来源:尧图网络
Rasa Reminderbot 实战指南:用 ReminderScheduled 事件实现外部事件触发与定时提醒
Rasa Reminderbot 实战指南用 ReminderScheduled 事件实现外部事件触发与定时提醒【免费下载链接】rasa Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants项目地址: https://gitcode.com/GitHub_Trending/ra/rasareminderbot是 Rasa Open Source 仓库中的一个完整可运行示例展示了如何让对话机器人在没有用户主动发消息的情况下通过定时提醒Reminder与外部事件External Event机制自主触发意图并回复用户。本文以 examples/reminderbot/README.md 为骨架结合仓库内的actions/actions.py、domain.yml、rules.yml以及rasa/core/processor.py、rasa/shared/core/events.py等源码完整讲解其文件组成、训练与运行步骤、底层实现原理帮助你在本地跑通并复用到自己的助手中。这个示例解决什么问题在常规的人机对话中机器人只能被动响应用户发来的消息。但现实中大量场景要求机器人主动行动5 秒后提醒用户给某人打电话外部传感器检测到植物缺水时主动告知用户你的植物需要浇水取消之前设定的全部提醒。reminderbot就是为这类异步触发场景准备的它同时演示了定时提醒ReminderScheduled/ReminderCancelled事件和外部事件注入trigger_intentAPI EXTERNAL_前缀意图两条技术路径并且特意在 credentials.yml 中注释掉rest通道因为 the rest channel does not work with external eventsrest 通道无法与外部事件协同工作因此示例使用callback 通道作为演示载体。示例包含哪些文件reminderbot是一个完整的最小可运行项目由以下文件构成路径均在 examples/reminderbot 下文件作用data/nlu.ymlNLU 模型的训练数据greet、bye、ask_remind_call 等意图及示例句data/rules.ymlCore 模型的规则意图 → 动作的固定映射含EXTERNAL_意图config.yml模型配置pipeline 与 policiesdomain.yml助手的领域定义意图、实体、槽位、响应、动作credentials.yml各通道的凭证此处启用 callback 通道endpoints.yml各类端点配置action server 端点等actions/actions.py处理外部事件与提醒的自定义动作callback_server.py演示用的回调服务器把机器人回复打印到控制台完整运行步骤从训练到对话原 README 给出的三步运行流程加上验证用的 curl 命令构成了完整的端到端演示。1. 训练模型在examples/reminderbot目录下执行rasa train训练结果是一个打包好的 zip 模型文件存放在/models目录中。该命令会同时训练 NLU意图/实体识别与 Core对话管理两个部分使用的配置来自 config.yml。2. 启动 Rasa SDK Action Server自定义动作如action_set_reminder、action_react_to_reminder由独立于 Rasa Server 的 action server 执行另开一个终端运行rasa run actions该服务默认监听http://localhost:5055/webhook与 endpoints.yml 中配置的action_endpoint对应action_endpoint: url: http://localhost:5055/webhook3. 启动回调服务器并运行 Rasa Server第三个终端中启动示例自带的回调服务器在运行步骤 2 命令的另一个控制台窗口执行python callback_server.pycallback_server.py 基于 Sanic 实现它监听POST /bot接口端口 5034将收到的机器人回复text打印到控制台并返回{status: message sent}。它对应 credentials.yml 中 callback 通道的配置callback: url: http://localhost:5034/bot第四个终端中以 API 模式启动 Rasa Serverrasa run --enable-api4. 通过 callback 通道与机器人对话向 callback 通道的 webhook 端点发送用户消息curl -XPOST http://localhost:5005/webhooks/callback/webhook \ -d {sender: tester, message: hello} \ -H Content-type: application/json机器人的回复会出现在运行callback_server.py的终端里。这里sender字段即对话 IDsender_id用于区分不同的对话是整个外部事件机制的关键标识。领域与规则机器人会什么领域定义 domain.yml领域文件中值得注意的设计意图既有普通对话意图greet、bye、ask_remind_call、ask_forget_reminders、ask_id也有以EXTERNAL_前缀命名、由外部注入的意图EXTERNAL_dry_plant、EXTERNAL_reminder以及EXT_reminder。实体与槽位PERSON人名来自 Spacy 实体提取和plant植物名。其中PERSON槽位被声明为influence_conversation: false即它不参与对话策略的特征化——因为在这个场景中人名只是提醒内容的占位数据不应影响策略走向其映射方式为from_entity。自定义动作action_set_reminder、action_forget_reminders、action_react_to_reminder、action_tell_id、action_warn_dry全部在 domain 中注册。规则 data/rules.yml规则让固定意图直接映射到固定动作不走 ML 策略预测共 7 条- rule: greet steps: - intent: greet - action: utter_what_can_do - rule: remind call steps: - intent: ask_remind_call - action: action_set_reminder - rule: forget reminder steps: - intent: ask_forget_reminders - action: action_forget_reminders - rule: say goodbye steps: - intent: bye - action: utter_goodbye - rule: convo action_tell_id steps: - intent: ask_id - action: action_tell_id - rule: warn dry plant steps: - intent: EXTERNAL_dry_plant - action: action_warn_dry - rule: react to reminder steps: - intent: EXTERNAL_reminder - action: action_react_to_reminder注意后两条规则EXTERNAL_dry_plant与EXTERNAL_reminder并不是用户会直接说出的意图而是分别由trigger_intentAPI 和定时提醒事件注入的虚拟意图。规则保证这些意图一旦被注入就立即执行对应的自定义动作。这与 config.yml 中仅使用RulePolicy的配置是一致的——整个示例的对话管理完全由规则驱动。NLU 训练数据 data/nlu.ymlNLU 数据为每个意图提供了多个示例句例如ask_remind_call包含 remind me to call John、I must not forget to call Santa 等供 DIET 分类器学习。人名John、Santa 等交由 config.yml 中的SpacyEntityExtractordimensions: [PERSON]提取。自定义动作源码剖析提醒机制的核心actions/actions.py 是示例的灵魂定义了 5 个自定义动作。1. 设置提醒ActionSetReminderclass ActionSetReminder(Action): def name(self) - Text: return action_set_reminder async def run(self, dispatcher, tracker, domain): dispatcher.utter_message(I will remind you in 5 seconds.) date datetime.datetime.now() datetime.timedelta(seconds5) entities tracker.latest_message.get(entities) reminder ReminderScheduled( EXTERNAL_reminder, trigger_date_timedate, entitiesentities, namemy_reminder, kill_on_user_messageFalse, ) return [reminder]要点动作返回的ReminderScheduled事件被写入 tracker随后由对话处理器调度执行trigger_date_time设为当前时间 5 秒entities直接取自tracker.latest_message.get(entities)即用户消息中提取到的实体如 PERSON 人名会随提醒一起注入到被触发的意图中namemy_reminder给提醒一个 ID同名的提醒会互相覆盖只有一个最终执行源码注释见rasa/core/processor.py中_schedule_reminders的 docstringkill_on_user_messageFalse表示在触发时间之前用户若发送了消息该提醒不会被取消。2. 响应提醒ActionReactToReminderclass ActionReactToReminder(Action): def name(self) - Text: return action_react_to_reminder async def run(self, dispatcher, tracker, domain): name next(tracker.get_slot(PERSON), someone) dispatcher.utter_message(fRemember to call {name}!) return []当 5 秒定时器触发EXTERNAL_reminder意图后规则将其导向本动作从PERSON槽位读取人名默认 someone回复 Remember to call ...!。这正是提醒附带的实体被带回对话上下文的体现。3. 查询对话 IDActionTellIDclass ActionTellID(Action): def name(self) - Text: return action_tell_id async def run(self, dispatcher, tracker, domain): conversation_id tracker.sender_id dispatcher.utter_message(fThe ID of this conversation is {conversation_id}.) dispatcher.utter_message( fTrigger an intent with: \n fcurl -H Content-Type: application/json f-X POST -d \{{name: EXTERNAL_dry_plant, fentities: {{plant: Orchid}}}}\ fhttp://localhost:5005/conversations/{conversation_id} f/trigger_intent?output_channellatest ) return []这是外部事件注入的最佳演示用户问whats the conversation id?机器人打印出当前sender_id并给出可以直接复制的 curl 命令——向trigger_intent端点 POST 一个EXTERNAL_dry_plant意图从而模拟外部系统如湿度传感器发来植物缺水事件。4. 响应外部事件ActionWarnDryclass ActionWarnDry(Action): def name(self) - Text: return action_warn_dry async def run(self, dispatcher, tracker, domain): plant next(tracker.get_latest_entity_values(plant), someone) dispatcher.utter_message(fYour {plant} needs some water!) return []从最新消息的plant实体取值回复你的植物需要浇水。由于 domain 中没有为plant声明槽位这里直接用tracker.get_latest_entity_values(plant)读取事件携带的实体展示了实体不落槽、只随事件流转的轻量用法。5. 取消全部提醒ForgetRemindersclass ForgetReminders(Action): def name(self) - Text: return action_forget_reminders async def run(self, dispatcher, tracker, domain): dispatcher.utter_message(Okay, Ill cancel all your reminders.) # Cancel all reminders return [ReminderCancelled()]ReminderCancelled()不传任何参数时会取消该会话sender_id下的所有提醒也可以传入name、intent、entities精确定位要取消的提醒。源码级原理Reminder 事件如何被调度执行要真正理解 reminderbot需要看到框架内部的处理链。ReminderScheduled 事件的定义事件类定义在 rasa/shared/core/events.py。其构造参数与语义如下参数说明intent到点后要触发的意图名如EXTERNAL_remindertrigger_date_time触发时间UTC 或带时区entities随触发意图一起注入的实体列表name提醒 ID同名提醒只运行最后一个缺省时自动生成 uuidkill_on_user_message为True时触发时间前的用户消息会中止该提醒默认值True注意kill_on_user_message的默认值是True而 reminderbot 显式传了False——这是一个容易被忽略的坑如果想让定时提醒风雨无阻地触发必须显式关闭该开关。调度与触发链路提醒事件的执行由rasa/core/processor.py承担关键调用链如下副作用执行execute_side_effectsprocessor.py依次处理动作产生的事件数组——发送 bot 消息、_schedule_reminders调度提醒、_cancel_reminders取消提醒调度_schedule_remindersprocessor.py遍历事件遇到ReminderScheduled就通过jobs.scheduler()APScheduler 的AsyncIOScheduler见 rasa/core/jobs.py添加一个 date 类型的定时任务run_date为trigger_date_time任务目标为handle_reminder任务 ID 为e.name且replace_existingTrue——这正是同名覆盖的机制来源触发到点后handle_reminderprocessor.py被调用它先检查提醒是否仍有效再检查kill_on_user_message与提醒后是否有用户消息_has_message_after_reminder若应取消则丢弃否则调用trigger_external_user_uttered注入trigger_external_user_utteredprocessor.py将意图与实体包装成一个外部用户消息写入 tracker——该消息在意图名前冠以EXTERNAL:前缀常量见 rasa/shared/core/constants.py并标记IS_EXTERNAL: True随后走常规的预测循环使RulePolicy命中EXTERNAL_reminder规则取消_cancel_remindersprocessor.py遍历调度器中的任务凡是ReminderCancelled事件匹配的任务都会被移除。测试佐证仓库测试 tests/core/test_processor.py 覆盖了上述行为test_reminder_abortedL306-L324构造kill_on_user_messageTrue的提醒随后在 tracker 中加入一条UserUttered(test)再调用handle_reminder断言 tracker 事件数未增加——证明用户消息取消了提醒test_reminder_cancelled_multi_userL342-L396为两个用户各调度一个提醒仅对第一个用户发出ReminderCancelled()断言调度器中只剩一个任务且只有第二个用户收到了greet意图的注入。外部事件注入trigger_intent API除了定时提醒reminderbot 还演示了外部系统主动触发意图。Rasa Server 提供专用端点POST /conversations/conversation_id/trigger_intent其实现位于 rasa/server.py请求体需要name要触发的意图名与可选的entities若意图不在 domain 中会返回 404 错误随后调用agent.trigger_intentrasa/core/agent.py最终同样走trigger_external_user_uttered与提醒触发的路径完全一致。这也解释了为什么提醒与外部事件可以共享同一套虚拟意图 规则的处理逻辑。在 ActionTellID 输出的实际调用中结合output_channellatest可以让回复通过当前对话的活跃通道输出。典型用法模拟传感器事件curl -H Content-Type: application/json \ -X POST -d {name: EXTERNAL_dry_plant, entities: {plant: Orchid}} \ http://localhost:5005/conversations/tester/trigger_intent?output_channellatestentities支持字典简写形式{plant: Orchid}处理器会将其规范化为[{entity: plant, value: Orchid}]再注入见 processor.py 的源码注释。一个完整的交互演练将四个终端训练、action server、callback server、rasa server按前文步骤全部就绪后完整流程如下发送hello到 callback webhook → 机器人回复 What can I do for you?发送 remind me to call John → 机器人回复 I will remind you in 5 seconds.同时调度一个 5 秒后的EXTERNAL_reminder提醒5 秒后无需任何输入机器人主动回复 Remember to call John!John 来自 NLU 提取的 PERSON 实体并随提醒回传发送 whats the conversation id? → 机器人打印当前 sender_id 并给出可直接运行的trigger_intentcurl 命令执行该 curl → 机器人回复 Your Orchid needs some water!发送 forget about it → 机器人回复 Okay, Ill cancel all your reminders.所有待触发的提醒被清除。关键设计要点与常见坑rest 通道与外部事件不兼容credentials.yml 中的注释明确提示 the rest channel does not work with external events演示必须使用 callback 或其他通道kill_on_user_message默认值为True若希望在触发时间前用户说话也不取消提醒务必显式置False同名提醒互相覆盖name相同的ReminderScheduled只有一个会执行可用于更新提醒外部意图必须声明在 domain 并配套规则EXTERNAL_reminder、EXTERNAL_dry_plant若不在 domain.yml 中声明trigger_intent 会直接返回 404提醒与 tracker 存储提醒事件持久化在对话 tracker 中若使用内存 tracker store重启 Rasa Server 后已调度的任务会丢失endpoints.yml 中注释了 redis/mongod 等持久化 tracker store 的配置方式生产环境可按需启用。进一步探索完整的领域、NLU、规则与自定义动作可直接在 examples/reminderbot 目录下查看想理解所有可用的 channel 凭证配置可对照 credentials.yml 中的 facebook、slack、socketio、mattermost 等注释示例更多命令行用法如rasa run --enable-api的完整参数可查阅仓库文档 docs/docs/command-line-interface.mdx提醒事件在更复杂场景如表单配合、多用户隔离下的行为可阅读 tests/core/test_processor.py 中的提醒相关测试用例。小结reminderbot用不到 130 行 NLU 数据、7 条规则和 5 个自定义动作完整覆盖了 Rasa 中机器人主动响应的两条路径基于ReminderScheduled/ReminderCancelled的定时提醒与基于trigger_intent的外部事件注入。理解 actions/actions.py 与 rasa/core/processor.py 的对应关系后你完全可以把这套模式迁移到自己的场景——无论是定时回访、IoT 设备告警还是任何不等用户开口机器人先说话的业务需求。【免费下载链接】rasa Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants项目地址: https://gitcode.com/GitHub_Trending/ra/rasa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

YOLO+大模型:电子元器件检测与智能识别系统实战 2026/9/13 21:06:58

YOLO+大模型:电子元器件检测与智能识别系统实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MSP430货运机器人设计:L298N驱动、红外寻迹与PCB制作实战 2026/9/13 21:06:58

MSP430货运机器人设计:L298N驱动、红外寻迹与PCB制作实战

简介:基于MSP430的小型货运机器人完整设计资料,包含中文毕业设计论文、Protel99SE绘制的硬件原理图与PCB以及软件源码,面向电子、自动化类专业学生和嵌入式开发爱好者,可用作毕业设计、课程项目或工程参考。系统以MSP430单片机为控…

阅读更多 →
AD7745/AD7746电容检测芯片C51驱动详解:I2C与寄存器配置 2026/9/13 21:06:58

AD7745/AD7746电容检测芯片C51驱动详解:I2C与寄存器配置

简介:一套基于C51单片机的AD7745/AD7746电容检测芯片I2C接口驱动源码包,适用于单片机、嵌入式硬件及STM32/ARM平台开发者,可帮助快速掌握通过I2C总线完成芯片初始化、数据读取与错误处理的实现方法。AD7745/AD7746是高精度电容检测ADC&#x…

阅读更多 →
PeakTech P1326:嵌入式硬件架构的PC显示示波器解析 2026/9/13 21:06:58

PeakTech P1326:嵌入式硬件架构的PC显示示波器解析

1. 这台“PC虚拟示波器”到底是什么?不是软件,也不是USB线缆,而是一套完整信号捕获系统 PeakTech P 1326 这个型号,光看名字容易产生误解——很多人第一反应是“哦,又一个靠软件撑场面的虚拟示波器”,甚至以…

阅读更多 →
FunASR OpenAI 兼容 API 低代码工作流接入实战:Dify、n8n 与 Webhook Worker 的 Multipart 转写配方 2026/9/13 21:06:58

FunASR OpenAI 兼容 API 低代码工作流接入实战:Dify、n8n 与 Webhook Worker 的 Multipart 转写配方

FunASR OpenAI 兼容 API 低代码工作流接入实战:Dify、n8n 与 Webhook Worker 的 Multipart 转写配方 【免费下载链接】FunASR Open-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, …

阅读更多 →
LSOD 数据集介绍、下载及YOLO/VOC/COCO训练格式转换 2026/9/13 21:03:58

LSOD 数据集介绍、下载及YOLO/VOC/COCO训练格式转换

LSOD 完整数据集下载目录 同时包含三种主流标注格式:COCO JSON、VOC XML、YOLO TXT LSOD 数据集🌊:数据集介绍、下载📥 | 目标检测 | 水平框📌|原始图像✅|VOC标签✅ | COCO 标签✅ | YOLO 标…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞