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

В процессе работы над чат-ботом я столкнулся с необходимостью антиципировать (то есть предвосхищать) развитие диалога. Раньше об этом как-то не задумывался, а тут – решая, какие слова вкладывать в компьютерные уста в ответ на ту или иную человеческую фразу, – пришлось поразмыслить.

Выводы показались мне небезынтересными. Они лежат на поверхности проблематики и, возможно, не станут откровением для тех, кто занимался ИИ ранее, однако прямых формулировок в печати я не встречал. Посему приступим…

Диалог человека и чат-бота: человек что-то говорит, чат-бот должен ответить разумно. Кажется, что основная трудность программирования в непредсказуемости того, что будет сейчас произнесено человеком, ведь человек может произнести буквально что угодно. А если что угодно, то подобрать разумный ответ затруднительно: список ответов на непредсказуемые вопросы должен быть бесконечен, но бесконечность технически неосуществима. Следовательно, чат-бот должен «понимать», что сообщил ему собеседник – далее по накатанной разработчиками ИИ колее, далеко за границы объявленной темы…

Юмор ситуации в том, что добиваться от чат-бота «понимания», «осмысливания» фразы собеседника нет не только возможности, но и особой необходимости, по той причине, что… сами люди так не общаются. Если вы считаете, что люди анализируют услышанное при помощи мыслительного аппарата – мозга, затем на основе анализа озвучивают ответ, то общение происходит не совсем так, оно происходит иначе.

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

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

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

В реальности общение между людьми происходит немного не так, как предполагается по умолчанию:

  • собеседник что-то говорит,
  • вы анализируете услышанную фразу и выдаете ответ.

В реальности общение между людьми происходит так:

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

Это и есть антиципация, и ее законы применимы не только к разговорам с людьми, отношение к которым определено (позитивное либо негативное), но и к любым разговорам в принципе.

Допустим, вы встречаете знакомого и говорите ему: «Привет».

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

Однако в ответ можно услышать что-то другое, например: «Да иди ты…». Ранее запланированный разговор свернул на иной путь, сценарий круто изменился. Что ж, бывает и такое. В этом случае ваш мозг выдает стандартный ответ типа: «Сам иди ты!», — всего на мгновение позже фразы, которая прозвучала бы в случае неизменности запланированного сценария. Мгновение – это, строго говоря, не время на размышление, а время на обращение к библиотеке ситуативных заготовок. Какое там размышление, когда все совершается «на автомате», практически на бессознательном уровне!

Можно представить, что собеседник «пропускает ход»: не здоровается, но дружески произносит последующую фразу, привычную для вашего прошлого общения. Привычную – значит предполагаемую. Вам же (точней, вашему мозгу) нет смысла дожидаться ответа, который и без того известен, но есть смысл готовить фразы для последующего диалога. Тогда высока вероятность, что и последующая фраза после пропущенного «привета» не застанет врасплох: припасенная заготовка поступит на ваши уста без малейшей задержки. При желании отсутствие ответного приветствия можно посчитать не «пропущенным ходом», а новым ответвлением сценария, но это не меняет общей картины.


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

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

Таким образом, диалог – вовсе не бесконечные возможности сказать что-либо произвольное и ответить что-либо произвольное, а узенькие тропиночки, по которым только и можно передвигаться. Они как трассы на автодроме: сворачивать допускается только там, где это предусмотрено проектировщиком трассы – человеческой психологии. На бездорожье не выехать: заборчик капитальный поставлен, знаете ли.

Подобно автомобилям на автодроме, разговоры тоже движутся по кругу. Приятели получают кайф от замусоленной темы, подружки сплетничают между собой не менее увлеченно. Если между неприязненно настроенными людьми возникает спор, то аргументы противоположной стороны пропускаются между ушей. В последнем случае говорят: «Он меня не слышит». Ушами слышит, наверное, да только ваша реакция в антиципированным собеседником плане разговора не предусмотрена, потому собеседник отвечает стандартной заготовкой, которая не устраивает уже вас. Движение по кругу – безвыходная ситуация.


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

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

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

Если собеседник поздоровался как-то нестандартно, чат-бот может «не догадаться» о приветствии, соответственно отреагирует иным образом (вариативность человеческой речи – вот проблема из проблем, черт ее подери). А ведь приветствие – простейший случай: антиципировать последующие реплики намного сложней.

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

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

В связи с антиципацией и библиотекой ситуативных заготовок вспоминается курьезный случай. К нам с женой приехала знакомая. Через некоторое время упомянула своего мужа, который вечно забывает выключить свет: принялась увлеченно рассказывать, как его чехвостит, и прочее. «Ну конечно! Разумеется! Ты совершенно права, дорогая!» — слышались сострадательные реплики моей супруги. Прикол был в том, что у меня в семье ровно наоборот. Жена принципиально не выключает свет: через минуту после ее прихода домой свет горит везде – в комнатах, коридоре, на кухне, в туалете и в ванной. Проходя мимо, я автоматически его выключаю, а жена не менее автоматически включает, и ничего поделать с этим нельзя. Но разговор с подругой был именно таким. Жена использовала приличествующие встрече индивидуальные заготовки немного невпопад, при этом общению ничто не мешало. Женщины, что называется, пели в унисон – были совершенно единодушны и счастливы.

Постскриптум
Данная статья написана в рамках цикла о разработке мной синтаксического чат-бота Ваня Разумный.

Предыдущие статьи:

  1. Создание ИИ методом «глокой куздры». Интеллектуальная одиссея;
  2. Чат-бот обретает слух, или страдания дилетанта.

Если кто-то захочет познакомиться с Ваней в его текущем состоянии, релиз 2.0 находится здесь: bitbucket.org/mikejum/intellectualivan/downloads

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

В связи с переходом с Access на PostgreSQL появились проблемы с установкой: теперь разархивировать файл недостаточно, придется установить PostgreSQL и развернуть дамп, инструкции прилагаются.

На неизбежный вопрос, а насколько антиципация реализована в версии 2.0, отвечу так. Реализована частично, на начальном уровне, однако заметить ее в ходе диалога проблематично. Как было сказано ранее, антиципация – одна из множества фич, необходимых при разработке ИИ, далеко не самая существенная.

Комментарии (13)


  1. Hidon
    04.03.2019 09:51
    +5

    антиципации… автор, ты на каком, прости его все боги, языке пишешь?!
    простите, не сдержался.


    1. mikejum Автор
      04.03.2019 09:55
      -4

      Вы так переживаете по поводу каждого встреченного незнакомого термина? Не стоит, право слово…


  1. shiru8bit
    04.03.2019 10:37

    Вот вопрос: а зачем вам контактировать с друзьями, если вам заранее известно, что они скажут? Нет, я понимаю и разделяю: приятно провести время, расслабиться… однако желание получить новую информацию тут явно на последнем месте.

    Что-то с этой предпосылкой явно не так, потому что основное содержание контактов с друзьями заключается в обсуждении кто чего нового сделал-узнал. Какой фильм посмотрел, какой телефон купил и каков опыт его использования, куда ездил отдыхать, и так далее. Это именно обмен новой информацией.


    1. mikejum Автор
      04.03.2019 10:45

      А в чем тогда отличие общения с друзьями от общения с врагами? Неужели в том, что в первом случае мы получаем новую информацию, а во втором случае не получаем? Мне представляется, что узнать фильм, который просмотрел друг, не самое важное. Фильм вообще ни при чем. При чем — отреагировать на «знание» репликами типа: «Правда?», «Не может быть!», «Ух ты!», «Ну ты молодец!» и т.п. Используем позитивные реплики — получаем позитивный психологический заряд. Но даже в вашем примере реплики однотипны: фильм, телефон, отпуск… И так из года в год, десятилетиями. Это и есть общение в цикле.


      1. shiru8bit
        04.03.2019 10:51

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


        1. mikejum Автор
          04.03.2019 10:56

          меняются сами люди, меняются темы для разговоров

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


          1. shiru8bit
            04.03.2019 10:57

            Меняются люди во времени. Один человек.


            1. mikejum Автор
              04.03.2019 11:04

              Да, меняются. Постепенно, обычно со взрослением. Соответственно, шаблон общения с этим человеком соответствующим образом корректируется. Против этого никто и не возражает.


  1. side2k
    04.03.2019 12:18

    «Антиципации»? Серьёзно?


    1. mikejum Автор
      04.03.2019 12:28

      ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8%D1%86%D0%B8%D0%BF%D0%B0%D1%86%D0%B8%D1%8F
      Чем вам термин не приглянулся? Термин как термин.


      1. CryptoPirate
        04.03.2019 16:37
        +1

        Думаю, дело в том что антиципация в русском языке не совсем то же самое что anticipation в английском. Вы явно ведёте речь о предвкушении событий, в смысле об их (пред)угадывании, а не о преждевременном наступлении событий.
        На сколько я понимаю, anticipation (англ.) в первую очередь используется как именно предвкушение и предугадывание.
        А вот антисипация (рус.) — в первую очередь жаргон в узкоспециализированной среде (например в налогообложении), о наступлении событий заранее. В вашу статью это слово не подходит (по крайней мере мне так кажется).
        Хоть эти слова и похожи и значения у них почти одинаквые, они не одинаковы и всегда заменять одно на другое неправильно.

        На всякий случай приведу простой похожий пример:
        киллер по русски и killer по английски — не одно и то же, хоть и является заимствованием.
        Киллер — более «узкий» термин, наёмный убийца.
        Killer — просто убийца, не обязательно наёмный.
        При заимстованииподобные вещи (использование в более узком смысле) происходят часто.


        1. mikejum Автор
          04.03.2019 16:42
          +2

          В каком значении употреблен термин, указано в самом начале статьи:

          В процессе работы над чат-ботом я столкнулся с необходимостью антиципировать (то есть предвосхищать) развитие диалога.

          Замечу, что в Википедии правописание именно «антиципация» — см. ссылку прямо над вашим комментарием. Прочие значение термина указаны там же.


          1. CryptoPirate
            04.03.2019 17:15

            Замечу, что в Википедии правописание именно «антиципация»

            О, да, опечатался, поправить уже не могу :-/