Интересное что-то
517 subscribers
2.72K photos
253 videos
139 files
4.52K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
Revealing a project I was vibe-coding for the past couple of days. For some of my medicine-related projects I need to deploy a web-service based on LLMs that will accept images and text, and create a structured outputs. While I am waiting for the compute (as it needs to run locally), I decided to learn about deploying such web services online - and what could be better toy example than a telegram bot?

Another motivation for this was the influx of casino ads in my comment section. I already had some other automated moderation in place, but it has not been working for the past 6 months at all. So, I decided to both practice in coding and do something useful for myself.

The goal was to create a bot that could:

- Silently monitor all messages, images, and user profiles in a Telegram group.
- Use a powerful AI model to analyze the content and context for signs of spam, scams, or NSFW material.
- Automatically take action by deleting the offending message and banning the user.
- Do all of this on a serverless platform to keep costs near zero for a small community.

Code can be found here

The Tech Stack: Powerful, Modern, and Cost-Effective
Choosing the right tools is half the battle. Here's the stack we settled on after a long and winding road of debugging.

1. Hosting: Google Cloud Run. This was a no-brainer. Cloud Run's serverless nature means you only pay when a request is being processed (scales to 0 when idle). For a moderately active chat, this falls squarely within the generous "Always Free" tier. New users also get a $300 starting credit, making the first several months (or even years) completely free.

2. Language Model: Gemma 3 27B. As detailed in Google's release documents, Gemma 3 is a powerhouse. The 27-billion-parameter instruction-tuned model (gemma-3-27b-it) is multimodal, meaning it can understand both text and images simultaneously—perfect for analyzing user profile pictures alongside their messages. It represents a "pareto sweet spot" of high performance and manageable size.

A major factor in choosing the model was its accessibility. When called via the Gemini API, Gemma 3 models have an incredibly generous free tier: 30 calls per minute. This translates to a staggering 14,400 free analyses per day—more than enough to moderate even a very active community without spending a dime.

3. Web Framework: FastAPI. After initially struggling with Flask, we switched to FastAPI. As a native async framework, it seamlessly integrates with the asynchronous nature of a chatbot, eliminating a whole class of server errors and simplifying the code.
The Brain of the Bot: The Moderation Prompt
The core of our AI moderator isn't just the model; it's the instruction we give it. The prompt is carefully engineered to give the AI context and clear criteria for its decisions. It's not just looking at the message text but the whole picture: the user's name, their profile photo, and the message itself.
You are an AI content moderator for a Telegram chat group. Your task is to classify incoming messages
(text and images), user profiles (name, photo), and user metadata into one of the following categories:
NUDITY, CASINO_ADS, SPAM, VIOLENCE, SAFE.

Some AI bots may appear harmless at first, but they edit their responses to include harmful content later.
That is why you need to analyze their profile names, profile pictures, and any other metadata (provided in context) to determine if they are safe or not.

CRITERIA FOR BOTS/SPAM:
- PROFILE NAME: Names with a strange mix of Cyrillic and Latin/Unicode characters, it is likely a bot. Example: "Мария Знаkмлсьь", "Ульяна Вагuллина".
- PROFILE IMAGE: If the profile image contains NSFW content, it is likely a bot.
- MESSAGE CONTENT: If the message is recruiting workers for a job, it is likely a bot. If the message suggests "having fun", "making money", "easy cash", or similar phrases, it is likely a bot.
- LINK ANALYSIS: If the message is simply mentioning ads in general, but does not contain any links, or telegram usernames (following "@" or t.me/), it is not spam (safe).

These are just some examples; you should use your best judgment to classify the content.

Analyze the content provided and respond with a single, clean JSON object containing two keys:
1. "category": The classification of the content.
2. "reason": A brief, one-sentence explanation for your classification.

This prompt empowers the AI to spot nuanced spam tactics that simple keyword filters would miss.

The Crucial Detail: Disabling the Safety Rails
This might sound counterintuitive for a moderation bot, but to make it work, we had to tell the Gemini API to turn off its own safety filters. By default, the API will refuse to process any content it deems harmful. But our bot needs to see the harmful content to classify it.

This is achieved with the generation_config object, where we set the blocking threshold to BLOCK_NONE for all categories.
generation_config = types.GenerateContentConfig(
safety_settings=[
types.SafetySetting(category=h, threshold=types.HarmBlockThreshold.BLOCK_NONE)
for h in HarmCategory
]
)

This tells the API: "Show me everything, unfiltered. Trust me, I'm the moderator here." Our application's logic then takes over to decide what to do with that information.

Conclusion
Building this serverless AI moderator was a deep dive into the modern AI and cloud-native landscape. It showcases how accessible, powerful tools like Google Cloud Run and the Gemma family of models can be combined to solve real-world problems creatively and cost-effectively. The journey was challenging, but the result is a robust, intelligent, and virtually free solution for keeping online communities safe.
Forwarded from Machinelearning
📌100+ готовых блокнотов Google Collab от Unsloth.

Unsolth выложила в открытый доступ в своем репозитории на Github больше сотни готовых ipynb-блокнотов для запуска различных операций в Google Collab практически всех популярных семейств языковых моделей, BERT, TTS-моделей и VLM:

🟢Llama v.3 -3.2
🟢Qwen v.2-3
🟢Gemma v.2-3 + Code Gemma
🟢Mistral Family
🟢Phi v.3-4
🟠TTS (Sesame, Orpheus, Spark, Oute, Llasa, Whisper)
🟠VLM и MMLM (Llama 3.2, Qwen 2.5VL, Pixtral)
🟠BERT (ModernBERT-large)

Блокноты включают пошаговые руководства и примеры для вызова инструментов, классификации, синтетических данных, подготовки сетов, инференса и файнтюна моделей и
примеры методов GRPO, DPO, SFT, Continued Pretraining, Reasoning и других.

Unsloth известна тем, что помогает делать большие языковые модели быстрее, компактнее и доступнее при помощи динамического квантования, что позволяет запускать их без сильной потери качества . Их технологии ускоряют обучение и настройку ИИ-моделей в 2 раза и экономят до 70% памяти. Инструменты Unsloth, на сегодняшний день, скачали более 10 млн раз.


Есть подробная документация по использованию, а для тех, кто больше привык к Kaggle - такой же набор блокнотов для запуска на этой платформе.


📌Лицензирование: LGPL-3.0-1


🖥GitHub


@ai_machinelearning_big_data

#AI #ML #LLM #Notebooks #Github #Unsloth
Please open Telegram to view this post
VIEW IN TELEGRAM
Neat AI Instrument for your travels:

https://aistudio.google.com/apps/bundled/maps_planner?showPreview=true&showCode=true

Create a detailed day plan in 1 prompt with locations and time stamps
Forwarded from AI[ex]Time (Alex Golubev)
Объемный и очень интересный тех репорт про модель под названием Skywork Open Reasoner 1. Может показаться, что это очередной RL тюн на математические задачи, который обгоняет модели по типу R1-distil, но на самом деле это первый (по крайней мере я не встречал раньше подобных работ) ablation на огромное число факторов, влияющих на процесс обучения с GRPO-like методами. Фильтрация данных, on/off policy trade off, температура при генерации решений, несимметричное клиппирование, token-wise усреднение в лоссе, KL регуляризация и много чего еще — раньше все это встречалось по отдельности в разных работах, а здесь собрано воедино, так еще и со сравнением в одинаковых сетапах.

Но. Помимо этого, авторы заметили следующее: когда модель входит в состоянии низкой энтропии, разнообразие генераций и эффективность обучения снижается. Если такое коллапсирование происходит рано, то прогресс быстро упирается в потолок. Чтобы контролировать этот процесс, предлагается ввести дополнительное слагаемое в лосс, которое будет штрафовать за слишком низкие значения, причем делать это нужно с адаптивным весом, тк энтропия зависит от данных и шага обучения (по этой же причине часто очень тяжело подобрать единый вес для KL-регуляризации). Вообще это супер стандартный подход в классическом RL для поддержания exploration на определенном уровне, но в RL для LLM такое особо не использовали. Ablation на многие факторы проводится как раз с оглядкой на то, как они влияют на динамику энтропии. В общем, репорт на 40 страниц, там очень много познавательных замечаний, советую хотя бы бегло пробежаться.
Forwarded from .ml
Многие компании сёрвят LLM

Кто-то использует готовые инструменты, которые предоставляют OpenAI-compatible эндпоинты: например, DeepSeek, развёрнутый через vllm serve. Кому-то не хватает OpenAI-compatible протокола. А кому-то хочется и того, и другого — например, нам в Точке.

С одной стороны, мы хотим уметь ходить в LLM-провайдеры, которые поддерживают общепринятый формат. А с другой стороны у нас есть внутренняя LLM, которую нельзя полностью совместить с OpenAI-протоколом, потому что она поддерживает дополнительные виды контента внутри сообщений и ещё много других плюшек (про них тоже как-нибудь расскажем 👀).


Это непростая инженерная задача, которую нам пришлось решать. Вот мы и написали статью о том, как поднимали свою LLM-инфраструктуру. Текст исключительно инженерный и больше про дизайн всей системы целиком, чем про, например, наши внутренние патчи в популярный фреймворк vllm.

Читайте, комментируйте и рассказывайте, как у вас дела с LLM!
Девятый (последний) месяц. Практика принятия решений

Вот я и закончил курс Стратоплана «Руководитель отдела».

Контент первого, второго, третьего, четвертого, пятого, шестого, седьмого и восьмого месяцев я описывал ранее.

В этот раз была тема внедрения изменений и менеджмента в кризис.

Всё более чем актуально. Нелегкие времена с затянутыми поясками в отрасли уже за окном, а изменения, работа с сопротивлением, контроль за соблюдением новых порядков – регулярная работа и хлеб руководителя.

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

Сегодня не хочу углубляться в детали материала, а хочу под конец курса сосредоточиться в целом на подобном длительном обучении и пользе от него. Неважно, Стратоплан это или еще кто-то другой. Тут я больше про долгие объемные многомесячные курсы, а не «стань менеджером за 3 дня» или «освой C++ за 21 день».

Не ходите уставшими
Ребята предупреждают об этом сами, но я тоже скажу. Кажется, что 15 часов в месяц (одна трехдневка) – это не так уж и много. Но всё это оборачивается в то, что у вас выпадает солидный кусок пятницы, который потом надо будет нагнать, и суббота с воскресеньем тоже, ибо после пяти часов обучения чувствуется приличная усталость. И после этого сюрприз-сюрприз уже начинается новая неделя, так что выходит пучок накопленных дел и 12 дней без отдыха в месяц. И так 9 месяцев. Это правда тяжело.

Не прогуливайте практику
К сожалению, я иногда пропускал онлайн занятия из-за разных жизненных событий. Те сессии, где я онлайн практиковался с ребятами в группе, были НАМНОГО понятнее и чаще приводили к применению на практике новых знаний и осваиваемых навыков.
Так что, если вы думаете всё пропускать, а потом посмотреть лекции на х2 и надеетесь на просветление – чуда не случится.

Я уже всё знаю
Хоть для меня и не было ни одной темы, в которой бы я не был более-менее подкован (кроме бюджетирования), но мне понравилось, что разрозненные знания укладываются в общую структурированную систему.

У меня такая история была с ПМной специализацией на Курсере https://www.coursera.org/specializations/product-management. Вроде кучу материалов читал, смотрел и знал, но после прохождения комплексной программы всё по полочкам разложил и перестал вовсе тратить время на потребление фрагментированной информации из разных источников, потому что они все в большинстве своем – лишь повторение и вольный пересказ части целого.

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

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

Итог
Учиться и развиваться лично я для себя считаю очень важным. Это и профессионально помогает (но не корочки и сертификаты, а знания и навыки), и в умственном тонусе держит.

Но если перегнуть, можно сильно угореть (когда только создали платформу Stepik, я записался на 5-6 курсов сразу, и жадность фраера сгубила😁)
Forwarded from Б/У ml (Толик Мастрюков)
Особенность в рекомендательных системах

Контекст

В последнее время основные статьи в рекомендательных системах связанны с применением нейронных сетей.

Выглядит это всегда примерно так для сценария u2i:
1) Есть айтем -> кодируем через nn.Embedding его фичи
2) История пользователя состоит из айтемов -> используем наработку из 1) + encoder/decoder (трансформеры, aka sasrec/bert4rec) для кодирования вектора юзера.
3) Обучаем на задачу близости вектора пользователя со следующим айтемом/множеством айтемов. Возможно доп задачи: sasrec учится на next-item для всей истории, которые в проде он никогда не увидит

И когда пытаешь завести алгоритм для своей задачи - в первую очередь я замечаю popularity bias . Веса соотвествующие векторам наиболее популярных айтемов/фичей айтемов - чаще обновляеются . В первые итерации модель выучивает именно такие объявления рекомендовать - в своих задач я это замечал.

А следующие батчи/эпохи пытается выйти из этого локального минимума состояния и начать показывать более персональный контент. На эту фазу и уходят основные компуты обучения.

Для решения этой проблемы активно используют:
a) random negative sampling
b) in-batch negative sampling
c) и LogQ сверху

На практике мне хватало a) и b) . Добавление c) при существующих a) и b) доп качество не давало

А что в классике
Изначально рекомендательные системы решались на основе матриц соовстречаемости - тык.
Как это выглядело:
1) Есть айтемы и истории пользователя -> строим матрицу как часто 1 айтем встречался с другим айтемом в этой истории
2) К каждому айтему в истории достаем наиболее часто встречающиеся айтемы используя матрицу соовстречаемости - кандидаты айтема.
3) Вместе с айтемом достаем и некий скор (достаем столбец) - меру соовстречаемости. И если для нескольких айтемов в истории совпали кандидаты, то можем сложить/перемножить скоры - и получить финальный скор для каждого кандидата. Потом отобрать топ K

Главная проблема в классике - как сформировать эту матрицу. Хорошее понимание данных и своего домена может помочь в этом. А применение этих методов может дать представление о том, как устроены данные. Примеры простых эвристик:
1) Поделить строчку на сумму в этой строке -> уберем байс популярности айтема (а нужно ли?) -> если ответ да, то будущий трансформер скорее всего не заведется без in-batch ns.
2) Добавить временную составляющую в историю -> учет трендов (а) -> получилось повысить скор - скорее всего трансформер еще выше сможет его выбить
3) Добавить дот продукт от контетных векторов с весом -> возможно колаборативной информации недостаточно и не все паттерны пользователи уже нашли -> скор вырос - в трансформер можно и нужно засунуть контентную часть

Когда что применять
Мне лично легче начать с классики в новом проекте. Буквально за 2-3 часа можно попробовать кучу матриц соовстречаемостей и сформировать представление о данных. Матричный метод легко параллелится на cpu, в отличии от трансформеров, которые ограничены размером батча и гпу памяти.

И когда уже сформирована интуиция как устроены данные, то можно попробовать хитрый трансформер с учетом полученных инсайдов в классике. У меня ходит кратно больше времени (3-4 дня vs 1 день на классику), чтобы завести трансформер. Это связанно с тем, что 1 такая моделька обучается от 3-4 часов , что гораздо медленнее чем матричные методы. Но зато удается выбить качество выше чем у классических алгоритмов.

В заключении
Но стоит ли оно того?

Велком в комменты: А вы часто сравниваете нейронночные методы с матричными в своих проектах? Пытаетесь выбить из классических методов максимум прежде чем тюнить нейронки? Какие другие аномалии замечали при тренировки нейроннок?
Forwarded from РИСЕРЧОШНАЯ
зависит от сегмента бизнес на маркетплейсах это сработает, на продуктовых сегментах ты никогда (маловероятно) не обучишь такую модель

ease is all you need
Forwarded from РИСЕРЧОШНАЯ
про обе

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

а с другой стороны есть sota модели типа ease (elsa, sansa, ease + vae) или тот же tifu knn, которые стоят копейки и их очень тяжело выбить

при том что у них нет проблем с а и б
Forwarded from Grig
РИСЕРЧОШНАЯ
про обе в том же вкусвилле трансформеры будут плохо справляться с рекомендацией частотных товаров по двум причинам а) они не умеют в повторные заказы и счетчики не сильно помогают (собственные покупки) б) данных не так много, что бы трансформер начал что…
это смотря какой трансформер, если это просто sasrec/bert4rec, тогда скорее всего да. Но если это какой-нибудь контентный трансформер вообще без айдишников + в него можно прокинуть персонализированные скоры популярности user-item (прям к скору модели), тогда можно и автоэнкодер побить. Да и каталог побольше закрыть можно.

Ну конечно это все при отсутствии пункта б
Forwarded from РИСЕРЧОШНАЯ
Grig
Да и каталог побольше закрыть можно.
ну если у тебя условный вкусвилл то у тебя никогда не будет проблем с каталогом

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

от этого модель больше понимать не станет как мне кажется

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

что бы вырыть яму ты же лапотой это делать будешь, а не экскаватор вызывать