Перейти к содержанию

Сопоставление слотов

Сопоставление слотов

Cопоставление слотов (slot mapping) — это процесс, который определяет, как значения слотов заполняются на основе данных, полученных от пользователя. Это может происходить автоматически (например, извлечение сущностей из сообщения) или вручную (например, через кастомные действия).

Содержание инструкции:


Как работает процесс сопоставления?

  1. Получение сообщения:

    Пользователь отправляет сообщение (например, "Меня зовут Алексей").

  2. Извлечение данных:

    NLU модель обрабатывает сообщение и извлекает намерения и сущности (например, сущность name со значением "Алексей").

  3. Сопоставление слотов:

    Система проверяет, задано ли сопоставление для слота user_name с сущностью name.

    Если сопоставление найдено, слот user_name заполняется значением "Алексей".

  4. Сохранение значения:

    Значение слота сохраняется и может быть использовано в дальнейшем диалоге.


Типы сопоставления слотов (Slot Mapping)

Существует несколько способов сопоставления слотов:

1. Извлечение из сущности (from_entity)

Слот заполняется значением, извлеченным из сущности в сообщении пользователя.

Пример:

slots:
  user_name:
    type: text
    mappings:
      - type: from_entity
        entity: name

Если пользователь говорит: "Меня зовут Алексей", и сущность name извлечена как "Алексей", то слот user_name будет заполнен значением "Алексей".

2. Извлечение из текста (from_text)

Слот заполняется всем текстом сообщения пользователя.

Пример:

slots:
  user_feedback:
    type: text
    mappings:
      - type: from_text

Если пользователь говорит: "Мне понравился ваш сервис!", то слот user_feedback будет заполнен этим текстом.

3. Извлечение из интента (from_intent)

Слот заполняется на основе намерения пользователя.

Пример:

slots:
  user_agreed:
    type: bool
    mappings:
      - type: from_intent
        intent: affirm
        value: true
      - type: from_intent
        intent: deny
        value: false

Если пользователь говорит: "Да" (интент affirm), слот user_agreed будет заполнен значением true.

4. Извлечение из триггерного интента (from_trigger_intent)

Слот заполняется, если диалог был запущен определенным интентом.

Пример:

slots:
  special_offer:
    type: text
    mappings:
      - type: from_trigger_intent
        intent: ask_special_offer
        value: "special_discount"

5. Ручное заполнение через кастомные действия

Слоты могут быть заполнены вручную через кастомные действия (custom actions).

Пример:

from rasa_sdk import Action
from rasa_sdk.events import SlotSet

class ActionSetUserAge(Action):
    def name(self):
        return "action_set_user_age"

    def run(self, dispatcher, tracker, domain):
        age = tracker.get_slot("user_age")
        if not age:
            return [SlotSet("user_age", 25)]  # Установка значения слота
        return []

Приоритеты сопоставления

Если для слота определено несколько сопоставлений, система использует первое подходящее.

Пример:

slots:
  user_name:
    type: text
    mappings:
      - type: from_entity
        entity: name
      - type: from_text
  • Если сущность name найдена, слот будет заполнен из сущности.
  • Если сущность не найдена, слот будет заполнен текстом сообщения.

Кастомная логика сопоставления

Если стандартные способы сопоставления не подходят, вы можете использовать кастомные действия для заполнения слотов.

Пример:

from rasa_sdk import Action
from rasa_sdk.events import SlotSet

class ActionExtractUserName(Action):
    def name(self):
        return "action_extract_user_name"

    def run(self, dispatcher, tracker, domain):
        user_message = tracker.latest_message.get("text")
        # Логика извлечения имени
        user_name = extract_name(user_message)  # Ваша функция
        return [SlotSet("user_name", user_name)]