Пожалуй, новости о языковых моделях и их использовании уже немного надоели, но лично я нашел для себя полезное применение - изучать английский, в том числе и разговорный. Посмотрим, что могут нам предложить в этом деле товарищи из openai: совместим gpt-3.5-turbo, whisper и telegram.
Еще одним мотиватором было желание сделать свой личный проект с telegram-ботами и серверами. Идеи появлялись и раньше, но тратить деньги на сервер с бесполезным приложением не хотелось. А тут вроде и полезно.
Приводить код в статье, наверное, нет смысла. Интересующимся предлагаю заглянуть в репозиторий.
В ходе диалога модель что-то поправляла, что-то пропускала. Игнорирование моих ошибок было особенно заметно на длинных сообщениях.
Но печатать текст - это не так сложно, как разговаривать. При печати у меня больше времени на подумать и исправить. Если я хочу большего реализма, то мне нужно говорить - я зачитываю свой ответ в микрофон, модель распознавания речи (SAR) транскрибирует мою речь в текст, который и будет отправляться языковой модели. Быстрый гуглеж выдал уже готовые поделки, вроде voiceGPT. Но это приложение оказалось слишком неудобным для моих задач: запись голоса обрывалась при первом же распознавании части фразы, а постоянные проверки браузера при подключении к аккаунту openai раздражали. Я решил, что проще будет использовать любую хорошую модель SAR, тем более, что я уже запланировал реализовать передачу сообщений через отдельный сервер, чтобы общаться с ботом в телеграме, удобно развалившись вечером на диване.
Из интересного - в интернетах советуют настраивать вебхуки, чтобы не дожидаться опроса от серверов телеграма. На практике оказалось, что задержки по времени даже не заметны, и для таких мелких задач можно оставить и polling.
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 как простую болталку. А чтобы не повторять каждый раз задание, под начало диалога с коррекциями от модели, я выделил отдельную кнопку. В боте стоят фильтры на обработчик текста или аудио, можно общаться как удобно. И вот, что получилось при запуске:
Модель приняла правила, но сделала это довольно сухо по сравнению с веб-версией. Она не предложила выбрать тему разговора и не дала понять, спрашивает ли она у меня что-либо в данный момент. Хотя ответы были связными и корректными, а при уходе от темы она это замечала. Но я заметил странное поведение, который требует от меня самого быть чуть более вежливым:
Я сначала поздоровался и потребовал задание, и это привело к тому, что модель отреагировала почти так же, как в веб-версии, т.е. более развернуто и "по-человечески". Очевидно, это связано с необходимостью первым сообщением явно задавать модели роль ассистента. Еще из интересного - видно, как модель уводит в сторону и она начинает задавать дополнительные вопросы, хоть и по теме.
Сервер
Никакого сложного администрирования я не делал, тем более, что не разбираюсь в этом, поэтому рекомендую обратиться к соответствующим статьям, как, например, эта.
Предисловие
Основная мотивация - нужно заговорить на английском. Мой уровень 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!
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 рублей в месяц, примерно как один урок в известной школе английского языка.Сервер
Никакого сложного администрирования я не делал, тем более, что не разбираюсь в этом, поэтому рекомендую обратиться к соответствующим статьям, как, например, эта.
Выводы
А выводы очень простые - я потратил один день, чтобы написать интересную и полезную вещь, которая позволяет мне болтать с "иностранцем", который хоть и не всегда, но исправляет мою речь. Надеюсь, кому-нибудь такой опыт окажется полезным.Учим английский с chatGPT
Пожалуй, новости о языковых моделях и их использовании уже немного надоели, но лично я нашел для себя полезное применение - изучать английский, в том числе и разговорный. Посмотрим, что могут нам...
habr.com