微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解 RASA 表格 我的目标:当前状态:我的 RASA 项目文件:

如何解决了解 RASA 表格 我的目标:当前状态:我的 RASA 项目文件:

我的目标:

我正在尝试使用 Forms 为我的 RASA 助手实现一个简单的报告规则,其工作方式如下:

User: "I want to report something."
Assistant: "Please describe your problem in the following message."
User: <short description of problem>
Assistant: "Thank you for report."

我希望,来自用户的整个报告消息将在 report_message 插槽中保存为文本(字符串),这也是我的主要目标。我遵循了 RASA 的官方文档,可能遗漏了一些重要的内容或在某处犯了错误,但我无法找出我做错了什么。

当前状态:

当前的实现是这样的:

User: "I want to report something."
Assistant: "Thank you for report."

Assistant 完全忽略 utter_ask_report_message 并且 report_message 插槽填充了我的 report 意图 - I want to report something. 的文本内容

我的 RASA 项目文件

nlu.yml

version: "2.0"

nlu:
  - intent: report
    examples: |
      - I want to report something.
      - I want to report a problem.
      - I want to report a bug.
      - #report

rules.yml

version: "2.0"

rules:
  - rule: Activate report_message_form
    steps:
      - intent: report
      - action: report_message_form
      - active_loop: report_message_form

  - rule: Submit report_message_form
    condition:
      - active_loop: report_message_form
    steps:
      - action: report_message_form
      - active_loop: null
      - slot_was_set:
          - requested_slot: null
      - action: utter_success_report_message_form

domain.yml

version: "2.0"

actions:
  - validate_report_message_form

intents:
  - report

entities:
  - report_message

slots:
  report_message:
    type: text

forms:
  report_message_form:
    report_message:
      - type: from_text
        intent: report

responses:
  utter_ask_report_message:
    - text: "Please describe your problem in the following message."

  utter_success_report_message_form:
    - text: "Thank you for report."

actions.py

from typing import Dict,Text,List,Optional,Any

from rasa_sdk import Tracker
from rasa_sdk.executor import Collectingdispatcher
from rasa_sdk.forms import FormValidationAction
from rasa_sdk.types import DomainDict


class ValidateReportMessageForm(FormValidationAction):
    def name(self) -> Text:
        return "validate_report_message_form"

    async def required_slots(
        self,slots_mapped_in_domain: List[Text],dispatcher: Collectingdispatcher,tracker: Tracker,domain: DomainDict
    ) -> Optional[List[Text]]:
        return slots_mapped_in_domain + ["report_message"]

    async def extract_report_message(
        self,domain: Dict
    ) -> Dict[Text,Any]:
        text_of_last_user_message = tracker.latest_message.get("text")
        return {"report_message": text_of_last_user_message}

感谢您的每一个帮助和建议。 ?

解决方法

问题在于您对 validate_report_message_form 的实现。在激活表单期间也会调用此操作,这意味着 extract_report_message 将使用激活表单的消息文本填充它。您可以通过添加 if tracker.slots["requested_slot"] == "report_message" 的检查来解决此问题,以确保仅在 Rasa Open Source 请求用户填充插槽时才设置此插槽。

from typing import Dict,Text,List,Optional,Any

from rasa_sdk import Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.forms import FormValidationAction
from rasa_sdk.types import DomainDict


class ValidateReportMessageForm(FormValidationAction):
    def name(self) -> Text:
        return "validate_report_message_form"

    async def required_slots(
        self,slots_mapped_in_domain: List[Text],dispatcher: CollectingDispatcher,tracker: Tracker,domain: DomainDict
    ) -> Optional[List[Text]]:
        return slots_mapped_in_domain + ["report_message"]

    async def extract_report_message(
        self,domain: Dict
    ) -> Dict[Text,Any]:
        if not tracker.slots["requested_slot"] == "report_message":
          return {}

        text_of_last_user_message = tracker.latest_message.get("text")
        return {"report_message": text_of_last_user_message}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。