Темы чат-бота
Здесь кратко описаны темы, которые реализованы в данном чат-боте. Напомним, что большинство тем предполагают общение в внешним миром через коннекторы, адаптеры для которых реализуются при внедрении чат-бота в конечную систему. В данном случае адаптеров нет, как и внешних систем для взаимодействия. Здесь как-бы чистый мозг с аналитическими фукнциями, но без долговременной памяти (амнезия). Отсутствие информации заменяется как-бы фантазией (в ряде случаев просто случайная генерация, как для прогноза погоды).
Слева выводятся ответы бота, а справа текст пользователя. Слева от текста пользователя выводятся команды и параметры, которые удалось выделить (если есть). Справа от текста чат-бота выводятся системные сообщения (если есть).
- Сон
- Приветствие
- Погода
- Курс валют
- Калькулятор
- Лингво-SQL
- Автономера
- Карта
- Авиа-рейсы
- Навигатор
- Болтовня
Сон
Для временного отключения чатбота (перевода в спящий режим) можно сказать ему любое из слов, связанных со сном, и чатбот перейдёт в режим сна. Для пробуждения нужно сказать любое из слов, связанных с просыпанием.
Пример диалога по данной теме:
Сон | упал и уснул | |
Хорошего сна!Переход в спящий режим | ||
Сон | привет | |
Для выхода из спящего режима скажите "Проснись" или "Вставай" | ||
Сон | сутр шкаф | |
Для выхода из спящего режима скажите "Проснись" или "Вставай" | ||
Сон | именем революции - встать! | |
С добрым утром!Выход из спящего режима |
Приветствие
На приветствие от пользователя система отвечает приветствием, запрашивает имя и, если пользователь его сообщил, далее может использовать это имя в диалогах. Также отвечает на прощание. Имя, заданное в творительном падеже, нормализуется. Имя может состоять из нескольких слов. Отвечает на вопрос о своём имени.
Пример диалога по данной теме:
Приветствие | здравия желаю | |
Здравствуйте, меня зовут Кава! А как Вас зовут? | ||
Приветствие | Хозяинзови меня просто хозяин | |
Приятно познакомиться, Хозяин! | ||
Приветствие | Иван Ивановичлучше зови меня иваном ивановичем | |
Приятно познакомиться, Иван Иванович! | ||
Приветствие | Конь Педальныйа попробуй назвать меня конём педальным | |
Приятно познакомиться, Конь Педальный! | ||
Приветствие | а как тебя зовут | |
Меня зовут Кава. | ||
Приветствие | пока | |
До свидания, Конь Педальный! |
Погода
Отвечает на вопрос о погоде сейчас и на ближайшее время (прогноз). Может ответить как в целом, так и по отдельности о температуре, будет ли дождь или снег и пр. Поддерживает погоду на уровне дня и по отдельности утро, день, вечер, ночь. Можно указать город, для которого прогноз (иначе город берётся “по умолчанию”).
Пример диалога по данной теме:
Погода | Какая будет погода 21 июня 2025 года?какая завтра погода? | |
Обещают 2 градуса, дождьДанные получены с потолка | ||
Погода | Будет ли дождь вечером 20 июня 2025 года?а сегодня вечером обещают дождь? | |
Обещают дождьДанные получены с потолка | ||
Погода | Будет ли снег вечером 20 июня 2025 года?а снег? | |
Снег не обещаютДанные получены с потолка | ||
Погода | Какая будет погода 22 июня 2025 года?а послезавтра? | |
Обещают 5 градусов, сильная облачностьДанные получены с потолка | ||
Погода | Какая будет погода днём 22 июня 2025 года?а днём какая температура, высокая? | |
Обещают 4 градуса, проливной дождьДанные получены с потолка |
Курс валют
Отвечает на вопрос о курсе валют за конкретную дату.
Пример диалога по данной теме:
Курс валют | Какой курс USD в RUR и EUR в RUR 20 июня 2025 года?какой курс валют? | |
Курс доллара семьдесят один рубль двадцать восемь копеек продажа и шесть рублей сорок восемь копеек покупка, курс евро пятьдесят три рубля сорок шесть копеек продажа и тридцать три рубля тридцать семь копеек покупка.Данные получены с потолка | ||
Лингво-SQL | сколько стоил вчера доллар в евро? | |
Вывести уникальные значения "стоимость фильма", с условием, что существуют "фильмы на складе" и "прокаты" с условием, что "дата начала аренды" меньше или равно '2025-06-19 00:00:00' и дата окончания аренды больше или равно '2025-06-19 23:59:59', с сортировкой по возрастанию стоимости фильма. Мне непонятен фрагмент "доллар в евро". Уверенность в результате - 80%, запрос может быть неточным. select distinct f.rental_rate as "Стоимость фильма" from FILM f where exists (select * from INVENTORY iv join RENTAL re on re.inventory_id = iv.inventory_id where iv.film_id = f.film_id and re.rental_date <= '2025-06-19 00:00:00' and coalesce(re.return_date, current_timestamp) >= '2025-06-19 23:59:59') order by 1 | ||
Курс валют | Какой курс EUR в USD 20 июня 2025 года?а евро в долларах? | |
Курс евро восемьдесят восемь долларов двадцать один цент продажа и десять долларов восемьдесят три цента покупка.Данные получены с потолка | ||
Курс валют | Какой курс EUR в USD 22 июня 2025 года?а послезавтра? | |
Курс евро восемьдесят три доллара тридцать четыре цента продажа и пятьдесят долларов восемьдесят девять центов покупка.Данные получены с потолка | ||
Курс валют | Какой курс продаж USD в RUR 19 июня 2025 года?какой вчера был курс продаж доллара? | |
Курс доллара десять рублей шесть копеек.Данные получены с потолка |
Калькулятор
Позволяет делать стандартные операции (сложить, вычесть, умножить, поделить) над целыми числами. Можно задавать сразу несколько операций, причём выполняться они будут именно в том порядке, как в запросе - приоритетов операций нет. Например, “два плюс два поделить на четыре” = (2 + 2) / 4. Если в запросе только операция и одно число, то вторым операндом считается предыдущее вычисленное значение.
Пример диалога по данной теме:
Калькулятор | 2 * 2 = 4дважды два | |
4 | ||
Калькулятор | 4 + 10 = 14добавь к этому десять | |
14 | ||
Калькулятор | 826 / 2 - 100 = 313чему равно восемьсот двадцать шесть поделить на два и отнять сто? | |
313 |
Лингво-SQL
Задание SQL-запросов посредством естественного языка (голоса или текста).
Пример диалога по данной теме:
Лингво-SQL | Покажите всех покупателей с именами вася коля и петя | |
Вывести уникальные значения "клиент", с условием, что имя клиента (без учета регистра) равно 'ВАСЯ' и фамилия клиента (без учета регистра) равно 'КОЛЯ', с сортировкой по возрастанию клиента. Мне непонятен фрагмент "петя", но это, скорее всего, несущественно. Уверенность в результате - 90%. select distinct concat(c.first_name, ' ', c.last_name) as "Клиент" from CUSTOMER c where upper(c.first_name) = 'ВАСЯ' and upper(c.last_name) = 'КОЛЯ' order by 1 | ||
Лингво-SQL | отсортируй по первому столбцу по убыванию | |
Вывести уникальные значения "клиент", с условием, что имя клиента (без учета регистра) равно 'ВАСЯ' и фамилия клиента (без учета регистра) равно 'КОЛЯ', с сортировкой по убыванию клиента.select distinct concat(c.first_name, ' ', c.last_name) as "Клиент" from CUSTOMER c where upper(c.first_name) = 'ВАСЯ' and upper(c.last_name) = 'КОЛЯ' order by 1 desc | ||
Лингво-SQL | фио актёров с минимальными по длине именами | |
Вывести поля "фио актера" и "длина имени актера", с условием, что "длина имени актера" равно минимальному значению, с сортировкой по возрастанию фио актера. Мне непонятен фрагмент "по длине", но это, скорее всего, несущественно. Уверенность в результате - 90%. select concat(a.first_name, ' ', a.last_name) as "Фио актера", length(a.first_name) as "Длина имени актера" from ACTOR a where length(a.first_name) = (select min(length(a.first_name)) from ACTOR a) order by 1 | ||
Лингво-SQL | список клиентов, не вернувших прокатные фильмы, взятые в 2005 году | |
Вывести уникальные значения "клиент", с условием, что существуют "прокаты" с условием, что "незавершенная аренда проката" и "взять проката" от '2005-01-01 00:00:00' до '2005-12-31 23:59:59', с сортировкой по возрастанию клиента.select distinct concat(c.first_name, ' ', c.last_name) as "Клиент" from CUSTOMER c where exists (select * from RENTAL re where re.customer_id = c.customer_id and re.return_date is null and re.rental_date between '2005-01-01 00:00:00' and '2005-12-31 23:59:59') order by 1 | ||
Лингво-SQL | а в 2006 году? | |
Вывести уникальные значения "клиент", с условием, что существуют "прокаты" с условием, что "незавершенная аренда проката" и "взять проката" от '2005-01-01 00:00:00' до '2005-12-31 23:59:59', с сортировкой по возрастанию клиента.select distinct concat(c.first_name, ' ', c.last_name) as "Клиент" from CUSTOMER c where exists (select * from RENTAL re where re.customer_id = c.customer_id and re.return_date is null and re.rental_date between '2005-01-01 00:00:00' and '2005-12-31 23:59:59') order by 1 | ||
Лингво-SQL | В каких фильмах снимался джонни депп? | |
Вывести уникальные значения "фильм", с условием, что существуют "игры актёра в фильме" и "актеры" с условием, что имя актера (без учета регистра) равно 'ДЖОННИ' и фамилия актера (без учета регистра и буквы Ё) равно 'ДЕПП', с сортировкой по возрастанию фильма.select distinct f.title as "Фильм" from FILM f where exists (select * from FILM_ACTOR fa join ACTOR a on fa.actor_id = a.actor_id where fa.film_id = f.film_id and upper(a.first_name) = 'ДЖОННИ' and replace(upper(a.last_name), 'Ё', 'Е') = 'ДЕПП') order by 1 | ||
Лингво-SQL | Покажи города с максимальным количеством покупателей | |
Вывести поля "город" и "количество клиентов", с группировкой по "городу", с группировочным условием, что количество разных клиентов равно максимальному значению, с сортировкой по возрастанию города.select ci.city as "Город", count(distinct c.customer_id) as "Количество клиентов" from CITY ci left join ADDRESS ad on ad.city_id = ci.city_id left join CUSTOMER c on c.address_id = ad.address_id group by ci.city_id having count(distinct c.customer_id) = (select max(tmpval) from (select ci.city as "Город", count(distinct c.customer_id) as tmpval from CITY ci left join ADDRESS ad on ad.city_id = ci.city_id left join CUSTOMER c on c.address_id = ad.address_id group by ci.city_id) tmpsel) order by 1 | ||
Лингво-SQL | Выведите клиентов, которые в 2005 году арендовали более 20 фильмов за месяц, а также сумму платежей, количество фильмов, и номер месяца, сортировка по убыванию суммы платежей | |
Вывести поля "клиент", "месяц с годом проката", "количество фильмов" и "сумма платежей", с группировкой по "клиенту" и "месяцу с годом проката", с условием, что "дата начала аренды" от '2005-01-01 00:00:00' до '2005-12-31 23:59:59' и существует "прокат" и "фильм на складе", с группировочным условием, что количество разных фильмов больше 20, с сортировкой по убыванию суммы платежей.select concat(c.first_name, ' ', c.last_name) as "Клиент", date_trunc('month', re.rental_date) as "Месяц с годом проката", count(distinct f.film_id) as "Количество фильмов", sum(p.amount) as "Сумма платежей" from CUSTOMER c left join RENTAL re on re.customer_id = c.customer_id left join PAYMENT p on p.rental_id = re.rental_id left join INVENTORY iv on re.inventory_id = iv.inventory_id left join FILM f on iv.film_id = f.film_id where re.rental_date between '2005-01-01 00:00:00' and '2005-12-31 23:59:59' group by c.customer_id, 2 having count(distinct f.film_id) > 20 order by 4 desc nulls last |
Автономера
Поддерживает запрос информации о транспортном средстве к внешней базе. Сейчас поиском может выступать российский номер (буква три цифры и две буквы), и дополнительно регион. Возвращается информация о владельце (потом можно будет добавить и другую информацию). Если регион не указан, то возможен список результирующих номеров.
Буквы номера можно задавать разными способами. Можно как отдельными буквами, причём в разных способах произнесения (м = мэ = эм), так и нормальными словами, из которых берётся первая буква. Можно буквой и повтор её словом (“хэ харитон”).
Пример диалога по данной теме:
Автономера | номер для поиска: м123нш, регион 177поищи в базе владельца жигулей м 123 эн ша 177 | |
Боширов Константин АлексеевичДанные взяты с потолка | ||
Автономера | номер для поиска: м111вп, регион 177маша три единицы вася петя 177 | |
Номер м111вп региона 177 найден, владелец Чапига Михаил Алексеевич.Данные взяты с потолка | ||
Автономера | номер для поиска: х055маа есть номер хэ ноль две пятёрки ма? | |
Номер х055ма не найден в базе. | ||
Автономера | повторите, пожалуйста | |
Номер х055ма не найден в базе.Повтор реплики чатбота |
Карта
Это тема для голосового управления картой. Сначала карту нужно инициировать командой типа “открой карту”, “покажи план города” и т.п., и тогда тема включается и начинает интерпретировать специфические команды управления.
Навигация: возможны 8 направлений перемещения центра карты (север, северо-запад, запад и т.д.), причём север = вверх, запад = влево, юг = вниз, восток = вправо. Можно комбинировать: “на северо-запад” = “сместить вверх и затем влево”.
Если используется глагол несовершенного типа (идти, перемещайся, сдвигайся и пр.), то перемещение должно быть плавным до тех пор, пока не поступит команда “стоп” (хватит, достаточно и пр.), или любая другая команда.
Если глагол не задан или он совершенного типа (переместись, сдвинься, сместись…), то действие однократное на одну единицу деления.
Масштаб: возможно управление масштабом командами “увеличь масштаб”, “приблизь”, “ближе” и пр. Здесь также возможен режим плавного изменения до команды “стоп”, если глагол несовершенного типа (увеличивай, приближай, отдаляй и др.).
Возможна команда обратного действия (назад, наоборот, …), когда выполняется команда, обратная предыдущей. Например, если за командой “перемещайся вверх” последует “назад”, то будет отдана команда “перемещайся вниз”. Аналогично для масштаба.
Пример диалога по данной теме:
Навигатор | Показать на картепокажи мне карту | |
Показываю на карте. | ||
Карта | плавно перемещать на севердвигайся на север | |
Лингво-SQL | иди левее и выше | |
Вывести уникальные значения "продолжительность фильма", с сортировкой по возрастанию продолжительности фильма. Мне непонятны фрагменты "левее" и "выше". Уверенность в результате - 80%, запрос может быть неточным. select distinct f.length as "Продолжительность фильма" from FILM f order by 1 | ||
Карта | плавно перемещать на югназад | |
Карта | стопхватит | |
Карта | плавно увеличивать масштабприближай картинку | |
Карта | стопхорошо! | |
Авиа-рейсы
Пример диалога по данной теме:
Авиа-рейсы | Авиарейсы вылет за период за 21 июня 2025 года из города Москва до города СамараКакие рейсы из Москвы в Самару завтра днём | |
Найдены три авиарейса между городами Москва и Самара, время отлёта 21 июня в четыре часа сорок семь минут, в девять часов тридцать пять минут, в четырнадцать часов двадцать три минуты. | ||
Авиа-рейсы | Авиарейсы до города Санкт-ПетербургА в Питер? | |
Найден один авиарейс между городами Москва и Санкт-Петербург, время отлёта 21 июня в семь часов пятьдесят девять минут. | ||
Авиа-рейсы | Авиарейсы вылет за период за 22 июня 2025 годаА на послезавтра есть? | |
Авиарейсы между городами Москва и Санкт-Петербург с отлётом за 22 июня 2025 года не найдены. | ||
Лингво-SQL | А есть рейсы из Москвы в Мухосранск? | |
Вывести уникальные значения "город", с условием, что "наименование города" не содержит подстроку 'РЕЙСЫ' и 'РЕЙС' или "наименование города" не содержит подстроку 'МУХОСРАНСК', с сортировкой по возрастанию города.select distinct ci.city as "Город" from CITY ci where (position('РЕЙСЫ' in replace(upper(ci.city), 'Ё', 'Е')) = 0 and position('РЕЙС' in replace(upper(ci.city), 'Ё', 'Е')) = 0) or position('МУХОСРАНСК' in upper(ci.city)) = 0 order by 1 |
Навигатор
Это специфическая тема для навигации по элементам некоторой иерархической структуры. Каждый элемент имеет тип и имя. Типы - “база”, “класс” и “объект”. Имя может быть любой буквенно-цифровой комбинаций, в том числе из нескольких слов.
Подразумевается, что элементы по отношению принадлежности образуют иерархию, причём элементы типа “объект” принадлежат элементам типа “класс”, тип “класс” - типу “база”, а “база” принадлежит либо “база”, либо не имеет элемента сверху.
В запросе можно задавать тип с помощью ключевых слов “база”, “база данных”, “домен”, “организация” (для типа “база”), “класс” и “объект”, что поможет в сложных случаях, однако это необязательно, если имена или их части однозначно идентифицируют элементы.
В одном запросе можно указывать всю цепочку иерархии, причём в любом порядке следования элементов, результирующим будет считаться самый удалённый от вершины иерархии элемент.
Если найдено подходящих несколько элементов, то пользователю предлагается выбрать один из списка. Если список получился большим (более 10), то такой выбор не предлагается.
Пока считается, что для выбранного элемента только одна команда - “просмотр”.
Навигатор требует некоторую иерархическую базу, которой нет. Поэтому здесь смоделирована некоторая иерархия, как будто эти объекты есть в базе. И по их названиям чат-бот может общаться.
- База "СУТР"
- Класс "Объекты учёта"
- Телекоммуникационный шкаф
- Маршрутизатор 2821
- Канал связи
- Мультиплексор
- Класс "Размещение"
- Опора 2
- Муфта М36
- Подстанция Елецкая
- Подстанция Московская
- Класс "Справочники"
- Маршрутизатор 2821
- Опора бетонная
- Класс "Объекты учёта"
- База "Завод"
- Класс "Отгрузка готовой продукции"
- Накладная 123456
- Накладная 3424524
- Накладная 443543
- Накладная 4434553
- Класс "Готовая продукция"
- Акварель "Юный школьник"
- Пластилин "Юный школьник"
- Гуашь "Юный школьник"
- Акварель "Юный художник"
- Пластилин "Юный художник"
- Гуашь "Юный художник"
- Класс "Отгрузка готовой продукции"
- База "Клиника"
- Класс "Сотрудники"
- Класс "Заявки"
- Класс "Выручка"
- Класс "Крещатик"
- Сотрудники
- Класс "Хрущатик"
- Сотрудники
Пример диалога по данной теме:
Навигатор | База "СУТР"; Объект "Телекоммуникационный шкаф"сутр шкаф | |
Показать объект "Телекоммуникационный шкаф". | ||
Навигатор | подстанция | |
Имеются 2 объекта: "Подстанция Елецкая" и "Подстанция Московская". Выберите конкретный объект. | ||
Навигатор | Объект "Подстанция Елецкая"елецкая | |
Показать объект "Подстанция Елецкая". | ||
Навигатор | подстанция | |
Имеются 2 объекта: "Подстанция Елецкая" и "Подстанция Московская". Выберите конкретный объект. | ||
Навигатор | Объект "Подстанция Московская"вторая | |
Показать объект "Подстанция Московская". | ||
Навигатор | Класс "Отгрузка готовой продукции"; Период: с 1 по 31 января 2025; Показать на диаграмме; продукцияпоказать на диаграмме отгрузку продукции за январь | |
Показать на диаграмме класс "Отгрузка готовой продукции" с 1 по 31 января 2025. |
Болтовня
Это тема для любых вопросов, на которые не нашлось ответов в предыдущих темах. Сейчас прикручен чатбот Элиза от Наносемантики, но через некоторое время от него откажутся.