Работа с диалоговой памятью

Перед началом разработки системы распознавания intents в Datalingvo, мы постарались формально описать алгоритм разбора и понимания вопросов собеседника в диалоге. Основной задачей было понять как соотносится процесс получения всей необходимой для понимания вопроса информации с контекстом беседы.

Разбор вопроса

Главная задача при разборе пользовательского запроса — распознать в нем все необходимые для его интерпретации сущности.

  • Вопрос “Какая погода сейчас в Токио?” — понятен, так как он содержит и тему вопроса и все необходимые для понимания данной темы параметры: место и время.
  • Вопрос “сейчас в Токио?” непонятен, так как неясна тема вопроса.
  • Вопрос — “какая погода?” тоже не до конца понятен, так как не определены необходимые для данной темы параметры — место и время.

Иногда мы можем использовать значения по умолчанию такие как “дата“ — прямо сейчас и “место“ — какое-то географическое местоположение по умолчанию для задавшего вопрос. Иногда это работает, а иногда ответ будет абсолютно неверен — особенно когда существует контекст беседы.

Когда мы первый раз спрашиваем что-то у нашего собеседника, будь то незнакомый человек, наш старый друг, или даже чатбот общего профиля — мы формулируем наш вопрос максимально правильно и полно, не пропуская ни одного значимого слова.

Иными словами наш вопрос должен содержать всю необходимую информацию, позволяющую на него ответить, не переспрашивая и не задавая уточняющих вопросов.

“Ты знаешь сейчас какая погода в Токио”? — полный и однозначный вопрос.

Примечание. Первый вопрос — не обязательно тот с которого мы начинаем беседу. Это может быть первый вопрос в рамках новой темы текущей беседы.

Небольшое отступление. Очевидно, что мы рассматриваем немного неестественный вопрос при общении между двумя людьми, проще поискать в интернете и узнать все самому, но, предположим Ваш друг, в силу каких-либо причин, обладает эксклюзивной информацией на этот счет. Примем данное допущение в нашем примере, так как для обсуждения работы диалоговой памяти удобен именно такой простой пример.

Сущности

Ниже перечислены сущности, выделенные из вопроса и необходимые для его понимания

  • “погода“ — предмет разговора, мы спрашиваем именно о погоде. В данном случае слово “погода“ — индикатор тематики вопроса, а не параметр с различными допустимыми вариантами значений.
  • “сейчас“ — мы хотим получить информацию на сегодняшний день. В данном случае мы опираемся на значение “сегодня“ параметра “дата“.
  • “Токио“ — нас интересует погода в этом городе, то есть мы используем параметр “город“, со значением “Токио“.

Обратите внимание на два различающихся типа сущностей в вопросе.

  • Сущности, идентифицирующие некую тематику, и не имеющие конкретных значений. В нашем примере — “погода“ — это сущность, указывающая на тему вопроса и не имеющая списка значений.
  • Сущности, имеющие значения. В нашем примере “сейчас“ — значение неявно присутствующей в вопросе сущности “дата” и “Токио“ — значение неявно присутствующей в вопросе сущности “город”. Дополнительно стоит отметить, что значения подобных сущностей дискретны.

Неполные вопросы

Все последующие диалоговые вопросы на данную тему могут быть сформулированы более кратко:

  • “А что в Киото?“

Опущен предмет разговора и дата. Получив такой вопрос, мы предполагаем, что по прежнему говорим о погоде и о сегодняшнем дне.

  • “A завтра какая?“

Предполагаем, что мы по прежнему говорим о погоде, но уже на завтрашний день. Город мы подразумеваем последний упомянутый.

Мы будем называть такие вопросы “неполными”. Неполные вопросы не могут быть распознаны вне контекста, то есть если они были заданы первыми в беседе. Сами по себе они не содержат необходимого и достаточного набора сущностей для их понимания.

В контексте беседы мы можем ограничиться неполными вопросами, переопределяя лишь одну или две сущности из трех необходимых в данном примере. Остальные же сущности, при анализе вопроса, берутся из памяти, то есть из контекста беседы или так называемой, диалоговой памяти.

Кратковременность памяти

Какое основное свойство подобного рода диалоговой памяти? Она относительно кратковременна.

Если Вы позвоните другу через 2 дня после последнего разговора и спросите: “А послезавтра какая?“ он даже не поймет вас. Он утратил контекст беседы. Вам придется терпеливо переспрашивать его заново, используя все те три сущности, про которые мы говорили выше, и лишь после этого вы снова сможете снова какое-то время задавать новые вопросы в сокращенной форме.

Смена контекста беседы

Если Вы резко меняете контекст беседы и при этом задаете четко сформулированный полный вопрос со всеми необходимыми и достаточными данными для его понимания — вы сбрасываете контекст беседы.

Мы продолжаем разговор о погоде и вдруг:

  • “Сколько стоит кофе в Старбакс?“

Все дальнейшие неполные вопросы уже имеют отношение или к кофе или к заведению Старбакс.

  • “А в Макдональдс?“

Вероятно, вы хотели узнать цену кофе в Макдональдс.

  • “А почем там донатсы?“

Если этот вопрос задан вторым — вам ответят про стоимость донатсов в Старбакс.

Если третьим — то в Макдональдс, так как значение параметра, идентифицирующего заведение, второго вопроса в данном случае вытеснит соответствующее значение первого. То есть мы забыли о Старбакс и говорим теперь о Макдональдс.

Заменяемые сущности

Обратите внимание на то, что в диалоге вытесняют друг друга только сущности, имеющие значения одного типа, а сущности, не имеющие значений, чаще всего не могут быть заменены вовсе.

Мы можем переспросить о погоде, заменив дату или город, но понятие погода не может быть замещено, и появление новой подобной сущности в вопросе чаще всего означает смену темы беседы.

Явная смена контекста

Иногда тему разговора лучше сбросить принудительно, не дожидаясь пока собеседник сам о ней забудет. Так следует поступить, если вы не хотите или не можете сформулировать строгий вопрос, однозначно идентифицирующий новую тему.

Пример

Ваш последний вопрос собеседнику был “Какая погода в Токио?”

Вам ответили.

  • Если Вы тут же выдадите восклицание “Лучше в Нью-Йорк!” — Вам, вероятно, вернут информацию о погоде в Нью-Йорке в настоящее время, ведь в памяти еще жив индикатор беседы ”погода” и “дата“ по умолчанию ”сегодня”.
  • Если же Вы предварительно сбросите тему — “Все! хватит о погоде! Забудем про это“` — то Вас как минимум переспросят — что значит “Лучше в Нью-Йорк!”? Едем туда? Заказываем билеты? Бронируем отпуск? То есть попробуют уточнить ваш запрос, а не станут пытаться неловко поддержать уже законченную вами тему.

Подведем итоги

Соберем воедино и сформулируем еще раз все то, что мы уже обсуждали до этого.

  • Если в середине беседы задаются “неполные” вопросы — значения недостающих сущностей могут быть получены из диалоговой памяти.
  • Значения сущностей могут быть вытеснены в памяти новыми, более актуальными значениями, относящимися к той же сущности.
  • Появление в вопросе новой сущности, не имеющей значений, свидетельствует, скорее всего, о смене темы беседы.
  • Диалоговая память кратковременна и сама очистится через какое-то время или же может быть сброшена принудительно.
  • Принудительная очистка памяти может помочь при определении темы последующего вопроса и упросить поиск соответствующего ему intent.

Заключение

Следуя логике приведенных простых правил, мы можем проектировать наши диалоги в стиле максимально приближенном к естественному человеческому общению, но и не усложняя чрезмерно систему без излишней на то надобности.

Излишнее усложнение подобных систем приносит как правило совсем немного совершенно неочевидных плюсов, а также значительно усложняет систему, затрудняет отладку и формирует совершенно непредсказуемую логику ответов.

Старайтесь быть проще — пользуйтесь контекстом беседы, когда это удобно и нужно, и наоборот, очищайте память, если хотите форсировать смену темы разговора.