В начале лета у мессенджера Telegram, созданного командой основателя «Вконтакте» Павла Дурова, появился программный интерфейс для разработки ботов. Неплохой повод для экспериментов с диалоговыми интерфейсами!

 

Вступление

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

Минимальные требования к нашему роботу просты. Во-первых, ему придется делать что-то если и не полезное, то хотя бы реалистичное. Телеграммный аналог «Hello, World» нас не устроит хотя бы по той причине, что три строки кода трудно растянуть на целую статью. Во-вторых, он должен поддерживать естественное общение хотя бы на уровне Siri. Специальные команды, которые нужно разучивать, и прочее шаманство, напоминающее командную строку UNIX, не пройдет. В-третьих, его возможности не должны ограничиваться обменом текстовыми сообщениями. Telegram способен на большее, и это было бы неплохо показать.

 

Возможности

Возможности веб-фреймворков обычно демонстрируют на примере разработки блоговых движков. Мы разработаем нечто похожее по сути, но несколько более персональное: простенький трекер для любителей Quantified Self. Идея Quantified Self заключается в том, что сбор и анализ данных о самом себе помогает заметить тенденции и факты, которые невозможно различить невооруженным взглядом. Некоторые виды информации можно отслеживать автоматически при помощи датчиков в фитнес-браслетах, умных часах или смартфонах. Другие нужно собирать вручную. Существуют, к примеру, приложения для ведения дневника настроений или для хранения данных о съеденной еде (худеющим это полезно).

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

Пользователь: Я вешу 100 кг.
Робот: Запомнил!
Пользователь: Прочитал «Войну и мир». 
Робот: Запомнил!
Пользователь: Спал шесть часов.
Робот: Запомнил!

Диалог звучит естественно? Еще как — сложно было бы сказать по-другому. В то же время в этих сообщениях можно разглядеть смысл и без искусственного интеллекта. Первое слово, если отбросить местоимение «я» — это всегда описание действие. Остаток сообщения — объект, на который это действие направлено. Если же в сообщении есть число, его можно считать количественной оценкой.

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

Пользователь: Что я прочитал?
Робот: «Войну и мир», «50 оттенков серого», «В поисках утраченного времени», «Капитал», «Сумерки».
Пользователь: Сколько я спал?
Робот: Спал 15 раз. Значения от 4 до 13, в среднем 6,3. Всего: 77.

Вырисовывается логика. Тут командой служит первое слово: «что» для истории действия, «сколько» для статистики. Второе слово — это название действия, которое в записи шло первым. «Я» и вопросительный знак в конце можно игнорировать. Очевидно, что такие вопросы сочетаются не с любым действием, но эту проблему легко решить, предусмотрев список синонимов.

 

Приступаем

Идея ясна, можно начинать. Зрители последней серии «Мстителей» знают, что Тони Старк делает роботов, задумчиво шевеля в воздухе цветными голограммами. Увы, нам далеко до Тони Старка. Мы вынуждены обходиться обыкновенным Python. Для хранения истории действий возьмем SQLite с единственной таблицей под названием memories.

create table memories (
  id integer primary key autoincrement,
  user_id integer not null,    -- идентификатор пользователя Telegram  
  predicate text not null,    -- действие
  object text not null,      -- что сделано
  num real,            -- значение, связанное со сделанным
  finished timestamp not null  -- время окончания действия
);

Теперь займемся описанной выше логикой. Выбрасываем из полученного сообщения «я» и вопросительный знак, делим его на две части, команду cmd и действие predicate, после чего решаем, что делать дальше.

if cmd in (u'что', u'кто', u'как', u'где', u'вспомни', u'действие'):
  return p_history(db, 0, predicate)
elif cmd in (u'сколько', u'посчитай'):
  return p_stats(db, 0, predicate)
else:
  predicate, num = cmd, extract_number(object)
    return  remember(db, 0, predicate, object, num)

Этот алгоритм отправляется в функцию process, которая принимает на входе базу данных и текст входящего сообщения, а на выходе отдает текст ответа робота. Функции p_history (история действия),p_stats (статистика по действию) иremember` (добавить новую запись) не заслуживают особого внимания: каждая из них сводится к простому запросу SQL.

def remember(db, user_id, predicate, object, num):
  db.execute(
    'INSERT INTO memories (user_id, predicate, object, num, finished) '
    'VALUES (?, ?, ?, ?, ?)',
    (user_id, predicate, object, num, datetime.datetime.utcnow())
  )
  db.commit()
  return u'Запомнил!'

Отладить диалог можно и в консоли — дедовском диалоговом интерфейсе.

with sqlite3.connect('tracker.db', detect_types=sqlite3.PARSE_DECLTYPES) as db:
  if len(sys.argv)>1:
    print process(db, ' '.join(sys.argv[1:]).decode('utf-8'))

Посмотрим, что получилось:

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

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

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


3 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…