74

Кто такая Элис?

Красиво одевается, красиво говорит.


Появилась она во времена IRC и развитого в том направлении ботов. Сам по себе, протокол IRC был довольно прост: все команды и взаимодействия с пользователями/сервисами проходили по открытому протоколу, без шифрования, что существенно облегчало как сам парсинг чатов, так и взаимодействие с серверами в целом.


Что делали тогда боты? Да много чего, по командам: рассказывали о погоде, анекдоты, без устали следили за порядком на каналах (мат и флуд), были и игровые боты (викторины, мафия). Ну и конечно же, разговаривающие боты.


Так как я уже интересовался тогда Линуксами и ботами, то решил разобраться, как это все работает. В большинстве случаев, использовали ядро eggdrop, написанное на Си, специально под IRC. Остальная "начинка" вешалась в виде модулей и скриптов на TCL.

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


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


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

Когда думал над именем, принял решение подобрать такое, чтобы коротко и звучало. И вот, играю как-то в Need For Speed 3, выбираю тачки и проскакивает Lotus Elise.. решено!

В основе ядра был функционал работы протоколом IRC и с базой данных на FireBird (компонент просто был сразу в коробке Delphi), остальное навешивалось в виде dll-модулей и подгружалось при старте ядра.


Начальное обучение

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

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

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

- Я вчера смотрел матч между Канадой и Россией. Любишь хоккей? (тут у нас явно идет речь о спорте по ключевым словам: матч, хоккей. но есть еще и упоминание стран). В данном случае, Элис имела рандомный выбор: говорить дальше о спорте или о путишествиях например.

- Люблю прыжки в длинну / Я ездила в Турцию, кофе там пила

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

- Продолжить разговор по выбранной теме

- Задать рандомный вопрос, не относящийся к теме ( - ты в кино когда последний раз был? )

- Сделать перерыв в разговоре, сославшись на рандомную причину ( - извини, отойду, надо кота помыть ) и ставился таймер игнорирования этого пользователя (работало только в привате)

- Задать вопрос, ответ на который еще нет в базе (из таблицы, куда складывались фразы, в которых не были обнаружены ключевые слова).. чтобы узнать ответ :)


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

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


Обращение

Одна из проблем, было отношение к собеседнику, а именно - обращение (м? ж?).

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

Как только собеседник обращался к Элис, она проверяла его по свое базе, знает ли она его уже и какого "оно" пола )) и уже дальше общалась в соответствующем ключе. В качестве идентификатора собеседника, выступал ident@host, без привязки к нику.

Если собеседник долго не детектился по половому признаку, Элис могла и сама напрямую спросить, через несколько фраз: - Ты парень или девушка?

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

- Ты ходил|ходила на концерт БИ-2 вчера?

(символ | означал, что первое слово предназначено для м, второе для ж)


Отношение

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

Возвращаемся к ключевым словам: добавляем "вес настроения" на определенные фразы.

Добавляем к базе собеседников два параметра: долгосрочное отношение и короткосрочное. Это я подчерпнул из СИМСов )) Короткосрочное влияет на то, хочет ли Элис прямо сейчас с тобой общаться.

Теперь, если ты оскорбишь или предложишь повиртуалить Элис, она поставит тебе -25 баллов на сегодня (когда у тебя их 100) и -5 на долгосрочное.

Баллы только списываются. Начисляются по 20 в час на короткосрочное и на 2 балла в сутки на долгосрочное.

То есть, если ты будешь постоянно ее оскорблять, она просто перестанет с тобой общаться.

Прежде чем начать отвечать тебе - Элис первым делом проверит эти параметры и в зависимости от "тяжести", решит, ответить ли (именно потом и 100 баллов у каждого: на весах рандома вероятность ответа. Ессно, чем ниже у вас баллов - тем меньше вероятность ответа)


Свобода

В определенный момент, я решил, что приватов и личных обращений на постоянных каналах - маловато.

Добавлен модуль, примерно раз в 3 дня поднимал список каналов и рандомной выбирал 10 каналов с +30 юзеров, затем, один из них. Даже я не знал заранее, куда она "решит" зайти )

В это же время, Элис "научилась" отслеживать общение между людьми. Кто-то что-то спрашивает, кто-то отвечает. Обработаем, запишем, если не поймем - отложим создателю на модерацию.


В итоге

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

Но... Тест текстом.. хоть и были уже в те времена голосовые генераторы, типа "говорилка", а вот детектить текст по голосу, без регистрации и смс - нет.. да и даже текущие боты, вроде Алисы, до сих не умеют понимать, вопрос ли или утверждение, для них все - запросы...

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

Потом RusNet (IRC) наверное изжил себя.. сначала я ушел, а потом и Элис года через 2 выключил навсегда...

Посвящается памяти EliseAI, более известной, как просто Elise (RusNet).. она же Лиска..


PS. Наверное слишком ужато получилось... о многих моментах, особенно технических, умолчал... можно в комментах еще обсудить.