Как сохранить контекст конвертации с помощью amazon lex?
Как я могу сохранить контекст разговора в amazon lex, я читал об использовании атрибутов сеанса, но я не нашел никаких примеров.
Вот пример того, как я хочу, чтобы разговор продолжался:
Намерение температуры:
Человек: Какая температура в Нью-Йорке?
Бот: температура в Нью-Йорке 3 градуса по Цельсию
HumidityIntent:
Человек: А как насчет влажности?
Бот: влажность в Нью-Йорке составляет 61%
Как я могу заставить бота узнать, что я говорю о Нью-Йорке, когда спрашиваю о влажности?
1 ответ
Поскольку вы не указали, какой язык вы используете, я отвечу, используя C# (именно это я и использовал).
Контекст разговора достигается с помощью атрибутов сеанса. В случае C# самый простой способ добиться этого - использовать функции AWS Lambda. Вот пример, предоставленный самой Amazon (с использованием проекта BookTrip для Amazon Lex):
// Extract slots from Lex Event
var slots = lexEvent.CurrentIntent.Slots;
// Extract Session Attributes if they exist, otherwise create new Dictionary
var sessionAttributes = lexEvent.SessionAttributes ?? new Dictionary<string, string>();
Reservation lastConfirmedReservation = null;
// if previous Reservation from Session Attributes exists
if (slots.ContainsKey(LAST_CONFIRMED_RESERVATION_SESSION_ATTRIBUTE))
{
lastConfirmedReservation = DeserializeReservation(slots[LAST_CONFIRMED_RESERVATION_SESSION_ATTRIBUTE]);
}
string confirmationContext = sessionAttributes.ContainsKey("confirmationContext") ? sessionAttributes["confirmationContext"] : null;
if (lastConfirmedReservation != null &&
string.Equals(lastConfirmedReservation.ReservationType, "Hotel", StringComparison.Ordinal))
{
// If there was a previous reservation - auto-populate to match
sessionAttributes["confirmationContext"] = "AutoPopulate";
return ConfirmIntent(
sessionAttributes,
lexEvent.CurrentIntent.Name,
new Dictionary<string, string>
{
{PICK_UP_CITY_SLOT, lastConfirmedReservation.PickUpCity },
{PICK_UP_DATE_SLOT, lastConfirmedReservation.CheckInDate },
{RETURN_DATE_SLOT, DateTime.Parse(lastConfirmedReservation.CheckInDate).AddDays(int.Parse(lastConfirmedReservation.Nights)).ToUniversalTime().ToString(CultureInfo.InvariantCulture) },
{CAR_TYPE_SLOT, null },
{DRIVER_AGE_SLOT, null },
},
new LexResponse.LexMessage
{
ContentType = MESSAGE_CONTENT_TYPE,
Content = $"Is this car rental for your {lastConfirmedReservation.Nights} night stay in {lastConfirmedReservation.Location} on {lastConfirmedReservation.CheckInDate}?"
}
);
}
Лучший способ понять, как это работает, - изучить соответствующий проект для вашего языка. Надеюсь, это помогло вам!
Изменить: Дополнительное чтение доступных чертежей, которые могут быть полезны для вас. Подробнее о потоке информации при использовании атрибутов сеанса в Lex.