Как сохранить контекст конвертации с помощью amazon lex? - PullRequest
0 голосов
/ 23 декабря 2018

Как мне сохранить контекст разговора в amazon lex, я читал об использовании атрибутов сеанса, но я не нашел никаких примеров.

Вот пример того, как я хочу, чтобы разговор состоялся:

Температурное намерение:

Человек: Какая температура в Нью-Йорке?

Бот: температура в Нью-Йорке составляет 3 градуса по Цельсию

Влажность Интент:

Человек: А как насчет Влажности?

Бот: TheВлажность в Нью-Йорке составляет 61%

Как я могу заставить бота узнать, что я говорю о Нью-Йорке, когда спрашиваю о влажности?

1 Ответ

0 голосов
/ 24 декабря 2018

Поскольку вы не указали, какой язык вы используете, я отвечу, используя 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}?"
                                }
                              );
        }

Лучший способ понять, как это работает, - изучить соответствующий Blueprint для вашего языка по вашему выбору.Надеюсь, это помогло вам!

Редактировать: Дополнительные чтение доступных чертежей, которые могут быть полезны для вас. Подробнее сведения о потоке информации при использовании атрибутов сеанса в Lex.

...