Проект: Crocodiler — бот для игры в Алиас  Публичный пост
22 мая 2024  359
Crocodiler — бот для игры в Алиас

Расскажите о себе и сути проекта?

Телеграм-бот для игры в Крокодила (Шляпу, Алиас или типа того).

Бот тебе выдаёт случайное слово из набора, ты его должен объяснить другим в чате, не используя однокоренные слова. Можно играть на разных языках, есть наборы слов на разные уровни сложности. Есть встроенный словарь, чтобы смотреть значения незнакомых слов. Пока добавил английский и русский, могу добавить больше языков или какие-нибудь тематические наборы. Есть одиночный режим игры против ИИ.

Это должно быть очень полезно для изучения языков. Ведь нет способа лучше понять и запомнить значение слова, чем объяснить его другому человеку. Да и просто играть на русском весело.

Как появилась идея? Что вдохновило?

С прошлого года в голове витала мысль, что было бы прикольно сделать какое-нибудь приложение с использованием ИИ. Это сейчас круто, модно, молодежно; все добавляют себе ИИ. Особенно когда обсуждали с друзьями возможную поездку в Испанию. Кажется, это был бы хороший вариант для стартап-визы. С огромными корпорациями тягаться невозможно, конечно, но вполне реально разработать что-то свое небольшое. Чтобы наш ИИ умел делать только одну вещь, но делал ее лучше других. Но конкретных идей тогда не было. В Испанию мы так и не поехали, а мысль осталась.

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

  • Он иногда начинает сильно подвисать. Бывает, нужно ждать по несколько минут, чтобы он принял правильный ответ или выдал следующее слово.
  • Он выдает очень сложные слова, которые никто из нас никогда не слышал. Объясняли их частями или через созвучные слова, но это не так интересно. А потом сами искали определения.
  • Не очень часто, но он рассылает рекламу.

А параллельно я как раз развлекался с запуском локальных нейросетей на своем ноутбуке. И оказалось, если подобрать запрос, то они могут довольно неплохо угадывать английские слова, даже если ты объясняешь очень неточно. И работает это достаточно быстро даже на ноутбуке, даже без видеокарты. Ну а для игры на русском можно подключиться к нейросети в облаке.

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

Что вошло в прототип и сколько времени на него было потрачено?

Как и планировалось, первую версию удалось разработать буквально за два-три вечера. Это был минимально играбельный бот, который уже мог заменить старого Крокодила. Там был выбор из трех, кажется, наборов русских слов (очень простой, простой и нормальный). Бот мог выдавать случайные слова ведущему игры и определять победителя.

Дальше добавил английские слова, перевод интерфейса, больше функций, добавил встроенный словарь и игру с ИИ. Всего разработка заняла период около 3-4 недель. Конечно, при том, что я занимался этим не каждый вечер.

Какой технологический стек вы использовали? Почему?

Я в свободное время пишу на Go, он мне очень нравится и как раз прекрасно подходит для таких целей. Не на C++ же бота писать. Настройки чатов для простоты хранятся в sqlite. Если наберется много пользователей, и бот начнет из-за этого тормозить, придется переходить на нормальную БД. Но сейчас этого вполне хватает. А больше и никакого стека.

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

Пробовал много разных моделей ИИ. Какие-то, как Mistral, совсем не получилось заставить отвечать только одним словом. Они нормально угадывают, но всегда отвечают в стиле: «Какая интересная загадка! Я думаю, это слово "Х"». То есть мне еще нужно было бы парсить ответ. Возможно, надо лучше подобрать запрос, но у меня не получилось. Модели поменьше совсем с трудом что-то угадывали.

Самая лучшая локальная модель — Llama-3-8B. Это просто огонь, топ и восторг. Прекрасно понимает инструкции, идеально угадывает слова. По рейтингам она работает вроде даже лучше ChatGPT-3.5. Ее как раз выпустили в апреле.

Еще есть мысль набрать побольше логов игры и дообучить какую-то свою маленькую модель специально на угадывание слов. Возможно, еще попробую в будущем, было бы по крайней мере интересно. А пока посмотрел цены на аренду серверов и понял, что при небольшом количестве пользователей держать свою модель абсолютно невыгодно. В итоге все-таки подключил к ChatGPT-3.5 через API.

А недавно узнал, что есть сервис Groq, который дает бесплатный и почти безлимитный доступ к моделям Llama-3. Сейчас как раз переведу бота на него, кстати.

Как вы запускались и искали первых пользователей?

Добавил в чат, где мы играли раньше, и мы стали играть в этого бота. Заменил старого бота в чате, где люди тренируются говорить на английском, им вроде тоже понравилось. Старого бота везде тоже добавлял я. Потом написал в других дружеских чатах, написал в своем уютном канале, кинул знакомым. Теперь пишу сюда. Никак особо не раскручивался и не планирую.

С какими самыми неожиданными трудностями пришлось столкнуться?

Самым сложным было искать наборы слов и словари. В интернете есть в свободном доступе списки слов для разных языков, отсортированные по частоте встречаемости. Но чаще всего они никак не размечены, не нормализованы. Это просто слова, вырванные из текстов с помощью регулярных выражений. Как они использовались в предложениях, так они и есть. А мне для игры важно иметь существительные в начальной форме. В итоге собирал слова по разным сайтам и выдирал из разных ресурсов, компоновал и удалял лишнее. Не уверен, могу ли я использовать их в своем проекте по лицензии, но это ведь всего лишь отдельные слова.

Для показа определений сначала искал свободные словари в формате StarDict. На английском есть проект GCIDE, но он старый, там многих слов не хватает. Для русского в интернете есть словари Даля, Ушакова и другие, но опять же непонятно, под какой лицензией они выложены. Есть один проект по перекладыванию в StarDict русского Викисловаря, но он находится в стадии альфа. Я долго пытался его распарсить, но там очень много недоработок. В конце концов нашел сайт с дампами Викисловарей в JSON, и с ними все сложилось отлично.

Несколько скринов, чтобы разбавить текст.

В течение игры только ведущий может посмотреть текущее слово и его определение. После того как слово угадали, можно отправить полное определение в чат.

Такие наборы слов сейчас есть для английского
Такие наборы слов сейчас есть для английского

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

Вот с Mistral была сложность. Они в апреле чуть изменили свой API, стали строже проверять пустые поля в JSON. Библиотека с GitHub перестала работать, на нормальные запросы получала ошибку. У них висел PR с исправлением, там буквально несколько строк. Сейчас посмотрел — его влили только спустя месяц.

Сколько потратили и заработали? Есть идеи как это можно монетизировать?

Трачу 4 доллара в месяц аренды сервера на DigitalOcean. Отдал 5 долларов — минимальная плата за ChatGPT API. Но из них пока на игру ушло несколько центов, так как в основном играем в чатах. Личное время — бесценно.

Стремления монетизировать нет. Но если вдруг пользователей станет много, то можно будет что-то придумать. Для начала можно будет добавить ссылку на донаты на сервер. Можно оставить бесплатную игру в чатах, но сделать платную подписку на игру с ИИ. Или оставить бесплатно только пару десятков слов в сутки. Или оставить бесплатно только самые простые наборы слов.

Какие планы на будущее?

Грандиозных планов не строю. Главная цель проекта была — развлечься на несколько вечеров, реализовав что-то интересное и полезное. Эта цель выполнена успешно. Сейчас я уже немного охладел и переключился на другие проекты. О них расскажу в другой раз. Не уверен, что буду сильно развивать этого бота. Но если новые функции окажутся востребованными, то вполне вероятно, что вернусь к нему. А так — будет работать, пока кто-то пользуется, буду поддерживать.

Самое главное, что не хватает второй половины игры против ИИ. Ты можешь объяснять слова боту, но бот не может загадать слово тебе. У меня есть идеи, как это реализовать, какой подобрать промпт, но я пока не пробовал. И для этого сначала нужно рефакторить код и хорошо бы написать тесты, а этим заниматься лень.

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

Нужны ли какие-то советы или помощь Клуба?

Если можете посоветовать какой-то минимально дешевый, но без проблем работающий сервер, было бы хорошо. И не в России, так как необходим доступ к зарубежным API. Для этого бота не нужно вообще ничего, он занимает несколько десятков мегабайт на диске и в памяти. Платить за DigitalOcean кажется дороговато, я привык дешевле.

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

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

Какой совет вы бы сами могли дать идущим по вашим стопам?

Надо делать, что нравится, и, по возможности, ничего не усложнять.

Аватар Василий Ходаков
Василий Ходаков @binque
Разрабатываю на С++Испаер
📍Белград, Сербия

тг вк инст хабр гитхаб

Люблю людей, животных, жизнь, глубокие разговоры, программировать, кататься на самокате, путешествовать, рисовать наброски и обниматься. В свободное время разрабатываю Майндвелл — сервис личных дневников.

6 комментариев 👇
Артем Снегирев Обучаю AI ассистентов разговаривать 22 мая в 12:33

Привет, спасибо за проект! Я делал кое-что очень похожее в прошлом году. Можешь взять словарь для русского языка отсюда. А для английского я парсил один сайт, там даже картинки были, но не смог сходу найти. Для некоторых экзаменов должны быть списки слов под каждый уровень языка, иногда даже разбитые по тематикам, можно так поискать. Аватарку можешь сделать через картиночные генеративки вроде midjourney. Еще я экспериментировал с обучением легковесной модели, код можно тут взять, подставить другие модели и данные, уровень конечно похуже чем у современных ллмок). Иногда было и правда увлекательно объяснять слова боту на неродном языке, хорошая тренировка. Успехов!

  Развернуть 1 комментарий

@artemsnegirev, о, спасибо большое за ссылки! Почитаю, посмотрю, попробую взять слова. Да, слова для английского по уровням я так и нашел — с сайтов для подготовки к экзаменам. Аватарку уже сгенерировали)

  Развернуть 1 комментарий
Chimit Head of Engineering 23 мая в 05:41

Классный бот! Как раз искал что-то подобное.

Бот заметно быстро отвечает. Если я правильно понимаю, это все еще API ChatGPT-3.5. Интересно, так ли быстро будет отвечать Llama? У меня на локалке она не очень-то расторопная.

Заметил пару косяков:

  1. выбираю русский язык, но игра все равно предлагает английские слова.
  2. судя по всему, в одиночной игре с ботом он не объединяет все подсказки в одно целое, а использует в качестве контекста только последнюю подсказку. Возможно, стоит добавлять в контекст все подсказки.
  3. игра не воспринимает множественное число за правильный ответ. Например, если ответ "tooth", то вариант "teeth" не считается правильным. Хотя тут наверно зависит от правил.
  Развернуть 1 комментарий

@chimit, спасибо, рад, что вы нашли друг друга)

  1. Команда /language меняет только язык интерфейса независимо от набора слов. /word_pack позволяет выбрать слова на другом языке.
  2. Не, он должен хранить весь диалог. История очищается только при переходе к новому слову. На первом скрине в посте как раз видно, что я ему говорю назвать похожее слово, и бот понимает, что я имею в виду похожее на предыдущее.

Я вчера сменил API на Groq, поставил Llama-3-8B. Если она плохо угадывает, то можно все-таки поставить Llama-3-70B. На этом сервисе они обе бесплатные и очень быстро отвечают, но на большей модели в несколько раже ниже лимиты.
Но я вот сейчас по-быстрому еще раз проверил, вроде нормально угадывает даже на русском и с учетом контекста.


3. Это да, нужно прямо добуквенное совпадение слова. Чтобы принимать ответы в множественном числе, это где-то еще придется искать такой специальный словарь. Еще могут быть сложности с е/ё и написанием слов типа color/colour. С этим еще можно придумать что-то. Думаю, это не нужно, можно же просто попросить назвать то же слово в единственном числе или исправить букву, бот должен понимать.

  Развернуть 1 комментарий
  1. Не супер очевидно :) Возможно, стоит принудительно спрашивать word pack перед началом игры, либо хотя бы выводить.

  2. Просто у меня вот такая ситуация была: почему-то предложил скорпиона, хоть он не жужжит, не летает и вроде даже не полосатый:

  1. Получается, детектирование правильного ответа не дергает AI? Как вариант можно добавить) Правда, количество запросов, конечно, возрастет.
  Развернуть 1 комментарий

@chimit,

  1. Хорошо, добавлю выбор набора слов после начала игры. Вечером сегодня, может.
  2. Это уже сама модель так отвечает. Поменял на 70B модель, теперь должно быть лучше. 8B все-таки недостаточно умная оказалась. Но в целом, мне кажется, они все похуже понимают русский, может быть еще из-за этого. Плюс когда играем с живыми людьми, тоже не всегда надо учитывать предыдущий контекст. Если мое объяснение не поняли, то я могу без предупреждения начать объяснять каким-то обходным путем.
  3. Там просто проверка на совпадение строк. Если отправлять ИИ все сообщения в групповых чатах, я разорюсь)
  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб