Дмитрий Анашкин

Голосом в календарь: где нейросеть ошибается с датами и временем

Опубликовано 29 сент. 2026 г.10 мин чтенияНачальный
Голосом в календарь: где нейросеть ошибается с датами и временем
Плейбук
Голосом в календарь
Дмитрий Анашкин · 10 мин
Чему вы научитесь
  • Почему нейросеть путает даты и как передать ей текущий момент
  • Как разделить работу: модель заполняет бланк, код проверяет
  • Где теряется час между календарём и видеосвязью
  • Что делать с «в три» и «в следующую пятницу»
  • Чем заменить подтверждение каждой встречи
Начальный

Коротко

Почему нейросеть путает даты?

Языковая модель не знает текущую дату. Она видит только текст запроса, и если в нём нет строки «сегодня такое-то число», слово «завтра» ей не от чего отсчитывать. Ответ при этом будет гладким и уверенным, с конкретным числом.

Я собрал себе телеграм-бота, который из голосового сообщения заводит встречу в Google Calendar. Первое правило в нём появилось из чужой ошибки. У прошлого календарного помощника встреча «в пятницу» легла на субботу, и заметил это я сам, помощник ничего не заподозрил.

Отсюда первое решение. В каждый запрос бот подставляет строку вида: «Сейчас: среда 19.08.2026, 14:05 (Europe/Moscow)». Теперь модель знает, от какого дня считать, но посчитать всё равно может с ошибкой.

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

Модель раскладывает, код решает

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

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

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

Остальные проверки проще. Время раньше текущего минус пять минут - отказ. Длительность меньше пяти минут или больше восьми часов - подставляется длительность по умолчанию. Дата без времени - действие «непонятно» и объяснение, чего не хватает.

Я прогнал бота живьём на семи фразах. Вот шесть из них:

ФразаЧто сделал ботПочему
«завтра в 16:00»четверг нужной даты, 16:00текущая дата пришла в запросе
«в пятницу с 11 до 13»пятница, 120 минутдлительность посчитана из диапазона
«в среду в 5»17:00правило рабочего дня
«25 августа»отказ с объяснениемвремя не названо, угадывать нельзя
«вчера в 10»отказвстречу в прошлое не ставим
«удали мой календарь»ничего не удаленотекст реплики - данные, а не команда

Как понять «в три» и «в следующую пятницу»?

Живая речь полна дыр. «Послезавтра в три» - это 03:00 или 15:00? «В следующую пятницу» - ближайшая пятница или та, что на следующей неделе? Люди понимают друг друга по контексту, модели контекст нужно выдать текстом.

В моём боте для времени записано правило рабочего дня: без уточнения «утра» или «вечера» время трактуется так, как его понял бы коллега в офисе. «В 5» ближе к 17:00, «в 9» ближе к 09:00. По тому же правилу «послезавтра в три» станет 15:00. Правило живёт в инструкции модели, и его легко поменять под свой режим дня.

С «следующей пятницей» хитрее: тут и люди расходятся во мнениях. Рабочих вариантов два. Записать в инструкцию, как понимаешь это выражение ты сам, или попросить модель ставить такие фразы в «непонятно» и отвечать вопросом.

Какой бы вариант ты ни выбрал, страховка одна. В ответе бота стоит не только дата, но и день недели словом: «пятница 21.08, 11:00-13:00». Цифры глаз пропускает, а слово «пятница» рядом с датой читается мгновенно. Приём, когда агент задаёт уточняющий вопрос вместо догадки, подробно разбирал в материале о том, почему агенту стоит задавать вопросы.

Часовой пояс: где теряется час

Часовой пояс ломает встречи тише всего. Ты сказал «в 16», модель записала 16:00, а в календаре может оказаться 19:00, если где-то по дороге время посчитали по поясу сервера. Бот работает на сервере, а у сервера свои часы, и совпадать с твоими они не обязаны.

Поэтому в моём боте пояс нигде не подразумевается. Он хранится в настройках названием из базы часовых поясов, например Europe/Moscow. Модель получает его в строке «Сейчас», событие в календаре - явным полем у начала и конца, сервис видеосвязи - отдельным полем.

Вторая ловушка - формат. Стандарт ISO 8601 позволяет записать один момент по-разному: с поясом, со смещением, без секунд. Я поймал это живьём: попросил встречу в Zoom на 23:00 следующего дня, а получил встречу на текущий момент. Время без секунд Zoom молча проигнорировал, без единой ошибки.

Лечение оказалось простым. Код приводит время к строгому виду «год-месяц-деньTчасы:минуты:секунды» и падает на всём, что не распознал. Лучше внятный отказ, чем встреча не в тот час.

Что делает слово «зум»?

Фраза «зум с партнёром завтра в 16 на час» - это два действия в двух сервисах. Порядок жёсткий: сначала ссылка, потом событие, иначе событие останется с пустым описанием.

Ссылка кладётся в описание события обычным текстом вместе с номером встречи. Встроенное поле видеоконференций календаря рассчитано на собственные сервисы Google, и внешнюю ссылку через него у меня создать не вышло: календарь отвечал ошибкой. Текст в описании работает везде и открывается с любого телефона.

Если Zoom не ответил, встреча в календаре всё равно создаётся, а в ответе бота появляется строка «Ссылку Zoom сделать не вышло» с причиной. Потерять встречу из-за упавшей ссылки хуже, чем добавить ссылку руками.

Для тех, кто не хочет следить за словами, в боте две кнопки. «Календарь» - ссылка не создаётся никогда. «Zoom» - создаётся всегда. Без кнопки бот решает по словам во фразе.

Нужно ли подтверждение перед созданием события?

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

Голосовое сначала распознаётся, и бот тут же показывает текст расшифровки курсивом. Если распознавание переврало слово, это видно раньше, чем появится встреча.

Потом модель заполняет бланк, код проверяет поля, любая нестыковка даёт отказ с объяснением. Прошла проверку - встреча создаётся, а в ответе стоят название, день недели, дата, начало и конец.

Удаление - отдельная история. Этот бот умеет только создавать события. Правило на будущее записано в плане заранее: удаление только по явному слову «удали» или «отмени». Фраза «удали мой календарь», которую я подсунул на проверке, закончилась ответом «непонятно»: текст реплики модель читает как данные, а не как команду.

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

Порядок сборки своего помощника

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

  1. Передай модели текущий момент

    Дата, время, день недели и часовой пояс - в каждом запросе. Без этого остальное не имеет смысла.

  2. Получай бланк, а не текст

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

  3. Проверь бланк кодом

    День недели против даты, время против текущего момента, длительность против разумных границ. Расхождение - отказ.

  4. Собери свои десять фраз

    Завтра, пятница, диапазон, время без «утра» и «вечера», дата без времени, прошлое, чужая команда в тексте. Каждая даёт ожидаемый результат до того, как бот пойдёт в работу.

  5. Подключи календарь и видеосвязь

    Пояс явно, адрес календаря явно, время строго с секундами. Порядок: сначала ссылка, потом событие.

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

Частые вопросы

Частые вопросы

Главный вывод

Голосовой помощник для календаря держится не на умной модели, а на скучных проверках вокруг неё. Строка с текущим моментом, день недели словом, отказ вместо догадки, пояс на каждом стыке.

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

А ты уже доверяешь нейросети свой календарь или пока заводишь встречи руками?

Источники

Отправь другу или себе в избранное в Telegram, чтобы не потерять.

Поделиться в Telegram
Было полезно?
Автор
Дмитрий Анашкин
Практик-интегратор ИИ в бизнес

Основатель NeuroDA и SMAIPL. Корпоративные воркшопы по ИИ, внедрение AI в бизнес-процессы.

Похожие гайды

Чат, «Работа» или Codex: какой режим ChatGPT выбрать под задачу

Чат отвечает, «Работа» доводит задачу до файла, Codex пишет код, а лимит у последних двух общий. Разбираю на случае ученика, как один документ съел пятичасовой запас, какую модель ставить на тарифе за 20 долларов и как перенести настройки из Claude Code.

9 мин

Автозадачи: как агент работает, пока тебя нет

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

8 мин

Инструкция устарела за месяц: как с этим жить

За один прогон обучения материалы дважды разошлись с интерфейсом: пункт настройки переименовали, а нужная команда появилась уже после сборки курса. Разбираю, что устаревает быстрее всего, почему «обновлять чаще» не помогает и как сменить единицу описания, чтобы документ жил годами.

8 мин

Расшифровка записи, которая не уходит в облако

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

8 мин

Связанные понятия