Пожалуй, новости о языковых моделях и их использовании уже немного надоели, но лично я нашел для себя полезное применение - изучать английский, в том числе и разговорный. Посмотрим, что могут нам предложить в этом деле товарищи из openai: совместим gpt-3.5-turbo, whisper и telegram.
Предисловие
Основная мотивация - нужно заговорить на английском. Мой уровень B1, почти B2, но преимущественно в чтении и письме. Уроки с учителем стоят довольно дорого, ходить в английские клубы я стесняюсь, да и вообще коммуницировать с людьми не люблю. Поэтому решил, что для начала я заставлю себя говорить, хотя бы плохо, а потом отшлифую уровень с живыми людьми.
Еще одним мотиватором было желание сделать свой личный проект с telegram-ботами и серверами. Идеи появлялись и раньше, но тратить деньги на сервер с бесполезным приложением не хотелось. А тут вроде и полезно.
Приводить код в статье, наверное, нет смысла. Интересующимся предлагаю заглянуть в репозиторий.
Постановка задачи
Для начала нужно выяснить, а может ли вообще chatGPT помочь мне с английским. Мне нужна была не просто болталка, а коррекция моих фраз. Естественно, языковая модель прекрасно поняла правила игры:
В ходе диалога модель что-то поправляла, что-то пропускала. Игнорирование моих ошибок было особенно заметно на длинных сообщениях.
Но печатать текст - это не так сложно, как разговаривать. При печати у меня больше времени на подумать и исправить. Если я хочу большего реализма, то мне нужно говорить - я зачитываю свой ответ в микрофон, модель распознавания речи (SAR) транскрибирует мою речь в текст, который и будет отправляться языковой модели. Быстрый гуглеж выдал уже готовые поделки, вроде voiceGPT. Но это приложение оказалось слишком неудобным для моих задач: запись голоса обрывалась при первом же распознавании части фразы, а постоянные проверки браузера при подключении к аккаунту openai раздражали. Я решил, что проще будет использовать любую хорошую модель SAR, тем более, что я уже запланировал реализовать передачу сообщений через отдельный сервер, чтобы общаться с ботом в телеграме, удобно развалившись вечером на диване.
Проверка моделей SAR
Забегая вперед, скажу, что в итоге я использую модель whisper от того же openai через API. Но изначально я планировал загружать модель на сервере (тем более, что они работают на CPU), поэтому я пошел на hugginface и выбрал для себя несколько моделей для сравнения. Ниже представляю расшифровку текста задания для chatGPT, которую я надиктовал в диктофон:
facebook/wav2vec2-base-960h
UNCLE SUGGEST A TOPIC FAL CONVERSATION AND YOU WILL ASK AQUATION ON IT THEN CHECK MY AUN SECAL GROMETICAL ERRORS AND OFFER THE CORRECT OPTION THEN YOU ASK THE NEXT COUATION LET'S GO
facebook/wav2vec2-large-960h-lv60-self
I WILL SUGGEST A TOPIC FOR CONVERSATION AND YOU WILL ASK A QUESTION ON IT THEN CHECK MY ANSWER FOR GRAMMETICAL ERRORS AND OFFER THE CORRECT OPTION THEN YOU ASK THE NEXT QUESTION LET'S GO
jonatasgrosman/wav2vec2-large-xlsr-53-english
i will suggest a topic for conversation and you will ask a quetion on it then check my alswey for gramatical errors and offer the correct option then you ask the next question let's go
openai/whisper-medium.en
I will suggest a topic for conversation and you will ask a question on it. Then check my answer for grammatical errors and offer the correct option. Then you ask the next question. Let's go!
И снова openai оказался лучше всех, даже умеет поддерживать регистр и знаки препинания. Вообще, можно было бы и использовать последнюю модель, но на слабом процессоре сервера (к тому же единственном) расшифровка сообщения занимала примерно минуту, из-за чего диалог был похож на типичный диалог с приятелем в вк, который постоянно пропадает. В конце концов, 0.006 доллара за минуту расшифровки аудиосообщения не так уж много.
python-telegram-bot
До этого я не писал телеграм-ботов, в связи с чем, возможно, выбрал не самую лучшую библиотеку. Кроме того, почти все примеры и решения на stackoverflow с использованием этой библиотеки были для старой версии (как будто бы все перестали писать телеграм-ботов). На самом деле, ничего принципиально нового здесь сказать не могу. Обычный бот, который принимает текстовые и аудио-сообщения и перенаправляет их по API. Ботом планирую пользоваться пока что только я, позже, возможно, добавлю жену, поэтому настройки безопасности довольно простые - все входящие сообщения фильтруются по моему телеграм-id.
Из интересного - в интернетах советуют настраивать вебхуки, чтобы не дожидаться опроса от серверов телеграма. На практике оказалось, что задержки по времени даже не заметны, и для таких мелких задач можно оставить и polling.
Собираем все вместе
Очевидно, хотя сразу я об этом не подумал, что языковая модель не хранит в себе историю переписки, из-за чего при использовании gpt через API нужно каждый раз передавать весь свой диалог, как, например, в коде ниже (а ведь обещал без кода).
def process(self, message: str, role: str = "user") -> str:
self.query['messages'].append({"role": role, "content": message})
response = self.session.post(self.url, json=self.query)
if response.status_code == 200:
reply = json.loads(response.text)['choices'][0]['message']['content']
self.query['messages'].append({"role": "assistant", "content": reply})
return reply
return f"Something went wrong. {response.text}"
Для использования в одно лицо этого достаточно + кнопка сброса, которая очищает список запросов.
Функционал бота позволяет начать свободный диалог, используя gpt как простую болталку. А чтобы не повторять каждый раз задание, под начало диалога с коррекциями от модели, я выделил отдельную кнопку. В боте стоят фильтры на обработчик текста или аудио, можно общаться как удобно. И вот, что получилось при запуске:
Модель приняла правила, но сделала это довольно сухо по сравнению с веб-версией. Она не предложила выбрать тему разговора и не дала понять, спрашивает ли она у меня что-либо в данный момент. Хотя ответы были связными и корректными, а при уходе от темы она это замечала. Но я заметил странное поведение, который требует от меня самого быть чуть более вежливым:
Я сначала поздоровался и потребовал задание, и это привело к тому, что модель отреагировала почти так же, как в веб-версии, т.е. более развернуто и "по-человечески". Очевидно, это связано с необходимостью первым сообщением явно задавать модели роль ассистента. Еще из интересного - видно, как модель уводит в сторону и она начинает задавать дополнительные вопросы, хоть и по теме.
Выбор сервера
Самый дешевый и самый слабый. Такой сервер обошелся мне в 1900 рублей в месяц, примерно как один урок в известной школе английского языка.
Никакого сложного администрирования я не делал, тем более, что не разбираюсь в этом, поэтому рекомендую обратиться к соответствующим статьям, как, например, эта.
Выводы
А выводы очень простые - я потратил один день, чтобы написать интересную и полезную вещь, которая позволяет мне болтать с "иностранцем", который хоть и не всегда, но исправляет мою речь. Надеюсь, кому-нибудь такой опыт окажется полезным.