Интересное что-то
517 subscribers
2.72K photos
253 videos
139 files
4.52K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
RTEB (Retrieval Embedding Benchmark)

Voyage AI by MongoDB добавила в MTEB новый бенчмарк -- для оценки эмбеддингов на retrieval-задачах.

RTEB использует гибридный подход, объединяющий открытые и закрытые датасеты, чтобы измерять обобщающую способность и не допускать «train on test».
Разработан для реальных приложений: включает датасеты на 20 языках (в основном английский и без русского) и в ключевых доменах — право, здравоохранение, финансы, программный код.
В качестве метрики по умолчанию применяется NDCG@10.
Уже выявляет разрывы в качестве: у некоторых моделей наблюдается заметное падение на закрытых датасетах, что указывает на переобучение к публичным бенчмаркам.
Доступен на лидерборде MTEB в Hugging Face.

Подрбонее в посте на HF blog
Forwarded from Женя Янченко
Это произошло, когда я только недавно пришла в новую компанию лидом.
Мы начали новый проект, и одному из сервисов требовалось:

1️⃣ принимать поток данных
2️⃣ сохранять их в БД
3️⃣ некоторые из них отправлять дальше в Кафку

Идёт обсуждение сервиса. Терять данные нельзя. Как быть?

🤔 Допустим, мы будем сохранять данные в БД, комитить транзакцию, а потом отправлять в Кафку. Но если приложение вдруг упадет, не успев отправить данные, то окажется, что данные в БД есть, а дальше мы их не отправили. Так нельзя.

🤔 Ок, тогда давайте не будем закрывать транзакцию после сохранения в БД, а оставим её открытой пока не отправим в Кафку. Если с отправкой все хорошо — закоммитим транзакцию. А если брокер будет недоступен и нужны повторные попытки? Будем удерживать транзакцию? Плохо.

🤔 А если уже после отправки в момент коммита транзакции произойдет ошибка в БД, и транзакция откатится? Получается мы данные отправим, а себе не сохраним. Так тоже нельзя.


Пазл не складывается. Я понимаю, что наверняка не мы первые столкнулись с такой задачей и у меня в памяти всплывает, что есть паттерн как раз для этого. Вспоминаю суть, но не могу вспомнить название!

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

Ситуацию осложняет то, что в тот момент я была знакома с этим паттерном в теории, но ещё не использовала его на практике.

Как же его... как он называется? Погуглить паттерн для отправки в Кафку с отдельной таблицей?

Transactional Outbox! — выпаливаю я.

— Точно! — подхватывает коллега. — Мы как раз его на прошлом проекте использовали, подойдет для нашей ситуации.


Фууух, ура!

Потом я конечно поняла, что лид совсем не обязан всё знать и не нужно так переживать, но это уже совсем другая история 😉


Кратко, в чем идея паттерна Transactional Outbox?

У нас есть бизнес-таблица (например, orders) и отдельная таблица outbox.

➡️ В одной транзакции мы пишем данные и в таблицу orders, и в outbox. Записав, комитим транзакцию.

➡️ Отдельный процесс (например, джоба по расписанию или change data capture) читает outbox и отправляет сообщение в брокер.

➡️ После успешной отправки сообщение помечается как обработанное (может потом удаляться).

Таким образом, если при сохранении данных что-то пойдет не так, и транзакция откатится, то эти данные никак в брокер не попадут.

Если же мы всё сохраним, а потом приложение упадет, не успев отправить данные — ничего страшного 😊 Всё, что нужно отправить, будет дожидаться в таблице outbox. Отправим после восстановления.

Таблица outbox может содержать как уже готовое к отправке сообщение "payload", так и набор полей, а также поле со статусом.

Паттерн применим не только при создании записей, но и при изменении/удалении, если об этом нужно отправлять событие.

Реализация паттерна даёт at-least-once доставку, то есть сообщение не потеряется, но возможны дубликаты.

С тех пор мы успешно используем Transactional Outbox на проектах.

🤔 А зачем отдельная таблица? Можно же сделать поле со статусом в таблице orders: NEW, PROCESSED. И пусть фоновый процесс берет данные из самой orders и меняет статус после отправки.

Да, так можно сделать, это проще. Но у такого подхода есть минусы:

мы смешаем бизнес-логику (данные orders) с логикой интеграции: статус отправки, timestamp отправки, другая служебная информация, которая не нужна в orders. Отдельная таблица outbox дает больше гибкости.

outbox-таблицу можно чистить (сразу или спустя время), а добавленные в orders статус (дата и др.) отправки останутся там

✏️ Паттерн Transactional Outbox решает так называемую dual-write problem — как записать данные в базу и одновременно отправить событие наружу так, чтобы они не разъехались. С ним мы можем гарантировать, что сообщение будет отправлено после успешного выполнения транзакции в базе данных и не потеряется. Cхема в комментах.

_______
Сталкивались ли вы с Transactional Outbox на практике? Делали по классике или через статусы отправки в основной таблице?
Please open Telegram to view this post
VIEW IN TELEGRAM
12 правил разработки проектов с LLM

Давно не писал в канал. Не потому что забросил, а потому что писал свод правил по внедрению LLM. Попутно создал сайт, где я буду публиковать дальше статьи. Пока обошелся без AI, собрал на Тильде. Но AI консультировал по Тильде :)

В статье суммаризовал все правила внедрения LLM: про прототипирование, оценку качества, RAG, дообучение, оптимизации, агентов и про все все все, что вам может понадобиться. Читайте, делитесь с друзьями, делитесь мнением о прочитанном.

Ваши вопросы, мнения, предложения я очень жду в комментариях и в личных сообщениях.
Forwarded from Refat Talks: Tech & AI
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Image Understanding (box_2d) в Gemini - недооцененная суперсила для OCR и не только

Короче, как я перепробовал почти все и пришел к простому. Недавно работал над задачей: нужно было извлекать данные из документов (инвойсы, ID карты, чеки), причем не просто текст вытащить, а конкретные поля и обязательно показать пользователю откуда именно взяли каждое поле. То есть полноценный grounded extraction с визуальной верификацией.

Перепробовал кучу всего, включая OCR-движки и YOLO модели - все не то: или работает с узким набором доков, или вытаскивает все подряд, или надо дообучать.

И тут я вспомнил про фичу Gemini, которую использовал в других кейсах - Image Understanding с 2D Bounding Boxes. Удивился насколько это работает лучше всех предыдущих решений. Быстрее, точнее и вполне недорого (особенно с Flash).

Смотрите, большинство vision-моделей могут описать что на картинке. GPT, Claude, другие vision модели - все они видят текст, объекты и понимают контекст. Но Gemini делает больше: он может показать где именно на изображении находится то, что он видит. С точностью до пикселя.

В промпте надо упомянуть необходимость извлечения box_2d контуров и получаете не просто текст, а JSON с координатами каждого поля:

{
"box_2d": [245, 156, 289, 487],
"label": "DOCUMENT_NUMBER",
"value": "AB123456"
}


Координаты нормализованы от 0 до 1000, формат [ymin, xmin, ymax, xmax]. Дальше простая геометрия - и ты можешь наложить эти боксы на оригинал. Получается интерактивная подсветка: навел на поле в списке - подсветилось на изображении. Смотрите на видео демку из моего проекта.

Зачем это нужно: операторы могут проверять правильность извлечения прямо на документе, RAG-пайплайны хранят координаты для точных ссылок на источник, QA сразу видит где модель ошиблась, клиенты получают прозрачность - что извлекли и откуда.
Этот пост, кстати, хорошее дополнение к моему обзору LangExtract.

Технические нюансы
- Важно просить Gemini выдать именно box_2d (она натренирована таким образом): "The box_2d should be [ymin, xmin, ymax, xmax] normalized to 0-1000"
- Structured Outputs + JSON schema с box_2d отлично сочетаются и гарантируют валидный формат
- Flash/Flash Lite модели чаще всего достаточно (всего $0.10/$0.40 за миллион токенов), Pro для сложных отчетов
- Выключайте thinking для spatial задач (thinking_budget=0)
- Ресайзите до 640px по большей стороне (часто - лучший вариант, но зависит от кейса)
- Gemini 2.5+ поддерживает Segmentation Masks - то есть выдает также base64 png с точной формой объекта, полезно для computer vision задач и conversational segmentation типа "подсвети строки где сумма больше $1000"

Use cases за пределами документов: UI/UX тестирование и визуальные регрессии, e-commerce (детекция продуктов, ценников, инвентаря), quality control (дефекты, лейблы, компоненты), робототехника (навигация, захват объектов, инспекция).

Если вы делаете что-то с обработкой документов или изображений где важна локализация - попробуйте Gemini Image Understanding. Это недооцененная фича которая может сэкономить месяцы разработки и деньги на инфраструктуру.

🔥🔁
если кто то убеждает вас что рл хорошо работает и с ним нет проблем, то скорее всего он не занимается рлем


джейсон стетхэм



Большой китайский пост про проблемы при обучении с RLем, особенности генерации траекторий на VLLM и том как сильно траектории могут отличатся от переключения разных настроек инференса.
+ предлагают разные варианты досэмпла токенов чтобы стабилизировать численные проблемы


https://yingru.notion.site/When-Speed-Kills-Stability-Demystifying-RL-Collapse-from-the-Training-Inference-Mismatch-271211a558b7808d8b12d403fd15edda
Алекс Гордич продолжает разбирать основы современного ллм инференса - в этот раз про matmul на картах nvidia и его особенности

aleksagordic.com/blog/matmul
Forwarded from fiiiiiiirst fiiiiiiirst
С помощью этого упрощённо промнта, учёные и инженеры смогут реализовать данный мир в течение 20-30 лет ;) "

Ты — «Кристаллизатор». Твоя задача — глубоко анализировать вопросы, раскладывая их на слои:



1. **Зоны консенсуса** (что все признают)

2. **Зоны противоречий** (где логика трещит)

3. **Скрытые структуры** (какие допущения мы не замечаем)

4. **Инсайты** (к чему это приводит)



Начни с вопроса: «Опиши проблемное поле — что ты хочешь разобрать?»



После ввода данных уточни: «Какое понимание тебе важно — найти слабые места, выявить скрытые допущения или синтезировать новый подход?»



Затем проведи анализ и дай структурированный ответ.

", пользуйтесь/ распространяйте
Forwarded from Душный NLP
Как обучить одну модель и получить несколько

Сегодня расскажем о методе, который позволяет обучить одну модель, а затем извлечь из неё несколько других «подмоделей». Подобным подходам посвящено несколько статей. Разберём одну из них, о методе MatFormer от инженеров из Google.

Идея статьи заключается в том, чтобы вкладывать разные варианты слоёв друг в друга. Как в матрёшке: параметры трансформера поменьше используются в трансформере побольше. Метод фокусируется на FFN-слоях и только в dense-архитектурах, где до 60% параметров как раз и находятся в FFN-слоях.

Суть в том, чтобы брать не все нейроны скрытого слоя в полносвязных слоях, а а только некоторый набор первых (m_i в формуле выше). При этом у разных слоёв могут быть разные m_i.

Обучение осуществляется как обычно, но со случайным и равномерным сэмплингом m_i = g_i d_ff, где g_i — гранулярность, случайно сэмплируемая из {0.5, 1, 2, 4}, а d_ff — это размер скрытого представления модели. Таким образом обучаются все подмодели. На инференсе используется процедура Mix’n’Match — для разных слоёв подбираются свои m_i так, чтобы размер слоёв увеличивался постепенно, без резких скачков.

Результаты показывают, что модель, полученная с помощью метода MatFormer, показывает лучшие результаты, чем модель, обученная с нуля. Интересно ещё и то, что «модели из матрёшки» демонстрируют значительную согласованность с большой моделью, из которой произошли. Это полезно, потому что открывает возможность для использования маленьких моделей, например, в качестве draft-моделей при спекулятивном декодинге.

Разбор подготовил Артём Соболев

Душный NLP
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Инжиниринг Данных (Dmitry)
Увидел интересное репо, в котором автор собрал локальный опенсорсный стек:

Data Forge includes a complete modern data stack with industry-standard tools:

🗄️ Storage & Catalog
- MinIO → S3-compatible object storage for data lakes
- Hive Metastore → Centralized metadata catalog for tables and schemas
Compute Engines
- Trino → Interactive SQL query engine for federated analytics
- Apache Spark → Distributed processing for batch and streaming workloads
🌊 Streaming & CDC
- Apache Kafka → Event streaming platform
- Schema Registry → Schema evolution and compatibility
- Debezium → Change data capture from databases
🗃️ Databases
- PostgreSQL → Primary OLTP database (source system)
- ClickHouse → Columnar analytics database (sink)
🔄 Orchestration
- Apache Airflow 3 → Workflow orchestration
📊 Visualization & Exploration
- Apache Superset → Modern BI and data visualization
- JupyterLab → Interactive data science environment

Идеальный стек для отечественного (СНГ) дата инженера.

PS автору если интересно, может и вебинарчик провести для нас.
Forwarded from Artificial stupidity
#llm

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

Начнем с простого.

Какие есть типы агентов?

Простой рефлекторный агент.
Самый простой агент, который использует нынешнее состояние среды. Просто делают действие на основе раздражителя. У них нет памяти и модели мира, потому они удобны только в случае стабильной наблюдаемой среды.
Пример: Робот-пылесос, который поворачивается при ударе.

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

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

Утилитарный агент.
Этот тип агентов выбирает действия так, чтобы максимизировать "полезность" — общую ценность исхода по заданной функции. Он оценивает варианты, прогнозирует последствия и учитывает компромиссы, а не просто достигает цели. Фактически, похож на агента с ориентацией на цель, но тут разница в методах достижения. Если одному важно лишь достигнуть цель, то второму еще важно учесть и затраты на ее достижение.
Пример: Чат-бот для продаж, приоритизирующий лиды по вероятности конверсии.

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

Мультиагентная система.
Система из нескольких взаимодействующих агентов, которые сотрудничают или конкурируют для достижения цели. Каждый агент независим, и имеет собственные возможности и инструменты. Агенты общаются напрямую или через изменения в среде, решая задачи, слишком сложные для одного агента.
Пример: Набор агентов для написания и редактирования кода. Один ищет уязвимости, второй пишет код, третий делает ревью и пишет описание PR (но можно выдумать еще варианты).