Forwarded from PRACTICAL AI Broadcast
Ночной пост, для тех кто потерялся в череде новых обновлений ИИ инструментов.
Ответ на вопрос кто такие Cursor, VS Code, Claude Code, AntiGravity и как они работают в интерактивном формате.
К слову, это новый формат ответа от Gemini Pro.
Теперь так, по одному запросу, можно получить сгенерированный лично под вас интерфейс - хоть инструкцию к использованию чего-то, хоть дашборд вашей эксельки.
https://gemini.google.com/share/5eb1ef25134b
Ответ на вопрос кто такие Cursor, VS Code, Claude Code, AntiGravity и как они работают в интерактивном формате.
К слову, это новый формат ответа от Gemini Pro.
Теперь так, по одному запросу, можно получить сгенерированный лично под вас интерфейс - хоть инструкцию к использованию чего-то, хоть дашборд вашей эксельки.
https://gemini.google.com/share/5eb1ef25134b
Gemini
Gemini - слушай можешь мне просто объяснить что такое вс код курсор клод код как они вообще работают и я не понимаю эту историю…
Created with Gemini
Forwarded from PRACTICAL AI Broadcast
Ребята, всем привет!
Мы с командой решили вернуться к истокам и разобрать базовые настройки ChatGPT.
Почему это важно, даже если вы профи?
Потому что ИИ — это не про штамповку одинаковых ответов, а про поток, некую сонастройку.
Чтобы нейросеть стала продолжением ваших мыслей, её нужно правильно забрифовать на уровне настроек.
Разобрали со Светой неочевидные фишки, которые мы сами используем каждый день, чтобы улучшить качество отклика.
Заходите посмотреть👇
Мы с командой решили вернуться к истокам и разобрать базовые настройки ChatGPT.
Почему это важно, даже если вы профи?
Потому что ИИ — это не про штамповку одинаковых ответов, а про поток, некую сонастройку.
Чтобы нейросеть стала продолжением ваших мыслей, её нужно правильно забрифовать на уровне настроек.
Разобрали со Светой неочевидные фишки, которые мы сами используем каждый день, чтобы улучшить качество отклика.
Заходите посмотреть👇
YouTube
Базовая настройка ChatGPT: что важно сделать в первую очередь
В этом видео разбираем, как настроить ChatGPT так, чтобы он перестал выдавать шум и начал работать как полноценный рабочий ассистент.
Покажем, что GPT знает о вас, как правильно настроить профиль и инструкции, и как подключить напоминания о встречах, как…
Покажем, что GPT знает о вас, как правильно настроить профиль и инструкции, и как подключить напоминания о встречах, как…
Forwarded from Refat Talks: Tech & AI
Куда на самом деле движется индустрия LLM (спойлер: вы выбираете не модель - вы выбираете стек).
Пост навеян свежим релизом Opus 4.5, а именно ее доп фичами как Context Editing - нам показывают действительно впечатляющие демки… Но постойте - это же (очередная) не-фича foundation модели. Это не что-то в весах. Это инфраструктурный middleware, который живет между вами и моделью. И если вы проанализируете (особенно глазами разработчика) релизы последнего года, то вы увидите что мы все дальшеот бога от LLM как модели, и тем ближе к LLM как infrastructure-as-a-service. Давайте поговорим, куда нас ведет индустрия и что из этого следует, но начнем с начала.
Большинство людей (в том числе многие разработчики) когда говорят про условный ChatGPT не видят весь спектр между "моделью" и "продуктом" - ведь это одновременно и foundation model, и старый добрый completions API, и вполне себе агентный Responses API c Code Interpreter, File Search (RAG прямо в "модельке", ага) и т.д.
Что на самом деле продают вендоры
OpenAI Responses API - это целая инфра, включая NoSQL БД для истории, хранилище файлов и тд. Вы отдали им state management.
Code Interpreter и Code Execution - это PaaS: managed sandbox - $0.03 за сессию платите за инфру, не за "умную модель".
Claude Context Editing - middleware с настраиваемой стратегией pruning (keep last 3 tool uses, clear 5000+ tokens). Оркестрация, а не интеллект.
Google Grounding и Maps tool - dynamic retrieval: модель решает нужен ли поиск, генерит queries, получает доступ к индексу (глубже публичного API), делает reranking, отдает с citations. Вы покупаете gateway к индексу, не модель.
Даже Structured Outputs - это частично заслуга инфры, а не весов - constrained decoding через CFG (конвертит JSON Schema в грамматику, маскирует невалидные токены). Компилятор поверх модели.
Большинство не осознают, как растет пропасть между проприетарными infrastructure-as-a-service от OpenAI/Google/Anthropic и голыми весами open-source моделей. Проприетарные LLM превращаются из inference провайдеров в операционки для intelligence.
Что из этого следует и что следует иметь в виду
1. Понимать уровни зависимости, я выделяю три:
- State (Threads, File API, memory) - критический lock-in, вы не владеете памятью системы
- Execution (Code Interpreter, sandboxes) - средний lock-in, нужна своя инфра для рантайма
- Behavior (Grounding, Computer Use) - средне-высокий, модель часто обучена под "свои" инструменты
Перед использованием любой фичи спрашивайте: "Где живут данные? Кто контролирует логику? Смогу ли я воспроизвести это сам?"
2. Integration Tax vs Migration Tax - ключевая асимметрия. Проприетарные фичи дают быстрый старт, но стоимость выхода растет экспоненциально. Это не обязательно плохо - это trade-off, который нужно делать осознанно.
3. Разделять Core и периферию
Core (ваша уникальная ценность, основа продукта) - инвестируйте в независимость: свой state management, своя оркестрация и тд.
Пример: AI-агент для support как продукт - владение историей диалогов критично, а вот Code Interpreter для внутренней аналитики - это ок.
4. Есть обратная сторона. Чем глубже расходятся продуктовые слои провайдеров, тем сложнее делать model-agnostic продукты, которые работают так же хорошо. Manus поняли это рано - выжали максимум из Anthropic, не пытаясь быть совместимыми со всеми, и сделали продукт-звезду. Возможно, по той же причине Claude Code так хорош?
5. Учитывайте свою стадию. 0→1 (поиск PMF) - максимально используйте проприетарные фичи, скорость важнее. Когда растете - можно строить абстракции: gateway, свой state для core функций. На стадии масштабирования - еще больше контроля и взаимозаменяемости компонентов (interoperability это дорого).
Главное
Проприетарные AI-платформы - это managed infrastructure, как AWS. Вы платите не только деньгами, но и зависимостью. И этот тренд будет расти. Часто это правильный trade-off, особенно на старте. Но это решение нужно принимать с открытыми глазами - понимать, какую часть системы отдаете "в управление", и делать это осознанно для каждого компонента продукта.
Пост навеян свежим релизом Opus 4.5, а именно ее доп фичами как Context Editing - нам показывают действительно впечатляющие демки… Но постойте - это же (очередная) не-фича foundation модели. Это не что-то в весах. Это инфраструктурный middleware, который живет между вами и моделью. И если вы проанализируете (особенно глазами разработчика) релизы последнего года, то вы увидите что мы все дальше
Большинство людей (в том числе многие разработчики) когда говорят про условный ChatGPT не видят весь спектр между "моделью" и "продуктом" - ведь это одновременно и foundation model, и старый добрый completions API, и вполне себе агентный Responses API c Code Interpreter, File Search (RAG прямо в "модельке", ага) и т.д.
Что на самом деле продают вендоры
OpenAI Responses API - это целая инфра, включая NoSQL БД для истории, хранилище файлов и тд. Вы отдали им state management.
Code Interpreter и Code Execution - это PaaS: managed sandbox - $0.03 за сессию платите за инфру, не за "умную модель".
Claude Context Editing - middleware с настраиваемой стратегией pruning (keep last 3 tool uses, clear 5000+ tokens). Оркестрация, а не интеллект.
Google Grounding и Maps tool - dynamic retrieval: модель решает нужен ли поиск, генерит queries, получает доступ к индексу (глубже публичного API), делает reranking, отдает с citations. Вы покупаете gateway к индексу, не модель.
Даже Structured Outputs - это частично заслуга инфры, а не весов - constrained decoding через CFG (конвертит JSON Schema в грамматику, маскирует невалидные токены). Компилятор поверх модели.
Большинство не осознают, как растет пропасть между проприетарными infrastructure-as-a-service от OpenAI/Google/Anthropic и голыми весами open-source моделей. Проприетарные LLM превращаются из inference провайдеров в операционки для intelligence.
Что из этого следует и что следует иметь в виду
1. Понимать уровни зависимости, я выделяю три:
- State (Threads, File API, memory) - критический lock-in, вы не владеете памятью системы
- Execution (Code Interpreter, sandboxes) - средний lock-in, нужна своя инфра для рантайма
- Behavior (Grounding, Computer Use) - средне-высокий, модель часто обучена под "свои" инструменты
Перед использованием любой фичи спрашивайте: "Где живут данные? Кто контролирует логику? Смогу ли я воспроизвести это сам?"
2. Integration Tax vs Migration Tax - ключевая асимметрия. Проприетарные фичи дают быстрый старт, но стоимость выхода растет экспоненциально. Это не обязательно плохо - это trade-off, который нужно делать осознанно.
3. Разделять Core и периферию
Core (ваша уникальная ценность, основа продукта) - инвестируйте в независимость: свой state management, своя оркестрация и тд.
Пример: AI-агент для support как продукт - владение историей диалогов критично, а вот Code Interpreter для внутренней аналитики - это ок.
4. Есть обратная сторона. Чем глубже расходятся продуктовые слои провайдеров, тем сложнее делать model-agnostic продукты, которые работают так же хорошо. Manus поняли это рано - выжали максимум из Anthropic, не пытаясь быть совместимыми со всеми, и сделали продукт-звезду. Возможно, по той же причине Claude Code так хорош?
5. Учитывайте свою стадию. 0→1 (поиск PMF) - максимально используйте проприетарные фичи, скорость важнее. Когда растете - можно строить абстракции: gateway, свой state для core функций. На стадии масштабирования - еще больше контроля и взаимозаменяемости компонентов (interoperability это дорого).
Главное
Проприетарные AI-платформы - это managed infrastructure, как AWS. Вы платите не только деньгами, но и зависимостью. И этот тренд будет расти. Часто это правильный trade-off, особенно на старте. Но это решение нужно принимать с открытыми глазами - понимать, какую часть системы отдаете "в управление", и делать это осознанно для каждого компонента продукта.
Forwarded from Канал Доброго Вани | Data Science и Продуктики
🎯 Недавно столкнулся с ситуацией: идей в Транскрибуле всё больше, а рук по-прежнему маловато. Поэтому решил внедрить метод RICE. Итак:
Метод приоритизации RICE: как выбрать, за какие задачи браться в первую очередь
Если идей много, а ресурсов мало — нужен простой и объективный способ понять, что делать в первую очередь. Один из самых популярных методов в продуктовой разработке — RICE.
RICE помогает сравнить любые задачи или фичи по четырём параметрам (каждый — число от 0 до 10):
🌹 — Reach (Охват) (Достаточно редко используется, можно просто убрать, если продукт небольшой, а фича раскатывается на всех пользователей)
Сколько пользователей или процессов будет затронуто? Чем больше охват, тем ценнее задача.
🔤 — Impact (Влияние)
Насколько сильно задача улучшит продукт или бизнес-показатели? (Оцениваем с точки зрения влияения на нашу целевую или NSM-метрику). Оценивается от минимального (0) до масштабного (10).
🔤 — Confidence (Уверенность)
Насколько вы уверены в оценках выше? Помогает отсечь хотелки, основанные на догадках.
🔤 — Effort (Затраты)
Сколько времени и ресурсов потребуется команде? Чем меньше усилий — тем лучше.
Формула простая:
RICE = (Reach × Impact × Confidence) / Effort
Проставляется для каждой гипотезы и затем весь бэклог ранжируется по убыванию RICE. В случае, если оценивают несколько человек, полезно, чтобы каждый проставил R, I, C и E. Затем берем среднее по каждому показателю и считаем RICE по усредненным значениям — получаем более стетистически устойчивый RICE.
📌 Зачем это нужно?
* упрощает принятие решений
* убирает субъективность
* помогает фокусироваться на том, что даст максимальный результат при минимальных вложениях
Метод приоритизации RICE: как выбрать, за какие задачи браться в первую очередь
Если идей много, а ресурсов мало — нужен простой и объективный способ понять, что делать в первую очередь. Один из самых популярных методов в продуктовой разработке — RICE.
RICE помогает сравнить любые задачи или фичи по четырём параметрам (каждый — число от 0 до 10):
Сколько пользователей или процессов будет затронуто? Чем больше охват, тем ценнее задача.
Насколько сильно задача улучшит продукт или бизнес-показатели? (Оцениваем с точки зрения влияения на нашу целевую или NSM-метрику). Оценивается от минимального (0) до масштабного (10).
Насколько вы уверены в оценках выше? Помогает отсечь хотелки, основанные на догадках.
Сколько времени и ресурсов потребуется команде? Чем меньше усилий — тем лучше.
Формула простая:
RICE = (Reach × Impact × Confidence) / Effort
Проставляется для каждой гипотезы и затем весь бэклог ранжируется по убыванию RICE. В случае, если оценивают несколько человек, полезно, чтобы каждый проставил R, I, C и E. Затем берем среднее по каждому показателю и считаем RICE по усредненным значениям — получаем более стетистически устойчивый RICE.
📌 Зачем это нужно?
* упрощает принятие решений
* убирает субъективность
* помогает фокусироваться на том, что даст максимальный результат при минимальных вложениях
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Канал Доброго Вани | Data Science и Продуктики
Продолжаем рубрику с разбором вопросов на собесах
МЛ
❓ Что будет, если убрать первое дерево у случайного леса? Аналогичный вопрос для бустинга
Ответ для случайного леса:практически ничего, потому что в случайном лесе все деревья голосуют за ответ и исчезновение одного дерева не повлияет решение большинства (при большом N).
Ответ для градиентного бустинга: первое дерево в бустинге вносит самое большое влияние в ответ модели, а все последующие модели лишь улучшают оценку предыдущих деревьев. Поэтому его исчезновение приведет к тому, что смысл всех остальных деревьев будет утерян
МЛ
❓ Я построил линейную регрессионную модель, показывающую 95% доверительный интервал. Означает ли это, что существует 95% вероятность, что коэффициенты моей модели верно оценивают функцию, которую я хочу аппроксимировать?
Ответ:
Доверительный интервал — это результат процедуры, свойства которой определяются при многократном повторении эксперимента.
Корректная интерпретация:
"Если бы мы многократно (бесконечное число раз) повторяли эксперимент, собирали новые данные и каждый раз строили 95% доверительный интервал для коэффициента, то в 95% случаев эти интервалы содержали бы истинное значение параметра."
Big Data
❓ Что такое parquet? В чем отличие csv?
Ответ:
• Колоночный формат: Данные хранятся по столбцам, а не по строкам (как в CSV, JSON).
• Минимизация I/O-операций: При запросе к определенным столбцам читаются только нужные данные, а не вся строка.
• Predicate Pushdown: Фильтрация данных на этапе чтения (например, WHERE age > 20). Parquet хранит метаданные (мин/макс значения для блоков), что позволяет пропускать ненужные блоки данных.
МЛ
Ответ для случайного леса:
МЛ
Ответ:
Корректная интерпретация:
"Если бы мы многократно (бесконечное число раз) повторяли эксперимент, собирали новые данные и каждый раз строили 95% доверительный интервал для коэффициента, то в 95% случаев эти интервалы содержали бы истинное значение параметра."
Big Data
Ответ:
• Минимизация I/O-операций: При запросе к определенным столбцам читаются только нужные данные, а не вся строка.
• Predicate Pushdown: Фильтрация данных на этапе чтения (например, WHERE age > 20). Parquet хранит метаданные (мин/макс значения для блоков), что позволяет пропускать ненужные блоки данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from .ml
Асессорская разметка: как оценивать согласованность?
Обычно разметка проходит строго по этапам: сбор данных → создание гайда → запуск разметки обычно с перекрытием → агрегация меток → обучение модели → оценка качества.
В такой ситуации можно посчитать коэффициент согласованности — agreement. Он показывает долю совпадающих меток между асессорами.
В нашем случае средний попарный agreement — 83,9%, что достаточно неплохо. Но есть подвох: этот коэффициент, так же как и accuracy в случае бинарной классификации, может вводить в заблуждение при дисбалансе классов. В нашем датасете больше 70% меток приходятся на два класса — «Нейтральный» и «Замешательство». Давайте воспользуемся другими статистическими коэффициентами, чтобы удостовериться в высокой согласованности:
📌 Cohen‘s Kappa (Каппа Коэна) — попарный коэффициент. Оценивает нормализованное согласие между двумя асессорами.
Как интерпретировать результаты:
📌 Fleiss’s Kappa (Каппа Фляйна) — подходит для оценки согласованности между несколькими (более двух) асессорами.
В нашем случае Каппа Коэна варьируется от 0,7 до 0,84, что указывает на высокую согласованность. Для дополнительной проверки мы взяли несколько сотен случайных примеров из датасета и вручную расставили метки. Оказалось, что в 44% наши и асессорские метки расходились — то есть, асессоры в среднем согласованно ставят неправильные метки. Вот поэтому даже высокие показатели согласованности не гарантируют качественной разметки данных.
Что делать в такой ситуации — расскажем в следующем посте.
Обычно разметка проходит строго по этапам: сбор данных → создание гайда → запуск разметки обычно с перекрытием → агрегация меток → обучение модели → оценка качества.
Допустим, мы хотим получить разметку данных для классификатора сентимента обращений в поддержку. Мы получили метки от трех асессоров для некоторого количества реальных диалогов. Как же понять, насколько качественный результат разметки?
В такой ситуации можно посчитать коэффициент согласованности — agreement. Он показывает долю совпадающих меток между асессорами.
В нашем случае средний попарный agreement — 83,9%, что достаточно неплохо. Но есть подвох: этот коэффициент, так же как и accuracy в случае бинарной классификации, может вводить в заблуждение при дисбалансе классов. В нашем датасете больше 70% меток приходятся на два класса — «Нейтральный» и «Замешательство». Давайте воспользуемся другими статистическими коэффициентами, чтобы удостовериться в высокой согласованности:
📌 Cohen‘s Kappa (Каппа Коэна) — попарный коэффициент. Оценивает нормализованное согласие между двумя асессорами.
Как интерпретировать результаты:
<0,6 — плохая согласованность.
0,6…0,8 — хорошая согласованность, можно использовать в прикладных задачах.
>0,8 — очень высокая согласованность.
📌 Fleiss’s Kappa (Каппа Фляйна) — подходит для оценки согласованности между несколькими (более двух) асессорами.
В нашем случае Каппа Коэна варьируется от 0,7 до 0,84, что указывает на высокую согласованность. Для дополнительной проверки мы взяли несколько сотен случайных примеров из датасета и вручную расставили метки. Оказалось, что в 44% наши и асессорские метки расходились — то есть, асессоры в среднем согласованно ставят неправильные метки. Вот поэтому даже высокие показатели согласованности не гарантируют качественной разметки данных.
Что делать в такой ситуации — расскажем в следующем посте.
Forwarded from .ml
Что делать, если асессорская разметка не совпала с экспертной?
В прошлом посте мы выяснили, что коэффициенты согласованности не всегда отражают финальное качество разметки и модели. В нашем случае почти половина примеров размечена неверно — асессоры согласны между собой, но не с экспертами. Как можно улучшить разметку:
📝 Проверить формулировку задачи и прописать подробный гайд с корнер-кейсами. Можно взять выборку, разметить её по гайду и посмотреть, где возникают споры — эти места нужно уточнить.
📝 Собрать тестовый датасет с золотой разметкой с помощью эксперта. После этого можно отобрать асессоров с высокими показателями на тестовом наборе или провести брифинг-встречу со всеми асессорами, чтобы обсудить ошибки.
📝 Разбить работу на чанки и добавить в каждый golden set для валидации. Это позволит оценивать качество разметки итеративно и следить, насколько асессоры попадают в золотой набор.
После внедрения этих шагов в нашей модели эмоций взвешенный F1 вырос с 0,61 до 0,7, а расхождение экспертной и асессорской разметки упало с 44% до 18%. Также хорошо подтянулись небольшие проблемные классы:
Важно:низкая согласованность не всегда означает плохую работу асессоров . Причинами могут быть:
📎 Неоднозначность задачи: она может подразумевать некоторую неопределенность. Например, такое часто встречается при подготовке диалоговых данных для LLM.
📎 Разный бэкграунд асессоров: внутренние AI-тренеры и внешние подрядчики могут понимать задачу по-разному. Это приводит к значительным различиям в оценках.
Поэтому ML-инженерам и датасаентистам важно самим вчитываться в данные и понимать, как они размечены.
Что делать с ошибочными разметками — расскажем в следующем посте.
В прошлом посте мы выяснили, что коэффициенты согласованности не всегда отражают финальное качество разметки и модели. В нашем случае почти половина примеров размечена неверно — асессоры согласны между собой, но не с экспертами. Как можно улучшить разметку:
📝 Проверить формулировку задачи и прописать подробный гайд с корнер-кейсами. Можно взять выборку, разметить её по гайду и посмотреть, где возникают споры — эти места нужно уточнить.
📝 Собрать тестовый датасет с золотой разметкой с помощью эксперта. После этого можно отобрать асессоров с высокими показателями на тестовом наборе или провести брифинг-встречу со всеми асессорами, чтобы обсудить ошибки.
📝 Разбить работу на чанки и добавить в каждый golden set для валидации. Это позволит оценивать качество разметки итеративно и следить, насколько асессоры попадают в золотой набор.
После внедрения этих шагов в нашей модели эмоций взвешенный F1 вырос с 0,61 до 0,7, а расхождение экспертной и асессорской разметки упало с 44% до 18%. Также хорошо подтянулись небольшие проблемные классы:
Благодарность — 0,8 → 0,76
Нейтральный — 0,7 → 0,75
Удовлетворительно — 0,68 → 0,74
Нетерпение — 0,57 → 0,53
Разочарование — 0,57 → 0,55
Замешательство — 0,46 → 0,7
Важно:
📎 Неоднозначность задачи: она может подразумевать некоторую неопределенность. Например, такое часто встречается при подготовке диалоговых данных для LLM.
📎 Разный бэкграунд асессоров: внутренние AI-тренеры и внешние подрядчики могут понимать задачу по-разному. Это приводит к значительным различиям в оценках.
Поэтому ML-инженерам и датасаентистам важно самим вчитываться в данные и понимать, как они размечены.
Что делать с ошибочными разметками — расскажем в следующем посте.
Forwarded from Жизнь и датка (Alexander Guschin)
В процессе работы над ВсОШ я узнал, как образовательный "рынок" адаптируется под появление новой олимпиады.
Например, оказывается (я правда не знал!) что существуют сборные регионов и городов - например, в Питере и Москве ребят на ВсОШ будут целенаправленно готовить.
В некоторых школах появились доп. занятия по ML (например, 2107 или Л2Ш), а в некоторых уже были кружки (Летово, СУНЦ НГУ), а где-то ML учат даже на уровне школьной программы (Лицей №22 "Надежда Сибири).
Стали появляться также разные кружки подготовки: например, кружок от яндекса https://ai.algocode.ru/ (надо было вовремя узнать и пройти отбор) и, конечно, всякие платные кружки.
Это все помогает готовиться, но в основном, если тебе повезло: ты учишься в Москве или Питере, в школе, где учат ML, а также если ты уже шаришь и тогда имеешь шансы отобраться в какой-нибудь онлайн кружок. При этом многие ребята, которые участвовали в отборе на IOAI, были вообще из какой-нибудь noname школы. Кто-то даже шутил, что он единственный млщик в своем городе (не удивлюсь, если среди школьников это и правда так). А Вова Архипов, который проводил муницип в Ростовской области, рассказал мне, что у него его несложный муницип на почти что фулл решило всего два человека. Как вы, возможно, помните, я сам из маленького города, где олимпиадного ML, кмк, нет до сих пор. Поэтому мне очень хотелось чтобы появился открытый и бесплатный курс по подготовке к ВсОШ ИИ, который будет доступен всем и сможет помочь ребятам, с которыми не занимаются учителя или тренеры.
И вот появился и такой) https://cu.ru/olympiad/events/ai-course
Как и ВсОШ по ИИ, курс состоит из трех частей: математика, прога и ML. Части по математике и проге были сделаны специально под ВсОШ, а ML частично взят с нашего курса для подготовки к межнару + частично дозаписан, чтобы закрыть недостающие темы. В создании курса поучаствовали классные ребята, которые проанализировали все доступные по ВсОШ материалы и тестовые контесты, чтобы составить программу и подобрать задачи для домашек. Все они шарят за свой предмет, так что я думаю, что всем, кто готовится, это прям будет полезно)
Например, оказывается (я правда не знал!) что существуют сборные регионов и городов - например, в Питере и Москве ребят на ВсОШ будут целенаправленно готовить.
В некоторых школах появились доп. занятия по ML (например, 2107 или Л2Ш), а в некоторых уже были кружки (Летово, СУНЦ НГУ), а где-то ML учат даже на уровне школьной программы (Лицей №22 "Надежда Сибири).
Стали появляться также разные кружки подготовки: например, кружок от яндекса https://ai.algocode.ru/ (надо было вовремя узнать и пройти отбор) и, конечно, всякие платные кружки.
Это все помогает готовиться, но в основном, если тебе повезло: ты учишься в Москве или Питере, в школе, где учат ML, а также если ты уже шаришь и тогда имеешь шансы отобраться в какой-нибудь онлайн кружок. При этом многие ребята, которые участвовали в отборе на IOAI, были вообще из какой-нибудь noname школы. Кто-то даже шутил, что он единственный млщик в своем городе (не удивлюсь, если среди школьников это и правда так). А Вова Архипов, который проводил муницип в Ростовской области, рассказал мне, что у него его несложный муницип на почти что фулл решило всего два человека. Как вы, возможно, помните, я сам из маленького города, где олимпиадного ML, кмк, нет до сих пор. Поэтому мне очень хотелось чтобы появился открытый и бесплатный курс по подготовке к ВсОШ ИИ, который будет доступен всем и сможет помочь ребятам, с которыми не занимаются учителя или тренеры.
И вот появился и такой) https://cu.ru/olympiad/events/ai-course
Как и ВсОШ по ИИ, курс состоит из трех частей: математика, прога и ML. Части по математике и проге были сделаны специально под ВсОШ, а ML частично взят с нашего курса для подготовки к межнару + частично дозаписан, чтобы закрыть недостающие темы. В создании курса поучаствовали классные ребята, которые проанализировали все доступные по ВсОШ материалы и тестовые контесты, чтобы составить программу и подобрать задачи для домашек. Все они шарят за свой предмет, так что я думаю, что всем, кто готовится, это прям будет полезно)
Telegram
avearrr
Все кто писал олимпиады знают, что ВсОШ считается самой крутой. И неожиданно в этом году информатику разделили на 4 направления, один из них ИИ
Так вот я был организатором МЭ в Ростовской области и составлял задачи. Оказывается, разрабатывать задания намного…
Так вот я был организатором МЭ в Ростовской области и составлял задачи. Оказывается, разрабатывать задания намного…
Forwarded from Daniilak — Канал
Переход c Selenium на Playwright
У меня имеется мой парсер для особых сервисов, который имеет в себе классический зоопарк с selenium (xvfb, конкретная версия ChromeDriver), а также постоянные проблемы с таймаутами и нестабильностью. В общем, всё как обычно.... а Xvfb было решением, которое... позволяет компилировать wasm скрипты
Я очень давно хотел его выкинуть. и наконец-то я близко у цели. Один
Playwright действительно быстрее. Не на 10%, а ощутимо. Особенно заметно на больших объемах данных. Код стал чище — вместо
теперь просто
Не нужно гадать, почему браузер упал — Playwright просто говорит, что не так. Docker образ стал легче — я убрал xvfb, кучу системных пакетов и прочую ерунду. Теперь базовый образ python slim + Playwright.
Технически тоже всё упростилось. Браузер теперь инициализируется один раз на воркер и переиспользуется. Конфиги настраиваются через действительно конфиги, а не через аргументы. а их там аж 30 chrome параметров наберется. Скриншоты делаются встроенными методами
Да, можно было написать код на Selenium лучше, делать больше оберток и покупать лучше сервера, но он мне очень сильно надоел...
У меня имеется мой парсер для особых сервисов, который имеет в себе классический зоопарк с selenium (xvfb, конкретная версия ChromeDriver), а также постоянные проблемы с таймаутами и нестабильностью. В общем, всё как обычно.... а Xvfb было решением, которое... позволяет компилировать wasm скрипты
Я очень давно хотел его выкинуть. и наконец-то я близко у цели. Один
playwright install chromium — и всё работает. Нативный async/await вместо костылей с WebDriverWait. Dockerfile сократился. Были улучшены воркеры, взамен самописных скриптовPlaywright действительно быстрее. Не на 10%, а ощутимо. Особенно заметно на больших объемах данных. Код стал чище — вместо
WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.ID, "element"))) теперь просто
await page.wait_for_selector("#element")Не нужно гадать, почему браузер упал — Playwright просто говорит, что не так. Docker образ стал легче — я убрал xvfb, кучу системных пакетов и прочую ерунду. Теперь базовый образ python slim + Playwright.
Технически тоже всё упростилось. Браузер теперь инициализируется один раз на воркер и переиспользуется. Конфиги настраиваются через действительно конфиги, а не через аргументы. а их там аж 30 chrome параметров наберется. Скриншоты делаются встроенными методами
Да, можно было написать код на Selenium лучше, делать больше оберток и покупать лучше сервера, но он мне очень сильно надоел...
Forwarded from Женя Янченко
Частичные индексы
Представьте ситуацию. В БД PostgreSQL есть таблица с данными водителей:
Внутри одной компании номер телефона водителя должен быть уникален. Для этого заведен индекс уникальности по
Затем добавляется возможность удалять водителей из кабинета компании. Удаление реализуем через soft delete: добавляем в табличку поле
Проходит время, и от пользователей приходит баг: при добавлении нового водителя возникает ошибка.
В логах видно, что БД ругается из-за нарушения уникальности. Оказалось, что запись с таким номером телефона уже существовала и была удалена.
Перед вставкой записи о новом водителе в коде делали проверку, нет ли уже в этой компании водителя с таким телефоном, но проверка была для неудаленных водителей:
Для просмотра списка водителей тоже возвращались только неудаленные записи.
А индекс уникальности по
Разобрались, сделали, чтобы индекс уникальности тоже учитывал только неудаленные записи:
Такой индекс называется частичным.
Частичный индекс — это индекс, который строится не по всем строкам таблицы, а по их подмножеству, определяемому условием WHERE. Это не обязательно должен быть индекс уникальности, может использоваться для индексов поиска.
Когда частичный индекс может пригодиться:
➡️ Как в разобранном выше кейсе, если нужно сделать уникальность по условию.
➡️ Когда в таблице 90% записей "неинтересны" для запросов, можно построить частичный индекс по оставшимся 10%, он будет работать быстрее и занимать в несколько раз меньше места.
Например, у вас есть таблица счетов.
90% счетов имеют статус "Оплачено", а запросы касаются счетов в других статусах.
Если сделать частичный индекс, проиндексировав для поиска оставшиеся 10% неоплаченных счетов, то такой индекс будет занимать значительно меньше места, чем индекс по всем строкам.
Это имеет смысл на больших таблицах, от миллионов строк, когда индекс по всей таблице становится слишком тяжёлым. Плюс запросов к тем 90% непроиндексированным строкам действительно должно быть минимум, ведь они будут обрабатываться без индекса.
⚡️ Ещё кейс из практики.
Когда работала в платформе, тоже столкнулась с ситуацией, в которой пригодились частичные индексы для уникальности.
В рамках одной из задач мне нужно было поддержать уникальность связки полей
Я знала, что c NULL используется не
И если мы хотим разрешить только одну такую запись
1️⃣ Уникальность связки
2️⃣ Уникальность связки
Частичные индексы — нечастая история, но могут пригодиться.
Читала, что в некоторых компаниях отказываются от constraints на уровне БД, таких как foreign keys и индексы уникальности, все необходимые проверки существуют только на уровне кода. Поделитесь, пожалуйста, как у вас?
🔗 — у нас созданы foreign keys и индексы уникальности в БД
💅 — у нас все проверки на уровне кода, индексы только для ускорения поиска
Представьте ситуацию. В БД PostgreSQL есть таблица с данными водителей:
id
company_id
name
phoneВнутри одной компании номер телефона водителя должен быть уникален. Для этого заведен индекс уникальности по
(phone, company_id).Затем добавляется возможность удалять водителей из кабинета компании. Удаление реализуем через soft delete: добавляем в табличку поле
is_deleted. Все работает корректно.Проходит время, и от пользователей приходит баг: при добавлении нового водителя возникает ошибка.
В логах видно, что БД ругается из-за нарушения уникальности. Оказалось, что запись с таким номером телефона уже существовала и была удалена.
Перед вставкой записи о новом водителе в коде делали проверку, нет ли уже в этой компании водителя с таким телефоном, но проверка была для неудаленных водителей:
WHERE is_deleted = false, поэтому она не находила ранее удаленного водителя (и это правильно).Для просмотра списка водителей тоже возвращались только неудаленные записи.
А индекс уникальности по
(phone, company_id) при добавлении поля is_deleted изменить забыли. Поэтому при попытке добавить ранее удаленного водителя с тем же номером телефона возникала ошибка 😢Разобрались, сделали, чтобы индекс уникальности тоже учитывал только неудаленные записи:
create unique index uc_drivers_phone_company_id
on drivers(phone, company_id)
where is_deleted is false;Такой индекс называется частичным.
Частичный индекс — это индекс, который строится не по всем строкам таблицы, а по их подмножеству, определяемому условием WHERE. Это не обязательно должен быть индекс уникальности, может использоваться для индексов поиска.
Обратите внимание, что поле из WHERE не обязано быть индексируемым. В примере мы строим индекс по полям phone, company_id, а в предикате используем поле is_deleted.
Когда частичный индекс может пригодиться:
Например, у вас есть таблица счетов.
90% счетов имеют статус "Оплачено", а запросы касаются счетов в других статусах.
Если сделать частичный индекс, проиндексировав для поиска оставшиеся 10% неоплаченных счетов, то такой индекс будет занимать значительно меньше места, чем индекс по всем строкам.
Это имеет смысл на больших таблицах, от миллионов строк, когда индекс по всей таблице становится слишком тяжёлым. Плюс запросов к тем 90% непроиндексированным строкам действительно должно быть минимум, ведь они будут обрабатываться без индекса.
Когда работала в платформе, тоже столкнулась с ситуацией, в которой пригодились частичные индексы для уникальности.
В рамках одной из задач мне нужно было поддержать уникальность связки полей
(a, b, c). Я добавила индекс и стала писать тесты. Поле c могло быть null, и в процессе тестирования я обнаружила, что несмотря на индекс могу добавить в таблицу две одинаковые записи со значениями:a = 1, b = 2, c = null
a = 1, b = 2, c = nullЯ знала, что c NULL используется не
!=, а IS NULL и IS NOT NULL, так как для PostgreSQL NULL — это не значение, а маркер отсутствия данных. Но оказалось, что с null-значениями еще и уникальный индекс не видит конфликт.И если мы хотим разрешить только одну такую запись
a = 1, b = 2, c = null, то нужно сделать два частичных индекса уникальности:(a, b) where c is null(a, b, c) where c is not nullЧастичные индексы — нечастая история, но могут пригодиться.
Читала, что в некоторых компаниях отказываются от constraints на уровне БД, таких как foreign keys и индексы уникальности, все необходимые проверки существуют только на уровне кода. Поделитесь, пожалуйста, как у вас?
💅 — у нас все проверки на уровне кода, индексы только для ускорения поиска
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Женя Янченко
Ребят, в комментариях к предыдущему посту про частичные индексы написали, что проблема с NULL значениями в индексах уникальности решена с PostgreSQL 15.
Моя история ещё из 2021 года 👨🦳
Сейчас можно добавить такую формулировку при создании индекса в конце:
И null values для целей индекса будут считаться одинаковыми, не нужно будет создавать два индекса.
Моя история ещё из 2021 года 👨🦳
Сейчас можно добавить такую формулировку при создании индекса в конце:
NULLS NOT DISTINCTИ null values для целей индекса будут считаться одинаковыми, не нужно будет создавать два индекса.