Простой GPT-ассистент в Telegram на базе Яндекса и Node.js
В статье вас ждёт «сборка» очень простой связки из распознавания и синтеза речи, а также запросов в модель YandexGPT на Node.js. Наш телеграм бот будет получать голосовое сообщение, а затем распознавать его, скармливать в модель GPT и синтезировать полученный ответ в голосовое сообщение.
Хочется начать с небольшого предисловия. В ходе написания этого простейшего решения я потратил кучу времени на попытку интегрироваться с популярным OpenAI ChatGPT, но мои нервы вышли из чата (обход блокировки, HTTPS прокси и т.п.), поэтому я перешёл к Яндексу. Он встречает нас дружелюбной консолью, понятной документацией и грантом на тестирование. В целом, если гранта по каким-либо причинам нет, то мне на все тесты хватило 20 рублей.
Telegram фреймворк
Для работы с телеграм я взял самый лучший (на мой взгляд) фреймворк — GrammyJS. Немного про работу с телеграм: самый простой путь — это long polling, когда вы периодически опрашиваете сервер телеграмма о новых событиях, а дальше их обрабатываете — также отправляя HTTP-запросы. В целом, со всеми этими задачами прекрасно справляется Grammy.
Здесь хочется дополнить, что Grammy даёт очень гибкую систему привязки для обработки событий, о которой вы можете подробнее узнать на их офф.сайте. Если кратко, то вы можете указать, что вам нужны именно сообщения, содержащие голосовое сообщение, картинку или другой контент.
Для ответа голосовым Grammy предоставляет прекрасный метод внутри контекста: ctx.replyWithVoice . Он принимает в себя объект класса InputFile , который можно собрать из Buffer’a , потока или Uint8Array . Дальше библиотека сама разберётся с загрузкой файла на сервер телеграмма.
Например, это может выглядеть вот так:
Кстати, скачать голосовое из телеграмма тоже крайне просто:
Распознавание и синтез голоса
Для этой задачи мне посчастливилось найти прекрасный NPM пакет, который берёт на себя все задачи по отправке запросов и получению ответов от API Yandex Cloud. Для простоты прототипа я не стал связываться с потоковым распознаванием, да оно и тут и не нужно — голосовое сообщение можно передать целиком.
Первым делом нам нужно настроить доступы, я использовал сервисный аккаунт — это проще всего — https://cloud.yandex.ru/ru/docs/speechkit/quickstart/
А дальше воспользуемся пакетом, чтобы распознать голосовое и синтезировать его обратно:
Запросы к GPT модели
Яндекс предоставляет несколько моделей и даже даёт возможность дообучить модель под себя. Также Яндекс предоставляет два режима на выбор: чат и одноразовый промпт.
Мы действуем в рамках минимального прототипа, поэтому пойдём по самому простому пути — сделаем запросы к стандартной модели YandexGPT в режиме промптов. Для этого найти библиотеку мне не удалось, поэтому ниже будет «полотенце» кода с запросом.
Здесь я прокомментирую лишь пару ключевых моментов. Во-первых, массив messages , в котором мы видим два объекта с разными полями role . Согласно документации, с помощью role: ‘system’ мы можем «настроить» нашу модель, например, вот так: Ты профессиональный секретарь. Ты прекрасно разбираешься в составлении документов и можешь генерировать их текст по запросу . А role: ‘user’ остаётся для пользовательского запроса в рамках настройки.
Во-вторых, можно обратить внимание на настройки temperature и maxTokens — они позволяют нам настроить степень креативности (непредсказуемости) модели и ограничение в токенах на ответ, чтобы не скрутить весь бюджет сразу.
Собираем всё вместе
В целом, весь код лежит на Github: https://github.com/ByMsx/voice-ai-tg-helper/, а тут я лишь расскажу, как его запустить.
Для начала вам понадобится установленный Node.js 18-й версии или Docker, а дальше просто создаём .env файл, в котором указываем настройки:
А дальше просто раскатываем проект (вводим эти команды в терминал или командную строку).
Переходим в созданного через BotFather бота, нажимаем старт и записываем голосовое!
Вместо послесловия
Благодарю вас за внимание! Буду рад любой обратной связи. Дальше планирую изучать нейросети, а не только использовать готовые и делиться этим в статьях.