malahov.io

Теперь у журнала можно спросить

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

Автор: Georg Malahov

Декабрь, мы на каникулах в гостях, дом полон детей, и работать получается только урывками: из машины, пока жена в магазине, вечером, пока все смотрят «Один дома 2». Одной такой ночью я наговаривал заметку шёпотом, чтобы никого не разбудить, — и отправлял её, не зная, разберёт ли расшифровка хоть слово. Тем не менее за неделю таких урывков голосовой журнал из «бота, который складывает записи» превратился в систему, у которой можно спрашивать.

База осталась той же, что при запуске: телеграм-бот принимает голосовое, складывает файл в S3, а расшифровку и метаданные заводит в Strapi. Поверх появился простейший веб-интерфейс: бот отвечает ссылкой на созданную заметку, по ссылке — вход и просмотр. Авторизацию я сделал простую; по-хорошему её надо переводить на HTTP-only cookie, но пока решил не закапываться.

Главное новое — поиск по смыслу. Каждая заметка превращается в эмбеддинг — числовой отпечаток смысла текста: у похожих по смыслу заметок отпечатки оказываются рядом, и по вопросу можно найти близкие заметки, даже если слова в них другие. Храню эмбеддинги в Pinecone, облачной векторной базе. Быстро вылезло ограничение: даты эмбеддинги понимают плохо. Вопрос «что было вчера?» по смыслу ни к чему не близок. Поэтому перед поиском теперь стоит фильтр: если в вопросе есть даты — «вчера», «за этот месяц», — сначала отбираются заметки за нужный период, и их полный текст уходит в языковую модель, которая отвечает на вопрос. А для явного поиска по заметкам добавил в чат кнопку быстрого упоминания notes.

К ответам чата я прикрутил ссылки на исходные сообщения: видно, из каких заметок ответ собран, и можно перейти и проверить. Ещё добавил кэш ответов в памяти, чтобы одинаковые вопросы не порождали лишних запросов к моделям, — примитивный, но пока хватает. Отдельная серия правок ушла на iPhone: Safari не играет ogg-файлы, в которых Telegram присылает голосовые, так что теперь они конвертируются в mp3, а у видео генерируются постеры. Аудиозаметки наконец слушаются с телефона.

На этом я останавливаюсь. Всё базовое, что хотел, реализовано, а идеи продолжают приходить быстрее, чем я успеваю их делать, — теперь я их записываю в issues, список задач в GitHub, и какое-то время собираюсь просто жить с тем, что есть. Единственное, что по-прежнему бесит, — сам ввод: достать телефон, разблокировать, открыть Telegram, зажать кнопку. Хочется этот путь сократить.

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