Интересное что-то
517 subscribers
2.72K photos
253 videos
139 files
4.52K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
Сегодня предлагаю разобрать популярную задачу с SQL-собесов.

Звучит она обычно так:
Есть таблицы t1 и t2, состоящие из одного столбца и имеющие m и n строк соответственно.
Какое минимальное и максимальное количество строк будет в конечной таблице T, полученной в результате джойна t1 и t2?
🟣t1 inner join t2
🟣t1 left join t2
🟣t1 right join t2
🟣t1 full outer join t2
🟣t1 cross join t2

⭐️Учитывая, что значения могут повторяться или быть равны NULL.

🏁🏁🏁🏁🏁🏁🏁🏁🏁
Для наглядности работы джойнов представим, что обе таблицы содержат по 5 строк с уникальными значениями от 1 до 5, типа:
t1 = [1,2,3,4,5]
t2 = [1,2,3,4,5]

🟣Все типы джойнов, кроме CROSS JOIN, вернут по 5 строк, т.к. для каждого значения в t1 есть ровно одно совпадающее значение в t2.
🟣CROSS JOIN создает все возможные комбинации пар строк: 5×5 = 25 строк.
🟣То есть, если значения одинаковые и уникальные, результат всех основных джойнов (INNER, LEFT, RIGHT, FULL OUTER) - это количество уникальных строк, а CROSS JOIN - произведение их количества.
🏁🏁🏁🏁🏁🏁🏁🏁🏁

Усложняемся, добавим в наборы данных NULL и дубликаты:

t1  = [1, 2, 2, NULL, 5]
t2  = [2, 2, 3, NULL, NULL]

🟣INNER JOIN
В t1 и t2 совпадают только значения “2”, следовательно, количество строк: 2×2=4 (каждая двойка из t1 с каждой двойкой из t2).
NULL с NULL не совпадает, строк с NULL в результате нет.
🟣LEFT JOIN
Все 5 строк из t1 гарантированы.
Значения с “2” вернут + две дополнительные строки, количество = 7 строк.
🟣RIGHT JOIN
Аналогично LEFT JOIN, но со всеми строками t2, количество = 7 строк.
🟣FULL OUTER JOIN
Включает все: дубликаты, NULL с обеих таблиц. Количество = 10 строк.
🟣CROSS JOIN
Каждая строка из первой таблицы умножается на каждую из второй = 25 строк.
🏁🏁🏁🏁🏁🏁🏁🏁🏁

💡Становится понятно, что минимум будет достигаться в случае отсутствия пересечения вообще. В таком случае:

🟣
INNER JOIN вернет
0 строк
, т.к. нет совпадений.
🟣
LEFT JOIN вернет все строки из t1 с NULL в местах столбцов t2
➡️
минимум m строк.

🟣
RIGHT JOIN вернет все строки из t2 с NULL в местах столбцов t1
➡️
минимум n строк.

🟣
FULL OUTER JOIN вернет сумму количества строк из обеих таблиц
(m + n),
т.к. ни одна строка не совпала.
🟣
CROSS JOIN остается без изменений
➡️
m × n строк
.


💡А максимум будет достигаться, когда каждая строка t1 совпадает с каждой строкой t2:
При полном пересечении, когда
каждая строка t1 совпадает с каждой строкой t2
, все типы джойнов вернут
максимальное количество строк m × n
, потому что каждый элемент из одной таблицы сочетается с каждым элементом из другой, образуя полный набор пар совпадающих строк.


💡Если одна из таблиц полностью пустая (не содержит строк):
🟣
INNER JOIN
вернет 0 строк
, т.к. нет данных для совпадений.
🟣
LEFT JOIN, если пустая таблица справа, вернет
все строки из левой таблицы с NULL в столбцах правой таблицы
(число строк равно количеству строк в левой таблице).
🟣
RIGHT JOIN, если пустая таблица слева, вернет
все строки из правой таблицы с NULL в столбцах левой таблицы
(число строк равно количеству строк в правой таблице).
🟣
FULL OUTER JOIN вернет
все строки из непустой таблицы с NULL в столбцах пустой таблицы
(число строк равно количеству строк непустой таблицы).
🟣
CROSS JOIN вернет
0 строк,
т.к. произведение по пустому множеству всегда пусто.


А вам попадалась эта задача на собеседованиях?
😈

©️что-то на инженерном
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерактивный tutorial по аудио кодекам от Kyutai labs 😎

https://kyutai.org/next/codec-explainer
Please open Telegram to view this post
VIEW IN TELEGRAM
GenSpark AI Developer 2.0: создание мобильных приложений одной командой 📱


GenSpark опять вырывается вперед, представляя обновленную версию AI Developer 2.0 — которая содержит встроенные инструменты для разработки нативных мобильных приложений с помощью текстовых запросов (см. скриншот)

Основные возможности:

• Создание игр и бизнес-приложений по текстовому описанию
• Автоматическая интеграция с Firebase для работы с базами данных
• Подключение Google Analytics для отслеживания метрик
• Генерация готовых пакетов для публикации в Google Play

Примеры использования:

1️⃣ Мобильные игры — платформа создает работающую игру за несколько минут по простому описанию

2️⃣ Бизнес-приложения — например, приложение для спортзала с системой бронирования занятий

3️⃣ Интеграция с сервисами — автоматическое подключение баз данных и аналитики

Процесс разработки:
• Выбор типа приложения (нативное)
• Описание идеи в текстовом виде
• Автоматическая генерация кода и интерфейса
• Тестирование и подготовка к публикации

Публикация приложений:
В примере на видео показывается процесс публикации в Google Play — система генерирует готовый пакет для загрузки.
Я подготовил подробную интерактивную инструкцию по ссылке
Для публикации в App Store нужно скачать код, скомпилировать локально и отправить на модерацию. Подробное руководство по App Store будет доступно позже 📲

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

Для тех, кто хочет повторить примеры из видео
Привожу промпты, которые там использовались:

build a halloween candy catch game

create a modern fitness course booking application using Firebase as the backend

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

@llm_notes

#mobile #vibecoding #firebase #genspark #app
Forwarded from Заметки LLM-энтузиаста Chat
Интересно будет сравнить потом с другим популярным онлайн-инструментом для создания мобильных приложений https://rork.com/
Forwarded from max.sh
Последние несколько недель плотно работал с terminal-bench. За названием кроется сразу очень много вещей. Это и бенчмарк, и агент, и фреймворк для создания среды, где эти самые агенты могут работать над задачами.

В этом тексте как раз про последнее - про инструменты для создания среды. Сейчас это еще все называют execution harness.

Что это вообще такое? Допустим, у вас есть набор задач, и вы хотите протестировать какого-нибудь готового агента типа Claude Code или Codex (или даже своего) на то, как он справляется с этими задачами.

Чтобы такое дело провернуть, нужно понаписать немалое количество инфраструктурного кода, чтобы:
а) упаковать ваши подготовленные задачи в среду, где их можно будет изолированно решать (как правило, докер-контейнеры);
b) установить нужных агентов и/или предоставить весь необходимый скаффолдинг (если тестируете своего агента);
с) подготовить отдельную среду, в которой будет запускаться решение агента и как-то оцениваться (например, скрытыми автотестами);
d) ну и наконец, нужно хранить все возможные логи, чтобы потом можно было проанализировать все возможные паттерны;
e) а, и конечно, чтобы все это легко запускалось, каждую задачу можно было перезапускать по N раз и в идеале — легко масштабировалось.

С одной стороны, все это можно реализовать самому. Но это довольно долго и с множеством подводных камней.

Поэтому зачем, когда есть terminal-bench? На мой взгляд, у ребят получился простой, элегантный и масштабируемый фреймворк, который просто работает из коробки в несколько команд. С вас только подготовить все запускалки (докерфайлы для создания окружения и скрипты, как тестировать решение). Каждая задача - то вот такая структур. Подробный гайд есть тут . И реализовать своего агента, если нужно. Либо взять готовые интеграции из коробки - все популярные агенты уже доступны, подставляйте только API-ключи. Можно и их кастомно переделать под себя.

А потом запускаемся:


tb run \
--dataset terminal-bench-core==head \
--agent claude-code \
--task-id hello-world


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

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

И еще раз: terminal-bench предоставляет среду, чтобы можно было не париться с возней по запуску и логированию. Самое сложное – это подготовить задачи и сценарии. Это уже на вас.
Forwarded from partially unsupervised
Когда-то я думал, что ML метрика - это довольно простая функция от двух параметров: обученной модели и тестового датасета. Но это абстракция, конечно, не выдерживает столкновения с реальным миром, а параметров значительно больше.

С локальными факторами справиться как будто несложно. О роли random seed довольно быстро узнают даже новички. Зафиксировать библиотеки тоже учат на software engineering 101.

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

Влияет и железо, причем не только на уровне "на какой платформе и с какой версией драйверов" - вот нетривиальный пример:
The most compelling proof came when we took a failed L20 experiment and resumed it from a checkpoint on H20 GPUs. The training immediately stabilized and recovered, proving the hardware's first-order impact on the problem.


Когда бенчмарки стали считаться поверх LLM API, отмазка "на моей машине воспроизводится" перестала работать. К локальным факторам добавился целый пласт скрытых факторов на стороне провайдера. Сначала по аналогии с random seed = 42 все учились выставлять температуру в 0, потом широко известный в узких кругах стартап всем рассказал, что размер батча важен.

И вот недавно я наступил на новые грабли: внутренний агентский бенчмарк по генерации приложений начал демонстрировать явную сезонность. Видел такое раньше, когда человек додумался использовать datetime.now() где-то в feature engineering. Ручная работа с фичами - история почти античных времен, явно не про prompt2app кодогенерацию.

Ничего хитрого: у агента было два ограничения, на количество шагов и на общее время генерации. И вот в час пик по американскому времени провайдеру становилось хуже, скорость ответа падала => случались таймауты.
Forwarded from Dataism
😯 Курсы по А/Б тестам, которые действительно стоят вашего внимания

Я прошла более 10 курсов по АБ-тестированию и вот мои субъективные рекомендации.
Дисклеймер: могу вас сразу расстроить, по моему мнению, сейчас не существует курса, который был бы идеальным: и с точки зрения полноты материала, и с точки зрения подачи информации и практики.

Но вот основные комбинации курсов под каждый грейд*.

🔰 Для джунов:
1) начинаем с Яндекс.Практикума. (*вот это поворот*, а вы ждали курс на степике от Карпова?)
2) дальше топаем на курс Авито Прикладная статистика. Там уже чутка побольше математического аппарата, но все еще доступно для восприятия благодаря лектору. Честно, очень приятно смотреть на человека, который прям кайфует от преподавания.
3) полируем курсом от ВШЭ

💼 Для миддлов/сеньоров:
1) симулятор А/Б тестов Карпова (я тут его чутка покритиковала, но все еще потянет). Желательно выбить бюджет у своей компании. За свой счет удовольствие такое себе.
2) модуль А/Б тестирования в курсе Hard Ааналитика Карпова (там есть продвинутые темы, которые не были добавлены в Симулятор. Если долго искать в инете, то что-то можно и найти 😈).
3) лекции Яндекса
4) десертик

📚 Что еще может быть полезным?
1) читать papers с arxiv.org и около того. Еще профильные блоги компаний, у которых есть экспертиза по этой теме (яркий пример X5).
2) глянуть курсы от авторов тг-каналов, специализирующихся на аб-тестах. Но обязательно изучите программу курса.
3) если вам нужно быстренько переключиться на английскую терминологию, то курс на лекториуме вам поможет.

*все грейды условные и сильно зависят от компании

#dataism #ab
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from max.sh
На неделе выступил на Google Developer Group (GDG) митапе c рассказом про Gemini CLI.

Gemini CLI – это ответ гугла на Claude Code. Только все исходники в опенсоурсе.

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

TL;DR: у проекта точно есть потенциал, особенно за счет интересных фич. Лицензия хорошая, Apache 2.0, и хорошо подходит тем, кто делает своих агентов: всё можно переделать под себя, кодовая база не очень сложная. Так как проект в ранней фазе, дают 500 кредитов в день на бесплатное использование. Но это меньше, чем кажется, учитывая, как порой тупит агент и как приходится перезапускать сессии, кредиты сгорают быстро. Для ежедневного использования не рекомендую, слишком сыро.

Выжимка с доклада и общие впечатления такие:

• Gemini CLI стал официально доступен ещё в июле. И тогда им было просто невозможно пользоваться: CLI банально зависал и крашился на любом сценарии.

• На сегодняшний момент вопросы со стабильностью всё ещё не решены, но продуктом можно пользоваться. По эргономике он всё ближе и ближе к Claude Code, который авторы, очевидно, берут за референс.

• Полезность агента во многом измеряется качеством ллм, которая оркестрирует его действия. Как несложно догадаться, в агенте от гугла доступны только модели Gemini, конкретно Pro 2.5 и Flash. Последняя абсолютно бесполезная, и любую задачу приходится править по 2–3 раза. Pro-вариант заметно лучше и может генерировать адекватный рабочий код one-shot-ом. К качеству есть вопросы, но это ко всем агентам относится.

• Отдельно хочется упомянуть веб-разработку. Мне нравится делать тесты на парах вида: (картинка с референсным стилем фронтенда, промпт с конкретной инструкцией как нужно организовать веб страницу). Получается style-transfer задача, где нужно и придерживаться инструкции, и учитывать стиль. Вот тут Гемини просто ломается и не способен адекватно копировать стиль. Самый лучший в моих экспериментах это Codex: буквально в one-shot режиме выдаёт красивые визуалы и придерживается инструкции. Claude Code где-то посередине, тоже не очень круто.

• Так как модель не самая крутая, авторы делают фокус на профессиональных разработчиках и добавляют в начинку фичи, которые повышают производительность. Чтобы вообще не нужно было переключаться между вкладками и проводить всё время в окне с Гемини. Из полезного:

- Можно запускать агента в --sandbox режиме, когда он исполняется в отдельном докер-контейнере без возможности испортить локальные файлы.
-Можно переходить в shell mode, чтобы исполнять терминальные команды.
- Есть опция делать snapshot-ы, чтобы откатывать историю изменений прямо в агенте без явного использования гит-команд.
- Отдельно уделили внимание командам для работы с памятью: можно сжимать контекст, подгружать новые инструкции на лету, не правя GEMINI.md.

- Все эти продвинутые фичи в разной степени забагованности и работают не всегда интуитивно. А ещё некоторые выпиливаются между релизами 😄

- Тот факт, что агент опенсорсный, позволяет заглянуть в архитектурные решения и подсмотреть детали. Монорепа состоит из двух независимых частей: CLI UI для интерфейса и Core/ для tools, логики агента и API к Gemini. В целом добавлять свои built-in инструменты несложно, и можно переписать system prompt под себя. Поэтому, если вы разрабатываете своего агента, это может быть хорошим стартом.
🔗 Text2SQL в аналитике: как мы научили ИИ понимать бизнес-запросы без посредников

В этой статье 🖤 описывают, как внедряли Text2SQL, какие модели использовали и обрисовали общую проблематику, реализуя у себя.

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

Пишете в бота: «Средний чек Москва, 2025 vs 2024, динамика в%» → Через 15 секунд получаете точный ответ с трендом.


Как выглядит пайплайн? (упрощение).

1. Запрос пользователя, промпт с описанием таблицы
2. Text2SQL (LLM)
3. Определение типа визуализации.
4. Бекенд -> БД (забрать данные)
5. Чат

Я начал потихоньку реализовывать эту логику на имеющихся витринах, но столкнулся с тем, что периодически модель может галлюцинировать (как это указано в статье, выдавая несуществующие колонки), ну и возникают дополнительные сложности, о которых ниже.

😜 В качестве MVP предлагается собрать одну витрину. В примере X5 — это табличка с > млрд. строк и ~150 колонок.

Наша цель — не просто построить вопросно-ответную систему, а создать полноценного ассистента, который учитывает контекст и историю диалога. Например, если после первого запроса пользователь пишет: «А сгруппируй не по кластерам, а по магазинам», нам необходимо объединить предыдущие сообщения с новым уточнением. Для этого мы получаем историю из backend, определяем, является ли текущий запрос продолжением, и, если да — формируем краткое суммарное описание диалога. В противном случае передаём исходный запрос без изменений.


🍪🍪 Основные вызовы при решении задачи:

1. Написать логику сборки метрик
2. Учитывать контекст предыдущих сообщений
3. Обработка естественного языка и неоднозначных формулировок
4. Борьба с галлюцинациями
5. Оптимизация скорости и ресурсов
6. Работа с большими схемами данных
7. Интерпретация результата
8. Валидация качества работы модели. В качестве метрики использовали (LLM + EX) / 2 для сравнения нескольких моделей.

🐸 Метрика для оценки качества (LLM + EX) / 2

Метрика рассчитывается через попарное сравнение отсортированных колонок. У этого подхода есть ограничения: если, например, модель вывела долю вместо процента — получим False Negative. Если пользователь сформулировал общий запрос, допускающий несколько корректных SQL-вариантов, то результат также будет считаться ошибкой.

LLM. Совпадает ли сгенерированный SQL с эталонным по логике запроса.
EX (Execution Accuracy). Совпадает ли результат выполнения запроса (таблица/агрегация) с заранее написанным ответом.

🐸 Результаты моделей:

DeepSeek R1 (0.765) — лидер по совокупному качеству: наиболее точные и осмысленные SQL-запросы.
Qwen 2.5-72B (0.425) — уверенное второе место, компромисс между качеством и ресурсами.
SQLCoder-8B (0.185) — слабый результат: частые галлюцинации и ошибки исполнения.

В итоге команда X5 остановилась на Qwen 2.5-72B.

✈️ Дальнейшие планы:

1. Поддержка нескольких таблиц
2. Поддержка запросов с джойнами
3. Внедрение классификации запросов пользователей по сложности
4. Дообучение собственной модели
5. Замена LLM на более лёгкие модели
6. Работа с произвольными Excel-файлами
7. Schema-linking на основе RAG’a

✏️ Дополнительные комментарии

Также, при выборе модели, подходящей под использование на том или ином шаге мы учитываем сложность задачи - например, для перевода технических названий колонок на русский язык с учетом контекста запроса мы выбрали использование более легковесной модели: Qwen3-4B, чтобы ускорить работу системы. Для сложных этапов как, например, генерация SQL, мы используем модели побольше.


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

🔗 За полной статьей сюда, дублирую ссылку.

Ставьте 🐳, если понравилась статья (ну и конечно, если ждете сборник методов по 🆎)

@zasql_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🆎 ЦПТ, скосы распределений, логарифмирование

В Google Colab приложил симуляции, которые показывают, как интуитивно работают методы + прикрепил разбор статьи с описанием работы различных методов, сходимости и прочее.

🔗👉 Ссылочка тут

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

Если наберется много 🐳, разберу подробней парочку из них. Где-то планируется завышать значение t-критическое, где-то отсекать хвосты и моделировать их через определенный алгоритм, а где-то их обрезать, например, как тут выкинуть топ n% выбросов, ну и существуют методы, когда заменяют выбросы значением квантилей.

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

🐍 Дополнительно дублирую ссылочку на Google Colab

🐸 @zasql_python
Please open Telegram to view this post
VIEW IN TELEGRAM