четверг, 3 сентября 2026 г.

Еще тесты нейронок

Недавно стукнула в голову моча и решил сделать букмарклет для подсчета скорости инференса (генерации) для LLM в llama.cpp. В процессе проверки, удивился что мой тест прошли почти с первого раза модели от бартовски - этому не придал особое значение, но потом когда читал статью про ЛЛМ встретил тоже такое что модели то в принципе разные - разные кванты и все прочее. Поэтому захотелось потестировать и это предположение. Беру разные модели с одинаковым квантом и тестирую на одном промпте.

 Это не окончательная статья, просто хотелось бы зафиксировать промежуточный результат и то что получилось, потому что есть некоторые наблюдения

Пока что 2 модели и в них в таблице видно разницу в архитектуре. Модель Бартовски это еще и встроенная драфт модель. Вот поэтому и хочу написать промежуточные результаты, что проверил заодно и скорость с драфтом потому что с 3 и больше вылетает, а с 1 и 2 разные скорости (добавлю в таблицу)

--spec-type draft-mtp --spec-draft-n-max 2

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

В общем пока такая таблица, буду проверять модели Unsloth завтра


 

 

среда, 5 августа 2026 г.

Проверяем клоны Квена и сам Квен

Снова тест нейронок. Как я уже и говорил на моем ПК на сносной скорости я научился запускать МОЕ модели на 35-26мрдр параметров. Можно и больше наверное, но в основном в проде именно такие. Конкретно это Qwen/Qwen3.6-35B-A3B и google/gemma-4-26B-A4B-it из последних, есть еще zai-org/GLM-4.7-Flash (30B-A3B). Среди основы для новых моделей на HF чаще используют именно квен, и сегодня я решил протестировать их. База та же 35B-A3B - правда бывают версии на базе версий 3.5 и 3.6 и не всегда это очевидно где какая. Все модедели прогоняю на одинаковых промтах, мастермайнд - моя заготовка, тетрис: "напиши игру тетрис на html, css, js одной страницей" и есть промпт для игри танки: "Write a game similar to Battle City in a single HTML file without dependencies, running on desktop and mobile". Все модели запускаю с такими параметрами /mnt/xxx/llama/llama-server -m "/mnt/zzz/_models/Salience-1.5-Pro.Q4_K_M.gguf" -c 65536 -cmoe -fa on --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0.00

https://huggingface.co/FrontisAI/Frontis-MA1-35B-GGUF

На базе 3.6 с хорошими бенчами. Бенчи бывает тоже вызвают вопросы, возможно потом напишу об этом больше. Тесты: 

Мастермайнд по моему запросу: 2 запроса, первый запрос игра играется, но есть огрехи с нажатием кнопки и "прилипанием" истории, вторым исправил это. (6357 + 12888 токенов, средняя скорость 26т/с, время 3:56 + 8:10 минут). Тетрис неплохого вида за 1 запрос (на самом деле 2 потому что самый первый остановил - я увидел что он начал тупо писать код в раздумиях). (7157 26 т/с 4:41 минут). Танки получились неплохого вида, проезжают сквозь препятствия. (7417 26 т/с 4:47 минут)

https://huggingface.co/InternScience/Agents-A1-Q4_K_M-GGUF

на базе какой версии сделан не понятно, бэнчи показывают что 3.6 обгоняет. 

Мастермайнд тоже 2 запроса - первый с косяками, играть можно. Вторым исправил размер шаров в панели управления и "прилипание", не исправил серый цвет в попытке. (6001 + 8844, 3:45 + 5:52, 25-26т/с). Тетрис выглядит сильно проще, и по сути со второго запроса (заново), так как первый не рисовал падающие фигуры. (3837, 2:24, 27т/с). Танки выглядят тоже похуже, огромные квадраты, но вполне играбельно, штаба нет (7191, 4:29, 26,6т/с)


https://huggingface.co/mradermacher/Salience-1.5-Pro-GGUF

Тоже умалчивают на базе какой версии сделали, бэнчей нет. Мастермайнд с первого раза - отличный дизайн, все без нареканий по ТЗ (5539, 3:27, 26,7 т/с). Тетрис первым запросом не играбельный, кнопку играть жмешь на заставке и ничего не происходит (6232, 3:54) Второй новый запрос - играбельная игра c  совремнным визуалом (правда сброс на пробеле перезапускает игру) (5436, 3:22, 26,8т/с). Танки получились не играбельными хотя очень навороченные поидее - там анимации, трава, вода, броня, танк проезжает сквозь все препятствия а ощющение будто бы поле недорисовано - есть бонусы, бомбы и прочее, врагов не увидел. Играть не возможно, хотя по размеру и задумке навероченное что-то. (13577, 8:39, 26т/с). Попробовал второй новый запрос и он сделал все тоже глобально и мощно, но не играется (не реагирует на кнопки, ничто не двигается, в тот раз хоть что-то двигалось), огромный танк с маленькими кирпичами и прочим... 8 минут 12600 токенов.

https://huggingface.co/unsloth/Ornith-1.0-35B-GGUF

На базе 3.5 вроде. Мастер майнд симпатичный с первого раза, но кнопка новая игра как-то странно смещена и растянута, не стал просить исправлять (6039, 3:43, 27т/с). тетрис с первого раза, но как-то глючно, не стал просить исправлять. Опускаешь но не фиксируется пока пробел не нажмешь. После убирания слоя следующая фигура не появляется или появляется с глюком и тоже пока не нажмешь пробел. Играть можно но результат такой себе, учитывая что бывали и лучше, правда тоже не спервого раза, но с одного запроса. Визуал неплохой. (5733, 3:39, 26,3т/с). А вот Танки прям поразили, я думал все пиши пропало - пишет и пишет код, но он сделал супер навороченную и играбельную игрую - все движется, работает, есть звуки, бонусы - все это работает великолепно. Я поражен. (21324, 13:55, 25-26 т/с)

 UPD. раз в год и палка стреляет и это именно тот случай (вообще все эти случаи на данный момент, наверное более правильно прогонять каждый промпт по 2 раза) В общем я усомнился в способности делать такую работу каждый раз, запустил модель еще раз и ввел тот же промп. Как и ожидалось модель не справилась - все разы кода много 12к+ токенов, но толку мало. первый запрос пустое поле без карты и врагов, второй - черный экран потом что-то мигает евелится непонятно. третий - можно поиграть - гонять танк, стрелять по кирпичам (пули вылетают сбоку танка), но враги не двигаются, не стреляют, не убиваются, зато есть звук... :


 https://huggingface.co/unsloth/Qwen3.6-35B-A3B-MTP-GGUF

MTP версия ускоренная при помощи втроенной драфт модели, выдает больше скорость. Мастермайнд - Все работает, все по тз с первого раза, вид классный (6 789 tokens, 3 минуты, 37,5т/с). Тетрис в этот раз с косяком - только появляется палка и сразу гейм овер. (7 016 tokens, 3 минуты, 39,6т/с), попросил исправить, надумал 9 904 tokens, 4min 36s, 35.77 t/s - иправил но фигуры стали цветные теперь... и стали летать с бешенной скоростью(. Не играбельно. Даю последний шанс абсолютно новый запрос. Сработало. без звука в этот раз но играть можно (6 236 tokens,2min 35s, 40.05 t/s). Танки после предыдущего не прям вау, но все же играбельно (слабо, потому что штаб не защищен и всего одна жизнь) но что нравится что уровень генерируется разные каждый запуск - это особенность квена - одна из других предыдущих попыток тоже было также - генерация рандомных уровней, мне тогда понравилось. (10 973 tokens, 4min 51s, 37.71 t/s)


https://huggingface.co/bartowski/Kwaipilot_KAT-Coder-V2.5-Dev-GGUF

По бенчам уделывает Квен на раз два. Проверим. Причем по бэнчам он Квену приписал свои странные цифры которые не бьются с оригинальными, и в бенчах есть еще и Ornith по которым которого он тоже разносить с пухом. ММ 1 попытка, хороший визуал, анимации. (5 766 tokens, 3min 33s, 27.05 t/s) тетрис с первого раза, визуально совремнно, цвентно и работает (4 907 tokens, 3min 6s, 26.25 t/s) Танки - выглядит тоже неплохо, но проблема в том что как только пуля в кирпич попадает игра зависает при этом мой танк рендерится внутри кирпича. Попросил исправить, сломал все, при том что генерировал отдельно только js код. Сделал третью попытку. Ну тоже мало играбельная - одну пулю выпустил и все, больше нет. 9 851 tokens, 6min 20s, 25.92 t/s. В общем на первое место не тянет. (Все-таки решил дать шанс и он исправил игру. Починил все сам - пули стреляют, оверлей с началом игры пропадает но не полностью кнопка загараживает вид) играть сложно - все разносят. Но это и интересно. Короче пока на этом все. 

https://huggingface.co/unsloth/GLM-4.7-Flash-GGUF

Странно что он 30B-A3B - то есть активных параметрров столько же и даже меньше общих, но работает медленнее. тест MM не идельно, вид интересный, но есть нарекания к сортировке истории и нумерации попыток при том что один из предыдущих разов с первого раза по тз почти (было нарекание по прилипанию) (5 625 tokens, 5min 4s, 18.48 t/s) решил доделать, появились номера, но сортировка страдает(6 574 tokens, 5min 58s, 18.32 t/s). Тетрис - вид попроще чем у некоторых. В этот раз сгенерировал с первого раза ( почему говорю в этот раз, потому что пару дней назад это было со второго раза, но в той игре был классный звук зато, хотя и вид такой же простецкий немного, там заставка не исчезала после начала игры, вторым запросом испраился). В этот раз все норм, вид такой же по-проще как и говорил, играет. По токенам и времени +- одно и тоже, в этот раз меньше токенов (видимо из-за отсутствия звуковых эффектов) (6 411 tokens, 5min 56s, 18.00 t/s) Танки - прям видно что китайская нейросеть - думала и писала по-китайски, в игре все подсказки и слова на китайском. Игра работает, есть звук, можно играть. Танки простые но танки, кирпичи ломаются, скозь них никто не ездит. Норм, прям неплохо, лучше кадрата однозначно, на уровне фронтис, но вид чуть хуже, зато есть звук и сквозь кирпичи не ездит. (8 826 tokens, 7min 59s, 18.39 t/s)  

https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF

Тоже MTP с драфт моделью. Мастермайнд с первого раза, хороший визуал (6 369 tokens, 3min 50s, 27.65 t/s). Тетрис, с первого раза - визуал простецкий, но все работает (4 291 tokens, 2min 33s, 28.01 t/s). Танки простецкий вид, но интересно что пушка в виде точки - простые квадраты но стильно. Первый раз сгенерировал неиграбельную игру, танки не ездили, мой танк при выстреле сразу геймовер потому что спавнился на базе и пуля уничтожала базу. Вторым запросом починил косяки. перестраховался и своей пулей не могу уничтожить штаб. В остальном мило играбельно. (5959+10079, 3:22+5:58, 29-28т/с)

https://huggingface.co/unsloth/gpt-oss-20b-GGUF

gpt-oss-20b — for lower latency, and local or specialized use cases (21B parameters with 3.6B active parameters). MM первый не рабочий, второй норм, в базу сойдет. 2 966 tokens, 2min 55s, 16.94 t/s. тетрис с первого раза, но с глючками. не уверен что стоит заморачиваться исправлять. 2 664 tokens 2min 41s 16.46 t/s. танки на выходе второй, первый менее интересный поэтому перегенерировал, но конечно таки с большой натяжкой, но как-то играть и очки нарабатывать можно. 3 066 tokens, 3min 6s, 16.47 t/s

среда, 29 июля 2026 г.

Еще соревнования нейросетей

 Ну это больше про аутсайдеров. Кстати нейронки сбера и алисы наконец-то научились проходить мой тест - алиса раньше тупо недописывала код, сбер делал малоиграбельную игру. Но вот пару недель назад тесты были пройдены, но это ожидаемо - когда-то это должно было произойти, просто потому что локальные моделди квен и гемма на 35 и 26 млрд параметров запускаются у меня на ПК с приличной скоростью (больше 20-30 т/с) и выдают очень и очень приличный результат. 

В этот раз я тестирую что-то что отличается от них. Возможно занимаюсь фигней и бесполезностями но почему бы и нет с другой стороны. Есть множество моделей основанных на Qwen - дистиллированые, а еще дообученные, еретики, и прочее - чаще всего частные непонятные поделки, с которыми тоже надо аккуратно - в модели вкладывают виручы и это уже существует. Есть такие же модели основанные на этом же квен, но от студий - это уже поделиями сложнее назвать, к ним больше уважения, хотя и они бывают манипулируют результатами бенчмарков (завышают свои, занижают чужие, вплоть до родительской квен 3.6 - видел такое что бенчмарк с другими результатми у нее, хотя чаще в карточках результаты 3.6 совпадают)

Собственно интересно что-то другое, как будто не похожее, и такое есть. LLama mistral уже тоже не интересно - эти на слуху и не плохие вроде (хуже квена как по мне) но уже мною протестированы ранее и не справлялись, впрочем новые версии жду и буду тестировать - это интересно. И вот есть например вот такое: https://huggingface.co/vectionlabs/Maestro1-9B (9b не думающая)

Итак результат ММ теста (мастермайнд - я для него уже сделал даже букмарклет чтобы не копировать и не вставлять каждый раз в окно llamacpp https://boolkin.blogspot.com/2017/03/pizza.html - после калькулятора букмарклеты чтобы и html получить и чтобы промпт вставить) - тест провален, зациклен, не рисуются кружочки. Тетрис тест (напиши игру тетрис на html, css, js одной страницей) тоже провален. Мои тесты по программированию специфичны, и скорее всего не совсем правильные потому что чисто по вебу, но тем не менее - легко тестировать. впрочем можно сделать то же самое для других языков. Короче эта модель провалилась (скорость 62 и 71 т/с на этих чатах)

От того же разработчика https://huggingface.co/vectionlabs/Salience-1.5-Nano (тоже 9b но думающая)

Тоже провалены оба теста, но ММ - выглядит интереснее и тетрис заготовка выглядит интереснее - но ничего не работает. тест с танками (Write a game similar to Battle City in a single HTML file without dependencies, running on desktop and mobile.) тоже не запустился - заставка красивая но пропадает курсор, второй раз кнопка нажималась но ничего не работало. 60т/с Эти 9б модели похуже чем квен 9б - тоже не годятся  вподметки - тот делал что-то хоть немного работающее, думаю завтра проверю еще раз чтобы убедиться

Второй раз переписываю.... Короче квен 3.5 9б не умнее, тоже не проходит тесты, просто один раз 9б модель сделал а мне играбельную игру ММ, но это было буквально один раз, после этого игры были не играбельные. То же касается и другой модели, Бонзай, о чем будет ниже

другой есть: https://huggingface.co/JetBrains/Mellum2-12B-A2.5B-Thinking-SFT (12б МОЕ думающий). 13 токенов в секунду (квен 35б быстрее работает)... ММ провален, тетрис тоже. тетрис 7+ тыс токенов, в конце такое:  // --- СОБНСТРАИВКА СОБЗАКОВ ---

ну и выбрал не ту модель, буду завтра доделывать. Смысл в том что я выбрал SFT - дообученная но промежуточно (на самой карточке модели сами разрабы пишут Supervised thinking checkpoint) конечноый продук это Thinking. Я ее скачал, тоже запустил но лучше не стало те же 16 т/с но ничего рабочего да еще и разметку на тетрисе криво сделала. В общем удалять и не вспоминать. 

Теперь про Бонзай. Проверял модель 27б Ternary-Bonsai-27B-Q2_g64.gguf

Нужна именно с g64, остальные не запустились (у меня видеопамяти всего 8гб, а модель весит 7.6 Гб причем чтобы запустить ее пришлось перенести часть слоев в ОЗУ -ngl 55 при этом скорость 6 т/с) Эта модель смогла сделать играбельную игру, с уникальным дизайном, правда подсчет быков и коров был не правильный. Сделала тетрис, но там видимо было зацикливание - игра не зупастилась при том что начинает гудеть процессор. Еще у этих моделей есть драфт модели которые имеют меньший размер. 


  Есть еще просто https://huggingface.co/prism-ml/Bonsai-27B-gguf

Тоже 27б но 1 битное квантование (тернари 3 бита) запустилось без проблем  37 т/с, но задачу почти не выполнила. Было всего один раз на рабочем ноуте сделала в принципе работающий тестрис в котором не работал поворот фигур. Вторым промптом попросил указать как сделать поворот (при чем переписывая весь код все напрочь ломалось) заменив нужные блоки - поворот заработал но не шибко хорошо. В общем однозначно глупее, но тем не менее возможно поумнее квена 9б... хотя как сказать у того тоже один раз стрельнуло, о чем писал выше. ЗЫ (на моем ПК снова тетрис были фигуры и двигались но криво косо, не вращались, и в процессе падения квадратные точки... короче такое себе)

Ну и понравилась скорость 8б модели - да игры не делает (делает не рабочие) но зато скорость 122-116 т/с. На этом пока все. Дальше будут еще 

И все-таки дополню. Откровение. модель Nanbeige_Nanbeige4.2-3B-Q8_0.gguf - сделала вполне играбельную игру. Думала на 8 тыс токенов, но в итоге уложилась в 16 тыс. Скорость 43 т/с. Тетрис фигуры падают, вращаются, но не ложатся на пол. Удивительно, но кажется можно доделать. (доделала, я выложу потом результат. Написал ей "хорошая работа! но фигура не ложится на пол, как будто бесконечно падает. поэтому не появляется следующая, а если ронять по харду, то сразу окно что проиграл" и она прислала исправленную играбельную игру в которую нельзя проиграть))) 3млрд параметров, подумать только. Надо тестировать Q4 
PS Не смог пойти спать и проверил Q4 - 60-70 т/с и ММ играбельная снова... по крайней мере можно довести комбинацию до угадывания. Тетрис аналогично. Лишняя скобка, которую удалил и фигуры стали падать, и поворачиваться (правда хуже чем Q8 версии) В общем это реально повторяемый эксперимент - это реально очень умная модель... Удивлен.

среда, 6 мая 2026 г.

Соревнования нейросетей. Снова

 Я просто все еще в шоке с того что на локальном ПК можно запустить локальные нейрости и они будут работать вполне неплохо. Как минимум тот тест что я придумал для них они уже проходят довольно легко. Допустим я проводил не так давно тест больших нейронок на своем запросе про mastermind https://pikabu.ru/story/sdelal_igru_mastermind_pri_pomoshchi_besplatnyikh_neyrosetey_13733435

Там я писал как все начиналось и первую игру делал сам, потом вторую игру делал в qwen в прошлом году в августе 3 дня, потом я придумал неплохой промпт для того чтобы получить что-то похожее, и когда скормил его на ai arena то получил сходу готовую к употреблению игру при помоще клод 4.6. В тот момент я понял что нейросети продвинулись очень вперед и могут делать это за один запрос. Тогда я сделал тест бесплатных нейронок, и результат этого теста описал в той статье. Все это время я не терял надежды получить похожий результат на локальных LLM и вот сейчас это пишу потому что смог этого добиться - когда вышел квен 3.5 один раз (из нескольких) он мне сделал играбельную игру и почти без доработок (вообще доработать в локальной llm будет наверное та еще боль, в ней я запускаю с контекстом 8000-18000 то есть сильно не развернуться - допустим в первый раз где доделывал 3 дня я наверняка потратил с полмиллиона контекста, хотя и хз, уже и не узнать)

четверг, 19 марта 2026 г.

Тест нейросетей 2

 Ну или 3 или 5, я их постоянно тестирую. Но в этот раз локальные модели Qwen. В связи с тем что собрал новый комп с более-менее мощной картой 3070, получается сейчас можно запускать квантованые модели на 9 млрд параметров а это уже совсем другой уровень. Возможно. Это и предстоит выяснить. На давнный момент вышла версия квен 3,5 - это хорошая модель, думающая. У меня на карте выдает 60т/с llama cpp cuda. Почему-то вулкан не запустился ну да лаждно. Это модель 9b. 

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

В общем покуда получается запускать с лучим результатом 9b модель, то пожалуй на ней и остановлюсь пока что. А сегодня проверял такое еще, но они как и говорил хуже видят. (я хотел проверить 4b оказалось проверил и в этой задаче квадрат увидел как треугольник, то есть он подумал 4 м2 это площадь треугольника):

вторник, 17 февраля 2026 г.

Как работают нейросети

Недавно один разработчик нейросетей написал код нейросети на python содержащий всего 200 строк (+коменнтарии, то есть кода даже меньше). Эта нейросеть как и все остальные нейросети - сначала обучается, а потом генерирует.  Вот статья откуда я про это узнал. Она хоть и маленькая, но все же нейросеть, и она действительно генерирует то на чем обучилась. Разработчик предложил понять ее работу на основе генерации имен: он создал датасет (информация для обучения нейросети) который является словарем имен состоящий из 32000 строк, где каждая строка это отдельное имя. Нейросеть в процессе обучения предполагает случайное имя, и сверяет его со словарем, в процессе сверки обновляя свои параметры, чтобы понимать как лучше генерировать имена в дальнейшем. Пройдя 1000 циклов обучения, она имеет готовый массив чисел (об этом позже), на основании которого может сгенерировать 20 имен. Все это можно прогнать в онлайн на этой странице (просто нажмите генерировать), а выглядит все это примерно вот так:


обращаю внимание что даже эта страница по ссылке тоже полностью сгенерирована нейросетью, я просто попросил ее создать для онлайн обучения и понимания принципов работы. Можно обучить microgpt на своем словаре (датасете) и получить другие генерации близкие к тому, что у вас есть в вашем датасете. Например вот список городов РФ: https://boolkin.github.io/html/Vibe/microgpt/cities.txt Скачайте, скормите, посмотрите, поиграйтесь с настройками. По идее количество циклов обучения улучшает нейросеть, но тут это работает не совсем понятно, потому что коэффициент loss я не получал ниже 2, может что-то не так делаю. Сейчас о том как это работает:

В общем-то нейросети это никакие не чудеса — это обычная математика. По-большому счету, все что делают нейросети (привычные нам LLM или генераторы звуков и картинок) — это генерируют токены: слова, буквы, пиксели.
Все это они делают на основе обучения. Они научились тому, что если есть какая-то последовательность букв, то следующей с высокой вероятностью должна идти такая-то. Поэтому выдают текст, который в целом вполне осмысленный, хотя сама нейронка его почти не понимает. Она просто обучена на миллиардах текстов и вычисляет (предсказывает) следующие токены, которые встречались в похожих контекстах во время обучения.
И хотя мы видим при общении с нейросетью процесс генерации — текст создается на наших глазах, — ничего принципиально нового не создается. Пользователю выдают то, что уже было «известно» модели в виде закономерностей, просто сгруппированное в конкретной последовательности на основании математического ожидания. Сейчас мы все пользуемся уже обученными нейросетями — теми, что уже знают много зависимостей. Разработчики заранее провели обучение: скормили нейронке миллиарды текстов, чтобы та построила зависимости (веса) и в процессе генерации ответа обращалась к ним, выдавая осмысленные слова.
Чтобы понять этот процесс глубже, изучим программу MicroGPT. Она обучается на заданном списке имен и на основании выученного сможет сгенерировать новые имена. Тут возникает вопрос: как же так, ведь я говорил, что нового ничего не создается, а тут нейросеть придумывает новые имена? Секрет в том, что нейросеть выучила не сами имена наизусть, а правила их построения. Поэтому она может собрать новое сочетание букв, которого не было в списке, но которое выглядит как имя, потому что следует выученным принципам. В случае с MicroGPT модель маленькая и видит только имена, поэтому она генерирует похожие на имена последовательности, комбинируя изученные паттерны.
В общем, давайте чуть подробнее, как это работает внутри.
1. Токены В начале MicroGPT создает словарь токенов. Токены — это минимальная информация, которой оперирует нейросеть. Она выдает не текст, она выдает токены. В контексте MicroGPT токен — это одна буква. Конкретно как оно работает: есть датасет (словарь имен), состоящий из 32 000 слов-имен на английском языке. Там буквы английского алфавита — 26 штук. И есть еще переносы строк, символ окончания последовательности. Итого 27 токенов. Алгоритм MicroGPT проходится по словарю имен и добавляет в базу токенов все уникальные символы. Вот и получается, что добавляется все 26 букв + конец строки. Если брать русские слова — например, список городов России, то токенизатор добавит в массив 33 буквы + конец строки. (Нюанс: другие современные нейросети используют в качестве токенов целые слова или их части, и их словарь токенов может достигать 100+ тысяч единиц).
2. Параметры Дальше алгоритм наполняет нейросеть параметрами, потому что сами токены ничего не решают без «знаний». Знания хранятся именно в числах. Из статьи автора:
«Параметры — это знания модели. Это большой набор чисел с плавающей точкой, которые изначально случайны и постепенно оптимизируются в процессе обучения... В нашей крошечной модели — 4192 параметра. У GPT-2 — 1,6 миллиарда, у современных LLM — сотни миллиардов... Каждый параметр инициализируется малым случайным числом из гауссового распределения».
Именно эти параметры (веса) мы и видим в итоговом JSON-файле. Давайте разберем их структуру...


1. Входные слои (Embeddings)

wte (Word Token Embeddings): [ 27 items ] - 27 букв 27 токенов - Внутри каждого из 27 элементов лежит вектор из 16 чисел. (16 числе потому что размерность эмбеддинга (n_embd) =16 ). Вектор в математике задается координатами 2 числами на плоскости. Здесь 16 цифр - 16 мерное пространство. 

wpe (Word Position Embeddings): [ 16 items ] Позиционные кодировки. максимальная длина слова в нашем случае. Как работает: Трансформеры не знают порядка слов сами по себе. Этот слой добавляет информацию о том, где стоит буква (первая, вторая, пятая...).Размер: У вас задана максимальная длина фразы 16 символов. Значит, здесь 16 векторов (для позиции 0, позиции 1... до позиции 15). Внутри каждого тоже 16 чисел (n_embd помним)

Далее описание от нейронки: 

2. Выходной слой 

 lm_head (Language Model Head): [ 27 items ]

  • Что это: "Голова" модели, которая делает предсказание.
  • Как работает: Это обратная операция к wte. В конце работы сеть выдает вектор из 16 чисел. Этот слой умножает его на матрицу весов, чтобы получить 27 чисел (логитов).
  • Смысл: Эти 27 чисел превращаются в вероятности. Какое число самое большое — ту букву сеть и предсказывает как следующую. 

3. Слой трансформера (layer0)

У вас всего один слой (layer0), поэтому модель очень маленькая и быстрая, но не очень умная. Внутри слоя есть два основных механизма: Внимание (Attention) и MLP (Feed Forward).

Механизм Внимания (Attention)

Он позволяет сети смотреть на предыдущие буквы, чтобы понять контекст.
  • layer0.attn_wq (Query Weights): [ 16 items ]
    • Матрица весов для создания Запросов (Query). Превращает входной вектор (16 чисел) в вектор запроса (тоже 16 чисел).
  • layer0.attn_wk (Key Weights): [ 16 items ]
    • Матрица весов для создания Ключей (Key). Превращает входной вектор в вектор ключа.
  • layer0.attn_wv (Value Weights): [ 16 items ]
    • Матрица весов для создания Значений (Value). Превращает входной вектор в вектор значения (сама информация).
  • layer0.attn_wo (Output Weights): [ 16 items ]
    • Матрица весов для выхода из блока внимания. После того как механизм внимания собрал информацию от нужных букв, этот слой проецирует результат обратно в размерность 16, чтобы передать дальше.

Механизм MLP (Feed Forward Network)

Это "мышление" сети внутри слоя. Она обрабатывает информацию, полученную от механизма внимания. Обычно в трансформерах этот блок сначала расширяет данные, а потом сжимает.
  • layer0.mlp_fc1 (Fully Connected 1): [ 64 items ]
    • Это первый линейный слой. Он расширяет пространство признаков.
    • Обратите внимание: на входе было 16 чисел, а здесь 64 элемента. Это стандартный прием (обычно расширение в 4 раза: 16×4=64). Сеть ищет более сложные закономерности в этом увеличенном пространстве.
  • layer0.mlp_fc2 (Fully Connected 2): [ 16 items ]
    • Это второй линейный слой. Он сжимает данные обратно.
    • Из 64 чисел он снова делает 16 чисел, чтобы передать их либо в следующий слой трансформера (если бы он был), либо на выход (lm_head).

 то есть это базовая структура именно этой нейросети, которая в первом этапе наполняется случайными числами, а уже потом запускается «Цикл обучения» (Training Loop) - это по сути исправление весов и состоит он из из таких этапов:

  1. Выбор документа. Случайное слово с которым будем сравнивать предсказание.
  2. Прямой проход модели по токенам. Forward: Прогон данных через сеть (получение предсказаний).
  3. Вычисление величины потери. Loss: Расчет ошибки (сравнение предсказаний с правильными ответами из датасета).
  4. Обратное распространение (через градиенты). Backward: Расчет градиентов (понимание, как исправить веса).
  5.  Обновление параметров.Update: Обновление параметров (весов/векторов) 
Снова из статьи на хабре:

 После обучения можно генерировать новые имена. Параметры фиксированы, и мы просто запускаем прямой проход в цикле, подавая сгенерированный токен как следующий вход. 

Каждый экземпляр мы начинаем с токена BOS, который говорит модели: "начни новое имя". Модель выдает 27 логитов, мы преобразуем их в вероятности и случайным образом выбираем один токен в соответствии с этими вероятностями. Этот токен снова подается на вход как следующий, и мы повторяем процесс до тех пор, пока модель не сгенерирует токен BOS (означающий "я закончила") или пока не будет достигнута максимальная длина последовательности.

Параметр температура (temperature) контролирует степень случайности. Перед применением softmax мы делим логиты на значение температуры. Температура, равная 1,0, означает сэмплирование непосредственно из распределения, которое выучила модель. Более низкие значения температуры (например, 0,5 , как в данном случае) делают распределение более "острым" (вероятности сконцентрированы на наиболее вероятных вариантах), что приводит к более консервативному поведению модели, когда она с большей вероятностью выбирает свои лучшие варианты. При температуре, стремящейся к нулю, модель всегда будет выбирать самый вероятный токен (это называется жадным декодированием). Более высокие значения температуры, наоборот, сглаживают распределение, делая вывод более разнообразным, но потенциально менее связным.

 Вот так и происходит генерация ответа - случайный выбор токенов внутри нейросети. Хотя нет, не случайный - поддающийся правилам которым она научилась. Короче как-то так.

Ах да. 


 График loss при 1000 циклах обучения и при 10 000 - видно что потерь меньше, но все еще вроде как довольно мало. при 32000 вот такой список:

step 32000 / 32000 | loss 2.0509

--- инференс ---
Образец 1: aneyl
Образец 2: amalee
Образец 3: amilee
Образец 4: kaylann
Образец 5: samarie
Образец 6: shari
Образец 7: aruha
Образец 8: sharia
Образец 9: kana
Образец 10: aylia
Образец 11: jariyah
Образец 12: kari
Образец 13: ashalia
Образец 14: phamer
Образец 15: hastan
Образец 16: mami
Образец 17: dasten
Образец 18: aharan
Образец 19: mala
Образец 20: arisa 

PS. что я еще хотел добавить. Все оперируют терминами, токены, веса, векторы - голова кругом. Как это понять на примере не очень понятно, и вот тут можно заглянуть внутрь. Эта microgpt обучается, и имеет свою память грубо говоря - то что она знает, какие последовательности выучила она хранит в виде векторов (весов) и выглядеть они могут вот так, как в этом JSON файле. То есть четко видно что один вектор это массив чисел с плавающей точкой - 16 чисел, 16 измерений. Но опять же не все параметры, некоторые имеют размерность 64. Но смысл в том что это веса обученной модели - и если брать их за основу, то не нужно каждый раз проходить обучение. Поэтому современные нейросети работают быстро - запрос ответ - они уже знают на что ориентироваться, есть база параметров.

среда, 11 февраля 2026 г.

Делаю телеграм бота при помощи нейросети

Что-то у меня прям кучно пошло - буквально 5 последних записей так или иначе об этом. Возможно я бы и раньше все это дело распробовал, но на тот момент когда шумел Чат ГПТ от американцев, остальных слышно было не громко, а я принципиально не хотел пользоваться заблокированными в России сервисами. Зато потом мне на работе подсказали про китайский qwen, потом был deepseek, сейчас есть и российские нейронки, то есть уже выбор больше, хотя и сейчас +- больше на слуху американские заблокированные в России нейронки за которые требуют еще и денег. У меня подход принципиальный, и как показывает мой случай - он все же работает, как минимум готовые проекты работают и выполняют поставленную задачу, и вполне качественно на мой взгляд. Правда недавно убедился что платные не зря продвигают - эти штуку реально умнее. Недавно наткнулся на arena ai - там пользователь задает промпт, и это задание выдается двум анонимным нейросетям, которые предлагают свои решения, пользователь должен выбрать лучшее из двух, и тогда ему откроют названия рейронок которые это дело нагенерировали. И я очень удивился тому что одна нейронка смогла с первого запроса сделать именно то что мне нужно - я сделал промпт очень большой и подробный, после того как потранил несколько дней на создание игры в другой нейросети. В этом запросе постарался учесть все неопределенные нюансы с котороми сталкивался чтобы нейронка могла сразу понять и это получилось, я удивлен. Современные бесплатные версии которыми я пользуюсь на такое не способны пока что, приходится делать десятки итераций и исправлений чтобы получить достойный вариант. В целом меня это не сильно напрягает, но все же лучше меньше времени терять на такое, очевидно, поэтому да, если есть возможность юзать claude-opus-4-6, то делайте конечно, а я пока буду пользоваться китайцами - в целом как я и говорил за большее время они могут выдать не хуже.

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

Документашка в pdf формате, благо с текстом. Распечатал нужные страница через Acrobat в pdf файл - просто тупо уменьшил объем, было 800 а стало 15 страниц. Потом в Акробате нашел опцию экспорта в excel - на каждой странице была таблица с одной ошибкой и описанием ее, всего грубо говоря 2 столбца и 5 строк первый столбец тупо заголовок  для текста во втором слобце важный текст. Экспорт прошел немного криво, пришлось повозиться. Я придумал как в полуавтомате перегнать в сводную таблицу: через поиск находишь слово и заменяешь его на такое же слово, но с заливкой ячейки. разные слова разные цвета. Еще как и говорил была проблема с крифизной экспорта - и часть ячеек была в других столбцах - пришлось скриптом объединять их. Причем прикольно придумал что можно записать макрос по объдинению ячеек, а потом повторить его нужное кол-во раз. В общем ячейки подготовлены, и поставил фильтр по цвету - таким образом в соседней ячейке оказались все нужные данные. Например: фильтр по цвету код ошибки - справа список кодов. выделяю все копирую в другую таблицу, называю столбец код ошибки. Дальше фильтр по описанию, справа все описания - копирую так же подряд, ставлю с колонкой код описание и вставляю туда скопированные описания и т.д. В итоге получилась сводная таблица. Долго мучился как перегнать в SQLite БД пробовал через экспорт csv, но так как там было куча переносо все работало очень плохо. А потом в SQLite Studio просто создал таблицу (визуально все довольно просто), а потом нажал там плюсик - добавить 48 строк (столько получилось в сводной таблице с ошибками) и тупо копировать из таблицы excel в таблицу SQLiteStudio. И все таблица готова, теперь нужно писать бота

А вот с написанием бота пришлось повозиться, но то опять же в рамках эксперимента - я придумал большой запрос и решил отправить его 3 нейронкам: qwen, chat.z.ai, deepseek - все три китайцы, все три бесплатны и без особых ограничений - deepseek расстроил сильно - давал ему несколько шансов но никак не заработало, присылал много раз ошибки, начинал заново с уточнениями и все без толку. Поэтому плюнул, и начал работать с z.ai и qwen - в общем первее чатбот запустился на qwen и поэтому продолжил там. Сделал рабочий продукт, относительно норм, но все же требующий кучу улучшений, поэтому я попросил написать промпт по этому проекту чтобы начать заново и протестировать нейронки снова. опять 3 и опять вернулся к 2. В этот раз опять с первого раза ничего не получалось, хотя я уже присылал даже кусок кода на основе которого нужно делать, но все было без толку - сыпалась куча ошибок и кажды раз я понимал что это пиздец какая долгая песня. Поэтому решил взять только один чат и работать с ним, а начать постепенно. Этот чат был z.ai - в нем уже делал что-то похожее по такой же технологии начинать с малого: взял пример из библиотеки и на его основе попросил сделать прогу. В этот раз сделал абсолютно так же: первый запрос:

Ты профессиональный программист. нужно написать телеграм бота на базе Telegram.bot библиотеки версии 22.9.0 вот пример кода который работает:

using Telegram.Bot;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;

using var cts = new CancellationTokenSource();
var bot = new TelegramBotClient("YOUR_BOT_TOKEN", cancellationToken: cts.Token);
var me = await bot.GetMe();
bot.OnError += OnError;
bot.OnMessage += OnMessage;
bot.OnUpdate += OnUpdate;

Console.WriteLine($"@{me.Username} is running... Press Enter to terminate");
Console.ReadLine();
cts.Cancel(); // stop the bot

// method to handle errors in polling or in your OnMessage/OnUpdate code
async Task OnError(Exception exception, HandleErrorSource source)
{
Console.WriteLine(exception); // just dump the exception to the console
}

// method that handle messages received by the bot:
async Task OnMessage(Message msg, UpdateType type)
{
if (msg.Text == "/start")
{
await bot.SendMessage(msg.Chat, "Welcome! Pick one direction",
replyMarkup: new InlineKeyboardButton[] { "Left", "Right" });
}
}

// method that handle other types of updates received by the bot:
async Task OnUpdate(Update update)
{
if (update is { CallbackQuery: { } query }) // non-null CallbackQuery
{
await bot.AnswerCallbackQuery(query.Id, $"You picked {query.Data}");
await bot.SendMessage(query.Message!.Chat, $"User {query.From} clicked on {query.Data}");
}
}
тебе нужно добавить класс program, main и конфиг чтобы добавить туда токен и другие нужные в будущем конфиги. нужно подключиться к бд SQLite и вернуть пользователю какие таблицы есть там и какие в них столбцы, сколько всего записей. Microsoft.Data.Sqlite --version 10.0.2

специально указываю версии, чтобы работал с новыми, потому что знаю что бывают постоянные проблемы с этим. надо было сразу добавить название приложения и чтобы расписал как его собрать и запустить, но это прислал вторум запросом, он сделал. Была всего одна ошибка при компиляции - и это было здорово - по сути сделал с первого раза. Ошибку исправили, я запустил, дал еще пару замечаний по работе, которые быстро исправили (программа простая, я всегда так делаю сам от простого к сложному и на каждом этапе проверка) - все заработало. И уже следующим запросом я прислал большой промпт на котором тестировал до этого:

 пойдет, но на основе всего этого теперь нужно добавить другую логику, скидываю тз. повторяю - берешь все что сейчас работает и добавляешь новые функции. вот ТЗ:
Ты профессиональный программист. Нужно создать телеграм бота SQLiteChatBot на языке C# (dotnet) с технологией long polling, используя последние библиотекси. Бот должен искать отправляемый боту текст в заданной базе данных. Все настройки бота вынести в конфиг: токен, название БД, таблиц, столбцов, названия столбцов для вывода, то какие столбцы будут отображаться в выводе. Предусмотреть подключение нескольких БД с режимом переключения БД из чата. Все данные из БД нужно помещать в массив, под своими уникальными ID на основе которых будут отправляться текст пользователю в чат, по нажатию инлайн кнопки. 

Логика такая: пользователь вводит слово или несколько слов или их частей в чат и отправляет боту. Бот ищет в массиве (все базы и все таблицы и все столбцы и строки) первое слово, среди найденных ищет второе, потом третье, сужая таким образом количество найденных данных с (1000 до 50 и потом до 5, например). Результат найденных записей отправляется пользователю в виде нумерованного списка, если найденное количество записей не превышает 10 (настройка в конфиге). Под сообщением добавляются inline кнопки с номерами в соответствии с номерами в списке найденного. При нажатии на кнопку в чат отправляется уже полный текстс записи - (все остальные столбцы из таблицы). Изначально список вхождений формируется по названию одной колонки, либо двух (тоже настройка в конфиге), например в нашем случае это база данных содержащая ошибки приводов митсубиси errors.db, таблица Mitsubishi, колонки: Code; Name; Description; Object; Action - соответственно при поиске превышение тока - он должен выдать сначала сообщение-список: несколько кодов из колонки Code и Name которые в других столбцах содержат эти слова, под списком inline кнопки по клику на которой выдается информация по конкретному коду который был запрошен: это все колонки сразу. Между абзацами добавить пустую строку. Можно проставлять название колонки перед ним, либо сделать в конфиге свои названия для вывод в чат.

Делаем консольное приложение, чтобы просто запустить командой dotnet run. Сделать разделение для пользователей чтобы если баз несколько они могли бы искать параллельно не мешая друг другу, если переключаться между базами. Для этого создать базу для хранения настроек пользователя. Выходящее длинное сообщение разбивать на несколько с задержкой отправки (говорят чтобы не забанил телеграм за спам). Нужно сделать максимально просто, весь код не больше 3 файлов cs чтобы проще было копировать из чата. С минимальными зависимостями.

 Ну и дальше работа закипела - после этой строки он сгенерировал код, который собрался без проблем и уже работал поиск и все что нужно, я просто начал делать визуальные улучшения, которые можно было обговрить заранее, например то что таблицы не меняются и должны загружаться единоразово в память:

Все отлично! хочу чтобы кнопки выли в один ряд и по размеру не большие, минимальный размер, символ # оставляем (#1) Пусть в конфиге таблицы будут не Name а TableName, добавил вторую БД и 2 таблицы в ней - поиск выполняется отлично, но из новой базы не присылает документ, хотя присылает детали записи (ID: .....) - подозреваю проблема в ID. что если каждой записи в памяти присваивать свой уникальный id: БД-таблица-id в таблице - в каждой таблице есть своя колонка с Id. таблицы не изменяются никогда, базы не меняются - потому память всегда актуальна 

 и и еще сделать кнопки не в одну линию а в несколько разбивая по 5 кнопок, в одну линию они оказывается не переносятся сами по себе

давай добавим в конфиг пароль , и добавим в базу пользователей колонку access - true - доступ разрешен, false - запрещен, null - предложение ввести пароль 3 раза, ввел 3 раза неверно, то ставим запрет и возвращаем заглушку что нет доступа к базе. базу я буду удалять поэтому нужно просто пересоздать новую с новыми колонками. если доступ разрешен то доступны все функции

  В процессе экспериментов в прошлых ботах у меня осталась висеть клавиатура, я думаю при команде /start надо ее сбрасывать. await bot.SendMessage(chatId, "Removing keyboard", replyMarkup: new ReplyKeyboardRemove()); А смену БД организовать по команде /database, причем кнопки пожно подсвечивать галочкой ту которая уже используется

И все - всего лишь 10 итераций - это отличный результат. Конечно он стал таким потому что до этого я сделал подобных итераций с пару десятков других приложениях - подсказка про уникальные id, про клавиатуру, про пароль - реализация вязата с другого бота - мне понравилось как он сделал, хотя я там тоже довольно подробно расписал принцип. В общем такй бот вполне универсальный, можно добавить любую БД и таблицу и он будет там искать. Но теперь проблема в том что мне интересно запустить все это на сервере линукс, и поэтому надо юзать библиотеку питон. Но я думаю надо делать точно так же - скомпилисть минимальное приложение на питоне - а потом дать тз на полную функциональность. причем можно сразу учеть момент с кнопками (5 столбцов а названия с #) пароль только в конце - усложнения после базового функционала. ну в общем когда сделаю, будет новая статья)