AI

分类下相关文章

对话机器人 Rasa(二十四):两例多返回额外消息的 bug 定位

今天又遇到一例 Rasa 对话多返回额外消息的 Bug,结合之前遇到的另外一例,都非常具有代表性, 有必要总结一下。避免之后再出现此类问题,浪费时间去调试。 具体细节就不贴日志了,直接上结论。 现象 表现的现象都是一样的,就是本来用过对一个消息返回一条回复,例如: response1 但是实际返回是 [response1, response2] 多返回了一条。而且这条还是固定的,但是找不到关联性在哪里。 Bug 1:未加 slot_was_set,导致两个 story 没有区分度 custom action 中对查询到数据和未查询到做了不同的回复。 但是由于没有区分,导致在返回查询结果时,总 ...

阅读全文...

对话机器人 Rasa(二十三):重置 slot 的值

需求 在每次 rasa form 获取用户输入之后,将这个过程中用到的 slot 值重置。 即,置为 None。 防止下次进入同一个 form 时,slot 非空的情况导致未提示用户输入就进入之后的流程。 slot 重置 custom action 中,return 列表中加入 SlotSet 即可。例如: 在获取用户名之后,将用户名重置: return [ SlotSet("name", None), ] 错误的做法 SlotSet("name", None), return [ ] 这样,并不会生效。 custom action 中 retu ...

阅读全文...

对话机器人 Rasa(二十二):返回自定义补充字段

需求 前端访问 Rasa 接口获取聊天对话的应答信息,除了想获取 text,和 buttons 之外,还想获取额外的信息。 例如,多个操作按钮对应的 item id。 查了很久才找到一点线索,然后尝试了一圈,发现两个可行的方法。 方案一: custom action 直接在 custom action python 代码中,utter_message 中指定 custom 字典参数: custom_data = { "field1": "value1", "field2": "value2", "i ...

阅读全文...

对话机器人 Rasa(二十):Custom Action 中无法读取 Slot 值

现象 rasa custom action 中的代码,无法获取到 slot 值: items = tracker.get_slot("items") 而我确实在之前的流程中已经设置了 slot 的值 return [ SlotSet("items", items), FollowupAction("action_a"), ] 疑惑 通过打印日志,可以确定的是,赋给 slot 的值不是空。 可是为何获取不到呢? 我怀疑是 story 中没有加入对应的流程,即 slot_was_set 逻辑。 解决方法 测试了一下,确实如此,加入 ...

阅读全文...

对话机器人 Rasa(十九):rasa 不同客户端类型区分处理 custom channel

使用场景 例如,用 Rasa 实现一个自动聊天机器人,要同时实现多端: 网页端 微信小程序端 Android / iOS 原生 App 端 Windows 端 每一端的回复内容会有些许差异,如: utter_greet 网页端:欢迎使用大象计算器,地球上最不强大的计算器 微信小程序端:欢迎使用大象计算器微信小程序,您也可以关注大象工具公众号接收各种骚扰信息 突然想到 Rasa channel 是否可以实现这个功能,于是查了一下官方文档,看起来很挺合适。 不同 channel 返回不同 response 参考: https://rasa.com/docs/rasa/connectors/ ...

阅读全文...

对话机器人 Rasa(十七):python custom actions 将 list 或 dict 存储到 slot

需求场景 在 rasa custom actions 的 python 代码中,需要调用一些三方 http api,并对查询结果进行缓存。 例如,调用天气查询接口一次查询未来三天的天气。将三天的结果放到一个 slot 中缓存。然后,用户通过聊天对话询问某一天的天气时,就可以直接返回 cache 中的结果,无需每次都调用三方接口。 rasa slot 是否支持 list,dict 类型 之前只用过 slot 存储 text,number 这样简单的基础数据类型。不确定是否支持 list 和 dict 这样的类型。 查了一下 rasa 的官方文档,确实支持,只需要将 slot 类型设置成 any。 ...

阅读全文...

对话机器人 Rasa(十六):rasa command not found

在给家里台式机增加了块新 SSD 之后,终于有足够的空间可以安装 Rasa 了。。。 参照 开源对话机器人框架 Rasa (一):安装 中的流程使用 pip3 安装了rasa 之后。 执行: > rasa --version rasa: command not found 却发现 rasa 没有找到。 实际的 rasa 安装路径为: /home/zhongwei/.local/bin/rasa 说明 $HOME/.local 不在 PATH 中。 修改 ~/.bashrc 添加 export PATH=$PATH:$HOME/.local/bin 使配置生效 source ~/.b ...

阅读全文...

对话机器人 Rasa(十五):slot type 与 influence conversation

domain.yml 中的 slot 配置 以下是一段有问题的 slot 配置 slots: email: type: any influence_conversation: true mappings: - type: from_text conditions: - active_loop: email_form 训练时的错误信息 > rasa train --force InvalidSlotConfigError: An AnySlot cannot be featurized. Please use a dif ...

阅读全文...

对话机器人 Rasa(十四):Botfront 自带的 MongoDB 端口问题

漏洞现象 在部署好 botfront,并创建了管理员账号之后,第二天发现账号消失了。 我本以为是本地目录权限问题,导致 mongodb 没有将数据写入磁盘。 但是,修改了本地目录权限之后,这个问题又出现了。 感觉出大问题了。 查看 mongodb 日志 通过 docker logs 查看了 mongodb 镜像的日志。 {"t":{"$date":"2023-07-10T12:33:33.424+00:00"},"s":"I", "c":"-", ...

阅读全文...

对话机器人 Rasa(十三):GUI 管理系统 Botfront 部署

Botfront 是一个非常方便的 Rasa GUI 图形化管理后台。可以在网页里: 编辑所有的 Rasa 配置文件 执行训练 使用 web 聊天组件 非常适合没有 linux 服务器操作经验的用户。 整个安装配置过程参考 https://botfront.io/docs/installation/server-cluster 即可。 这里只是记录一下文档中没有提及的细节。 版本 botfront@1.0.5 目录结构 $ tree -a . ├── .botfront │   ├── botfront.yml │   └── docker-compose-template.yml ├── ...

阅读全文...

对话机器人 Rasa(十二):用户会话 Session 管理

Rasa 可以管理用户 session,每个 session 由 conversation_id 唯一标识。 当你从 web 聊天组件或者 telegram app, fackbook messager 等不同的 channel 向 rasa webhook 发送一条消息时, 你所指定的 sender_id 即被转换为 conversation_id, 然后传递给 Rasa Core。 注意,默认情况下,Rasa session 是存储在内存中,即一旦你关闭 rasa 服务,session 就会丢失。 可以通过将对话信息存储到数据库来解决这个问题,例如,MongoTrackerStore, R ...

阅读全文...

对话机器人 Rasa(十一):custom actions 中使用 python 设置 slot 值

例如,我想在 Rasa 对话过程中,缓存当前用户选择的服务 ID。 方便在调用其他业务接口时使用该 slot 的值。 custom actions 代码示例 actions.py 中,假设要将 my_slot 设置为 some_value: from typing import Any, Text, Dict, List from rasa_sdk import Action, Tracker from rasa_sdk.events import SlotSet class MyCustomAction(Action): def name(self) -> Text: ...

阅读全文...

对话机器人 Rasa(十): 回复消息格式化,加粗换行等

例如,我想在 Rasa actions.py 中,对 dispatcher.utter_message 返回的消息进行格式化。 加粗 这里类似 Markdown 的语法,需要加粗的文本前后加双星号即可。 换行 使用 \n Rasa 会自动 trim 掉前后的空格。 示例: dispatcher.utter_message( text=f"**Reservation No.{index+1}** \n Name: {item['name']}" ) 效果: 注意 如果换了其他前端方案,例如 ChatUI,就不支持 markdown 语法了。需要自己去兼容。 ...

阅读全文...

对话机器人 Rasa(九): docker compose 同时部署 rasa core 和 actions 服务

尝试手动启动了两个 docker containter: 一个用于 rasa core 一个用于 rasa actions 但是,发现测试对话不涉及 actions 服务的,一切正常返回; 但是跟 actions 相关的,没有任何返回。 查看 docker 容器日志 docker logs -f <containter-id> 这样就能实时查看 docker 容器中 rasa 的运行日志,跟 tail -f 效果等同。非常方便。 异常日志 查看了一下 rasa core 的日志: rasa.shared.exceptions.RasaException: Failed to ...

阅读全文...

对话机器人 Rasa(八): actions 通过 Python 查询天气信息

非常典型地一个应用场景,即通过 rasa 从提交消息中提取城市和时间,然后调用三方天气接口查询天气,再返回用户。 但是按照官方文档,及电子书,网上资料里配置,jieba dict 也好,lookup table 也好,都会因为 DIETClassifier 报奇怪的异常。我感觉是版本的 bug,目前还没有定位到问题。 折腾了两天,没有头绪,看了部分 rasa 源代码,印象也非常不好,许多配置规则没有在文档中体现,需要看源码才能理清。 距离这个项目验收的时间不多了,我也懒得折腾,干脆直接在 actions 中直接获取消息原文,用 python 通过正则提取 entity,这本应由 DIETCla ...

阅读全文...