Как стать автором
Обновить

Интеллектуальные диалоговые системы с интерфейсом на естественном языке

Время на прочтение5 мин
Количество просмотров16K
Как Вы уже наверно поняли, речь пойдет о так называемых виртуальных собеседниках или, как их еще называют, чат-ботах. В названии поста я умышленно использовал понятие «интеллектуальная диалоговая система» (для краткости дальше по тексту сокращенно — ИДС), поскольку считаю, что понятия «чат-бот» и «виртуальный собеседник» полностью дискредитированы и не отражают всей сути этого «явления».

В посте пойдет речь о проектировании ИДС и сложностях, которые при этом возникают. Также будут рассмотрены распространенные алгоритмы, используемые в ИДС, их достоинства, недостатки и многое многое другое. Если эта тема Вам интересна, добро пожаловать под кат.

Зачем нужны ИДС?


Спектр применения подобных систем невероятно широк. Первое, что приходит на ум:
  • для автоматической проверки знаний (школьников, студентов, соискателей на какую-либо должность и т.д.)
  • в качестве автоматизированной службы поддержи пользователей
  • для диагностики (болезней, неисправностей и пр.)
  • для развлечения в конце концов

Как обстоят дела с ИДС в России?


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

Не так давно на глаза попалась компания «Наносемантика», которая создает, так называемых инфов (виртуальных собеседников). Но при близком знакомстве с этими инфами был разочарован. Выглядит красиво, а на поверку ничего заслуживающего внимания нет.

На сайте компании написано:
Помимо прочего, в комплексную платформу входит база знаний инфа — набор гибких сценариев с заданными вариантами вопросов и ответов на них.


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

Портрет идеальной ИДС


Какой же минимум должна уметь действительно интеллектуальная диалоговая система? По моему глубокому убеждению:

1. Диалоговая система претендующая на интеллектуальность должна уметь поддерживать беседу на заданную тему. В идеале, она должна не просто отвечать на вопросы, но и задавать их, спорить, отстаивать свою точку зрения (ну и иметь ее конечно). Понятно, что добиться этого на практике очень трудно, но некоторые наработки и идеи (говорю о себе) уже есть.

2. ИДС должна иметь механизм самообучения (хотя бы примитивный). Без этого назвать ее интеллектуальной просто язык не поворачивается.

3. ИДС должна уметь конструировать ответ на естественном языке (хотя бы в каких-то конкретных случаях), а не просто тупо выдавать забитый в нее ответ.

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

5. Диалоговая система в ряде случаев должна обладать индивидуальностью и эмоциями. В противном случае общаться с такой системой будет скучно.

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

Естественно, наличие тех или иных умений должно быть обусловлено сферой применения системы. Так, например, автоматической support-системе не зачем (и даже вредно) иметь эмоции. Уже представляю себе разгневанного пользователя, который вместо решения своей проблемы получает в ответ: «А не пошел(-а) бы ты на… Грущу я. Вот!»

Внутреннее устройство ИДС


Практически все ныне существующие ИДС (по крайней мере из тех с чьим устройством я знаком) имеют базу знаний в форме:

фраза пользователя или ее значимая часть|один или несколько вариантов ответа системы

Есть конечно исключения, но в основном это так. Такой подход неизбежно приводит к проблемам. Во-первых, теряется возможность отвечать человеку в соответствии с его полом и приходится просто тыкать/выкать. Во-вторых, приходится учитывать опечатки и ошибки пользователя. А это значит, что в базе должны быть, например, такие записи:

как тебя зовут|меня зовут так-то
как тибя завут|меня зовут так-то


Если ошибки не учитывать, то на вопрос «как тибя завут» программа не ответит адекватно.

В-третьих, если база состоит не из полных фраз — неизбежны некорректные ответы системы. Например база содержит такую строку:

сколько лет|Мне 2 года

Очевидно, автор хотел предусмотреть несколько вариантов вопроса о возрасте программы. «Сколько лет тебе?», «Тебе сколько лет?» — на них программа корректно ответит: «Мне 2 года»

А что если ее спросят «Сколько лет твоему создателю?» или «Сколько лет планете Земля?» Вероятно, ответ «Мне 2 года» пользователя в этом случае не устроит.

В-четвертых, при таком способе хранения знаний очень трудно обеспечить возможность «держать тему».

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

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

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

1. Непосредственно перед поиском в базе реплика пользователя должна быть проверена на возможные опечатки и ошибки. Естественно при их наличии они должны быть исправлены. Сделать это можно с помощью специального модуля — спеллчекера.

2. В базе должен храниться полный вариант реплики пользователя, а не просто ее значимая часть. Это позволит исключить ошибочные ответы системы.

Действительно, зачем использовать морфологию, синтаксис, семантику и другие средства, если нужно дать ответ на вопрос «Как дела?». Такие очень распространенные вопросы можно (а порой полезно, например, для быстродействия) хранить в базе традиционным способом.

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

Применяя такой подход можно приводить разные варианты запроса к единому виду. Проиллюстрирую свою мысль. Допустим имеем реплики пользователя:

Сколько тебе лет?
Сколько тибе лет?
Какой твой возраст?


Первая реплика: числительное «сколько» однозначно идентифицирует реплику как вопрос. Местоимение-существительное «тебе» однозначно идентифицирует этот вопрос как личный вопрос системе. Существительное «лет» принадлежит к категории «единицы измерения времени -> возраст». Получаем: системе задали личный вопрос о ее возрасте.

Вторая реплика: тоже самое, но предварительно «тибе» будет исправлено на «тебе».

Третья реплика: местоименное прилагательное «какой» однозначно идентифицирует реплику как вопрос. Местоименное прилагательное «твой» однозначно идентифицирует этот вопрос как личный вопрос системе. И наконец, существительное «возраст» принадлежит к категории «возраст». Опять таки получаем: системе задали личный вопрос о ее возрасте.

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

На сегодня пожалуй хватит. В следующей статье я расскажу о том как можно научить ИДС «держать тему» и самообучаться. Надеюсь Вам понравилось.

P.S. В комментариях хотелось бы увидеть Ваши мысли и предложения по поводу хранения информации в базе знаний системы.
Теги:
Хабы:
+20
Комментарии76

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн