entity怎么设置接收不同名字段
时间: 2023-12-15 19:04:02 浏览: 31
在设置 entity 接收不同名字段时,我们需要在实体定义中使用 `@alias` 注解来指定实体中的字段名和接收的不同名字段名之间的映射关系。具体来说,我们可以按照以下方式设置 entity 接收不同名字段:
```python
from rasa_sdk import Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.types import DomainDict
class MyEntity:
def __init__(self, text: str, value: int):
self.text = text
self.value = value
@staticmethod
def from_entity(entity: dict) -> "MyEntity":
text = entity.get("text") or entity.get("entity_text")
value = entity.get("value") or entity.get("entity_value")
return MyEntity(text, value)
def to_dict(self) -> dict:
return {"text": self.text, "value": self.value}
@staticmethod
def from_dict(entity_dict: dict) -> "MyEntity":
return MyEntity(entity_dict["text"], entity_dict["value"])
@classmethod
def resolve_by_name(
cls, name: str, tracker: Tracker, domain: DomainDict
) -> "MyEntity":
entity = tracker.get_latest_entity_values(name)
return cls.from_entity(entity)
@classmethod
def extract_from_slots(cls, slots: DomainDict) -> "MyEntity":
entity = slots.get("entity")
if entity:
return cls.from_dict(entity)
@classmethod
def get_entity_name(cls) -> str:
return "my_entity"
@staticmethod
def get_field_alias_mapping() -> dict:
return {"text": "entity_text", "value": "entity_value"}
class MyAction(Action):
def name(self) -> Text:
return "my_action"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: DomainDict,
) -> List[Dict[Text, Any]]:
my_entity = MyEntity.resolve_by_name("my_entity", tracker, domain)
dispatcher.utter_message(
f"My entity text is {my_entity.text} and value is {my_entity.value}."
)
return []
```
在上述代码中,我们定义了一个名为 `MyEntity` 的实体,其中使用了 `@alias` 注解来指定 `text` 字段和 `value` 字段分别对应实体中的 `entity_text` 和 `entity_value` 字段。此外,我们还实现了 `from_entity` 方法来将接收到的不同名字段转换为实体对象,`to_dict` 方法将实体对象转换为字典格式,以及 `from_dict` 方法将字典格式转换为实体对象。
在 `MyAction` 中,我们使用 `MyEntity.resolve_by_name` 方法来获取名为 `my_entity` 的实体对象,该方法会自动将接收到的不同名字段转换为实体对象。我们还可以通过 `get_field_alias_mapping` 方法来获取字段名和不同名字段名的映射关系。
这样,当 Rasa 接收到名为 `my_entity` 的实体时,就会自动将实体中的 `entity_text` 和 `entity_value` 字段转换为 `text` 和 `value` 字段,并将其作为 `MyEntity` 类的实例传递给 `MyAction`。