Сопоставление слотов¶
Сопоставление слотов¶
Cопоставление слотов (slot mapping) — это процесс, который определяет, как значения слотов заполняются на основе данных, полученных от пользователя. Это может происходить автоматически (например, извлечение сущностей из сообщения) или вручную (например, через кастомные действия).
Содержание инструкции:
Как работает процесс сопоставления?¶
-
Получение сообщения:
Пользователь отправляет сообщение (например, "Меня зовут Алексей").
-
Извлечение данных:
NLU модель обрабатывает сообщение и извлекает намерения и сущности (например, сущность
name
со значением "Алексей"). -
Сопоставление слотов:
Система проверяет, задано ли сопоставление для слота
user_name
с сущностьюname
.Если сопоставление найдено, слот
user_name
заполняется значением "Алексей". -
Сохранение значения:
Значение слота сохраняется и может быть использовано в дальнейшем диалоге.
Типы сопоставления слотов (Slot Mapping)¶
Существует несколько способов сопоставления слотов:
1. Извлечение из сущности (from_entity
)¶
Слот заполняется значением, извлеченным из сущности в сообщении пользователя.
Пример:
Если пользователь говорит: "Меня зовут Алексей", и сущность name
извлечена как "Алексей", то слот user_name
будет заполнен значением "Алексей".
2. Извлечение из текста (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 []
Приоритеты сопоставления¶
Если для слота определено несколько сопоставлений, система использует первое подходящее.
Пример:
- Если сущность
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)]