Я бы посоветовал вам использовать намерения для каждого параметра, который вам требуется, вместо использования сущностей.Это решит две проблемы:
- Если пользователь не введет правильное значение для требуемого параметра, диалоговое окно не будет задавать один и тот же вопрос снова и снова в цикле
- Вы можете контролировать, какой параметрдля заполнения следующих
Предположим, вам требуются 3 параметра для покупки часов: цвет, дата / дата-время, стоимость
Ваш агент будет иметь следующие намерения:
- buy_watch -> input_context = Нет, output_context = buy_watch
Я хочу купить часы
Я хочу купить часы черного цвета
... - get_color -> input_context = color, output_context = buy_watch
Black
Я хочу его в черном
... - get_date -> input_context = date, output_context = buy_watch
я хочу это завтра
я хочу это на следующей неделе
(которое будет захватывать как дату, так и диапазон дат и ни для чего другого, вы можете иметь логику для назначениязначение для параметра, если вы получаете любой из них) - гet_cost -> input_context = cost, output_context = buy_watch
около 10000
бюджет составляет 15k - got_all_details -> event = e_got_all_details
Для каждого намерения у вас будут необязательные все 3 параметра.
Кроме того, вам необходимо установить значение параметра по умолчанию равным $entity
для собственного намерения и #context.entity
для других параметров.
Например, в намерении get_color
у вас будут следующие параметры и значения по умолчанию:
color = $color
date = #buy_watch.date
cost = #buy_watch.cost
Наконец, вам придется вызывать webhook для всех вышеуказанных намерений.
В webhook выПридется проверить параметры входящего намерения и установить output_context + response_message в соответствии с отсутствующим параметром.
params = intent_request["query_result"]["parameters"]
case 1 --> if not params["color"]: set output_context = color and response = what color do you want
case 2 --> if not params["date"]: set output_context = date and response = when do you want to buy
case 3 --> if not params["cost"]: set output_context = cost and response = what is your budget
case 4 --> if you get all params: call event e_got_all_details
Intent got_all_details
будет вызываться через событие, когда вы получите все параметры, независимо от того, в каком порядке вы их получите.
В зависимости от output_context ответа и input_context , которые вы настроили в своем намерении, будет инициировано правильное намерение, и вы сможете получить правильные значения.
У меня была похожая проблема, и, на мой взгляд, это был наиболее эффективный способ ее решения для проверки параметров и обработки, когда вы получаете неожиданные значения (с использованием намеренных резервных намерений).
Редактировать 1: Там будет одна дополнительная логика для присвоения значения дате, в зависимости от того, получили ли вы его из даты или объекта диапазона дат.
if params["date"] or params["date-range"]:
date = params["date"] if params["date"] else params["date-range"]
Все намерения будут иметь обучающие фразы, которые будут пытаться захватить параметры без какого-либо порядка, но не отмечать их как обязательные.
Итак, если пользователь говорит , я хочу купитьсмотреть завтра , buy_watch
намерение будет запущено с параметром даты.Код проверит цвет и стоимость, пропущенные и предложит это после установки соответствующего output_context
.
Надеюсь, это поможет.