Кто такая Элис?
Красиво одевается, красиво говорит.
Появилась она во времена 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. Наверное слишком ужато получилось... о многих моментах, особенно технических, умолчал... можно в комментах еще обсудить.