Dmatryusофрения
41 subscribers
291 photos
10 videos
15 files
148 links
Пишу о книгах, лидерстве, технологиях, opensource, своих проектах и наверное чем-то ещё. Ну и репосты IT приколямб.
Download Telegram
🐬 Dolphin — превращает PDF в структурированные данные

Dolphin (Document Image Parsing via Heterogeneous Anchor Prompting) — 100% open source-модель для автоматического разбора PDF и сканов.

Зачем нужен:
— Конвертирует документы в готовые форматы: Markdown, HTML, LaTeX, JSON.
— Извлекает текст, таблицы, формулы и изображения.
— Полезен как для подготовки данных для LLM, так и для любых автоматизированных систем, архивов, поиска и аналитики.

Как работает:
1️⃣ Анализ макета страницы — определяет все элементы в естественном порядке чтения.
2️⃣ Параллельный парсинг — с «якорями» и промптами под каждый тип контента.

Представьте, что у вас есть 500 отчётов в PDF с финансовыми таблицами и графиками. Dolphin превращает их в аккуратный CSV или JSON, готовый для анализа в Pandas или загрузки в базу данных — без ручного копипаста и правок.


💡 Лёгкая архитектура + параллельная обработка = высокая скорость без потери качества.

🔗 Репозиторий с кодом и моделями: https://clc.to/6gPIwA

Библиотека дата-сайентиста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
#open_source
#myproject@dm_projects_log

Новая утилита: file_size_sorter.py — скрипт анализа дискового пространства.

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

Скрипт использует только стандартную библиотеку Python, так что зависимостей нет.

Примеры использования:
# Найти 10 самых больших файлов в домашней директории
python file_size_sorter.py /home/user 10

# Посмотреть все файлы проекта, отсортированные по размеру
python file_size_sorter.py ./my_project

# Найти самые маленькие файлы (полезно для очистки мелкого мусора)
python file_size_sorter.py /tmp 20 --asc
💯4
#open_source
#myproject@dm_projects_log

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

Что умеет новый модуль?

📝 Markdown → HTML/PDF за одну команду
🎨 4 встроенные темы (включая тёмную!)
🌈 50+ стилей подсветки кода
📊 Mermaid диаграммы прямо в документах
⚡️ Работает офлайн или через API

🎯 Для кого это?
• Пишете документацию? Теперь она будет красивой!
• Ведёте техблог? Конвертируйте посты в PDF
• Делаете презентации? Mermaid диаграммы включены!
• Учитесь/учите? Идеально для конспектов с кодом

💡 Простой пример
# Обычная конвертация
python md_converter.py README.md

# PDF с тёмной темой
python md_converter.py docs.md --format pdf --theme dark

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

GitHub: https://github.com/Dmatryus/miniutils/tree/main
🔥4
#classic
Люблю такие шпоры
🤩2👌1
This media is not supported in your browser
VIEW IN TELEGRAM
🎤 Microsoft выкатил **VibeVoice** — новую SoTA модель Text-to-Speech (TTS) на **1.5B параметров** под лицензией MIT 🔥

Возможности
- 🎧 Генерация до 90 минут аудио за раз
- 👥 Поддержка >4 голосов одновременно
- Режим стриминга + готовится версия на 7B
- 🌍 Кросс-языковая генерация и даже синтез пения 🎶
- 🎭 Управление эмоциями и экспрессивностью речи

Это делает VibeVoice одним из самых мощных и доступных open-source TTS-решений прямо сейчас. Огромный шаг от Microsoft в сторону открытых голосовых технологий! 🚀

https://huggingface.co/microsoft/VibeVoice-1.5B

@machinelearning_interview
2
2025-08-29 13_40_47_neg.png
85.5 KB
#scheme #myproject

Делюсь красивой схемкой, которую нарисовал сегодня 😊
This media is not supported in your browser
VIEW IN TELEGRAM
💥 SmolVLA: компактная VLA-модель для роботов, которая обогнала крупных конкурентов — и она полностью open source!

🚀 Что это такое:
SmolVLA — новая vision-language-action модель для робототехники, обученная только на открытых датасетах LeRobot (Hugging Face). Несмотря на размер всего 450M параметров, она показывает результаты лучше более крупных моделей вроде ACT.

📌 Почему интересно:
+26% точности благодаря предобучению на open-source данных
Запускается даже на обычном MacBook
Ответы на 30% быстрее за счёт async-инференса и оптимизаций
Сильные результаты на Meta-World, LIBERO, SO100, SO101
Полностью открыта: веса, код, пайплайн и стек для оценки

🧠 Трюки для эффективности:
- меньше визуальных токенов
- выходы берутся с промежуточных слоёв
- разделение perception и action для ускорения

📍 SmolVLA — отличный пример того, что может дать сообщество, когда делится данными и строит открытые решения в робототехнике.

https://huggingface.co/blog/smolvla
#python

Я позволю себе украсть идею у Дэна Байдера, чью книгу я сейчас читаю и запустить серию мыслей по поводу программирования на Python. Для меня это одновременно конспект и рефлексия на тему содержания книги, а вам просто может быть интересно.

И первая тема: менеджеры контекста и инструкции with.


Наверняка вы хоть раз писали что-то типа
with open("model.pickle", "br") as f:
model = pickle.read(f)
Это стандартный путь работы с файлами в python. Зачем так делать? Чтобы гарантировать закрытие контекста файла. В файлах используются специальные дескрипторы, и если их не поставить, то файл может поламаться.

Эта штука называется контекстом. Открытие файла - открывает контекст f, а функция f.close(). И вот чтобы не париться со всем этим есть конструкция менеджера контекста и инструкция with которая упрощает работу с ним.

Такие же приколы есть например с БД, где коннект имеет контекста, и его необходимо закрывать, например, чтобы освободить пулл коннектов.

Вы можете мутить свои менеджеры контекстов, взаимодействующие с with для этого нужно реализовать функции __enter__(self) для открытия контекста и __exit__(self, exc_type, exc_val, exc_tb) для закрытия.

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

from contextlib import contextmanager 

@contextmanager
def managed_file(name):
try:
f = open(name, 'w')
yield f
finally:
f.close()
#LLM

🤖 Мой 40 дневный опыт работы с Claude

Многие спрашивали меня про подписку на Claude Pro, так что решил поделиться своим опытом.

🚀 Как всё начиналось
Изначально я начал пробовать Claude просто из любопытства. Честно говоря, первые попытки были полным провалом.
Знаете эту проблему с большими нейронками? Попросишь его приготовить макароны, а он начинает с того, как вырастить пшеницу 😅
Серьёзно — дикий over-engineering на ровном месте. Простые вещи усложнялись до невозможности, а результат чаще всего тупо не получался.

💰 Вопрос подписки
Быстро понял, что плана за $20 не хватает. Типа немного работать над чем-то небольшим - ок, но это не мой путь)
Перешёл на Claude Pro за $100 — лимиты в 5 раз больше. Вот это уже нормально!
Когда заканчивается лимит? Обычно где-то к концу рабочего дня, часов в 18-19 или 23, если весь день активно пользовался. Обычно обновления ждешь час-два. Что хорошо для перерыва.

Что я делаю с Claude
Рабочие задачи:
Пишу небольшие функции и скрипты (до 200 строк)
Переписываю код на другие фреймворки
Добавляю функциональность v2 к существующим проектам
Создаю презентации (получается вполне достойно)
Исследования и анализ данных
Личные проекты:
* Различные эксперименты с кодом
* Обучающие материалы

🎯 Что работает хорошо
* Структурирование информации
* Создание технической документации
Сейчас у меня ~2-3 балла по эффективности из 5 возможных.

Ограничения
Чего Claude НЕ умеет:
* Рисовать (если нужны иллюстрации — ищите другие решения)
* Работать с визуальным контентом на продвинутом уровне
* Работать с аудио

Иногда он всё ещё слишком позитивный и "правильный" в общении — как будто общается с детьми.

🤔 Стоит ли оно того?
Честно? Чисто функционально Claude не стоит $100 в месяц.
Но я продлил подписку.
Почему? Потому что мне просто весело с ним работать! Это как прикольная игрушка, которая ещё и пользу приносит.
Я всё ещё прокачиваю свои навыки работы с ним. С каждым разом становлюсь чуть более эффективным в формулировке запросов и получении нужных результатов.

В одном из следующих постов расскажу подробнее про конкретные кейсы.
🔥 Большое обновление в pandas: Expressions

Pandas исполняется уже 17 лет, и наконец-то в версии 3.0 появляется то, чего ждали многие — выражения (expressions) через pd.col.

Раньше:
df = df.assign(temp_f = lambda x: x['temp_c'] * 9 / 5 + 32)


Теперь:
df = df.assign(temp_f = pd.col('temp_c') * 9 / 5 + 32)


Почему это реально круто:
— Больше никаких непонятных lambda, которые ломаются в циклах.
— Код читается и дебажится проще:
  pd.col('a') + 10  # => (col('a') + 10)


Поддержка str, dt, NumPy ufunc и фильтрации прямо в loc.
Это первый шаг к полноценной системе выражений в духе Polars.

Пример:
df.assign(
city_upper = pd.col('city').str.upper(),
log_temp_c = np.log(pd.col('temp_c'))
)


Чище, безопаснее и интуитивнее.
Pandas берёт лучшее у новых библиотек (Polars, Narwhals) и возвращает нас к удобному и современному синтаксису.

🔗 Подробная статья по теме

🐸 Библиотека дата-сайентиста

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
#python

Ещё немного снипитов кода упертых из книги Дэна Байдера.

Я не знал, что при возвращение внутренней функции, она запоминает состояние внешней. Теперь знаю, даже представил себе, как это работает.

Вот пара примеров:
def get_speak_func(text, volume):
def whisper():
return text.lower() + '...'
def yell():
return text.upper() + '!'
if volume > 0.5:
return yell
else:
return whisper
>>> get_speak_func('Привет, Мир', 0.7)()
'ПРИВЕТ, МИР!'

Здесь запоминается текст, переданный при получении внутренней функции.

Вот еще наглядный пример:
def make_adder(n):
def add(x):
return x + n
return add
>>> plus_3 = make_adder(3)
>>> plus_5 = make_adder(5)
>>> plus_3(4)
7
>>> plus_5(4)
9


Практическое применение - создание фабрики функций. По сути внешняя конфигурирует внутреннюю. Возможность интересная и, вероятно, в определенных обстоятельствах полезная. Я же обычно предпочитаю делать объекты-калькуляторы. У которых состояние конфигурируется через внутренние атрибуты и есть метод расчёта calc(self, *args). Мне кажется такой подход более явным , а
Явное лучше, чем неявное.
👍2
Полезная шпаргалка: как выбрать правильное распределение для данных

1️⃣ Начните с гистограммы

— Простая, но мощная визуализация.
— Помогает понять форму данных: колоколообразная (Normal), быстро падающая (Exponential), ровная (Uniform), с несколькими пиками (Mixture).
import matplotlib.pyplot as plt
import numpy as np

data = np.random.normal(50, 15, 1000)
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.xlabel('Values'); plt.ylabel('Count'); plt.title('Гистограмма данных')
plt.show()


2️⃣ Протестируйте разные распределения

— Используем библиотеку distfit для подбора распределений.
— Проверяет ~90 типов распределений автоматически:
from distfit import distfit
import numpy as np

my_data = np.random.normal(25, 8, 2000)
fitter = distfit(method='parametric')
fitter.fit_transform(my_data)

print("Лучшее распределение:", fitter.model['name'])
print("Параметры:", fitter.model['params'])


3️⃣ Визуализируйте подгонку

— Всегда проверяй глазами!
— Используй PDF (распределение) и CDF (кумулятивное распределение):
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15,6))
fitter.plot(chart='PDF', ax=ax1); ax1.set_title('PDF')
fitter.plot(chart='CDF', ax=ax2); ax2.set_title('CDF')
plt.show()


4️⃣ Не забывайте про нестандартные данные

— Дискретные счётные данные → binomial, Poisson.
— Сложные или многопиковые данные → non-parametric (quantile, percentile).

Пример:
from scipy.stats import binom
count_data = binom(20, 0.3).rvs(1000)
discrete_fitter = distfit(method='discrete')
discrete_fitter.fit_transform(count_data)
discrete_fitter.plot()


5️⃣ Проверяйте стабильность

— Бутстрэпинг помогает проверить, насколько выбранное распределение устойчиво к случайным выборкам:
fitter.bootstrap(my_data, n_boots=100)
print(fitter.summary[['name','score','bootstrap_score','bootstrap_pass']])


🐸 Библиотека дата-сайентиста

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
#LLM

🤖 Как я использую Claude

Как и обещал, рассказываю про конкретное использование Claude на реальных проектах.

🚫 Первая ошибка: "Один чат — один проект"

Сначала я пытался делать весь проект в одном чате. И это была фундаментальная ошибка.

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

Вторая проблема - все в одном месте, и если что-то идёт не в заданной промптом последовательности, Claude может начать тупить.

💡 Решение: Разделение на специализированных агентов

Понял, что нужно постепенно разбивать части проектов на разные составляющие.

🎯 Мои специализированные "агенты":
📋 Постановщик задач
- Обсуждаем задачу
- Формируем полное описание того, что нужно делать

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

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

🧪 Тестер
Пишет тесты и помогает с дебагом

📚 Документатор
- Создает пользовательские и разработческие доки
- Оформляет схемы и диаграммы
- Описывает, что как и почему

🚀 Деплойщик
- Контейнеризация
- Подготовка к развертыванию

Как это работает на практике

Важные принципы:

Каждый агент = отдельный проект со своим системным промптом

Изоляция ответственности — каждый делает своё дело

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

🔄 Что с переписыванием?

Да, всё равно приходится переписывать. Но это гораздо проще, когда:
- У каждого агента есть конкретная функция
- Контекст не засоряется лишней информацией
- Можно быстро вникнуть в то, что написано
👍2
Что такое vLLM и зачем он нужен?

Это движок для сверхбыстрого инференса больших языковых моделей. В блоге Алески Гордича разобрали, как он устроен под капотом.

Главные фишки:
KV-cache с paged attention — умно хранит память, чтобы модель не тормозила на длинных запросах.
Continuous batching — новые запросы можно подмешивать прямо во время работы, без ожидания.
Оптимизации:
• chunked prefill — длинные промпты режутся на куски, чтобы не блокировать других
• prefix caching — общий префикс считается один раз, а не заново для всех
• guided decoding — модель пишет строго по правилам (например, JSON)
• speculative decoding — маленькая модель «накидывает» текст, большая подтверждает.
Масштабирование: работает и на одной видеокарте, и на кластере из десятков.
Автотюнинг и бенчмарки: встроенные тесты подбирают оптимальные настройки под SLA.

Итог: vLLM — это уже не просто библиотека, а полноценная архитектура для работы LLM в проде: быстрая, гибкая и экономная.

🟠Подробный разбор: https://www.aleksagordic.com/blog/vllm

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
📌Почему языковые модели галлюцинируют.

OpenAI опубликовали исследование о причинах галлюцинации LLM.

Галлюцинации - это не мистический сбой в сознании ИИ, а вполне предсказуемый побочный эффект его обучения.

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

🟡Все начинается еще на претрейне.

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

В работе вводится понятие singleton rate — доля фактов, которые появились в данных лишь один раз. Теоретический расклад показывает, что уровень галлюцинаций модели будет как минимум равен этой доле.

Проще говоря, если 20% фактов о днях рождения в датасете встретились единожды, модель будет выдумывать дни рождения как минимум в 20% случаев.

🟡Эксперименты это подтверждают.

Модель DeepSeek-V3, на просьбу назвать день рождения одного из авторов статьи, трижды выдала неверные даты: 03-07, 15-06 и 01-01. Ни одна из них не была даже близка к правильной (осенью).

В другом тесте, где нужно было сосчитать количество букв D в слове DEEPSEEK, та же DeepSeek-V3 выдавала 2 или 3, а модели компании Марка Цукерберга и Claude 3.7 Sonnet доходили до 6 и 7.

При этом базовые модели после претрейна часто показывают отличную калибровку. Например, у предобученной GPT-4 ожидаемая ошибка калибровки составляла всего 0.007, что говорит о высокой статистической адекватности ее предсказаний. Кто бы сомневался.

🟡Почему галлюцинации не исчезают после пост-тренинга и RLHF?

Ответ на этот вопрос - в системе оценки. Большинство современных бенчмарков поощряют угадывание. Модели, по сути, постоянно находятся в режиме сдачи экзамена, где за правильный ответ дают 1 балл, а за пустой бланк или ответ я не знаю - 0. В такой системе оптимальная стратегия при неуверенности - только угадать. Любой шанс на правильный ответ лучше, чем гарантированный ноль.

Эту гипотезу подтвердили анализом популярных оценочных наборов.

В GPQA, MMLU-Pro, Omni-MATH, SWE-bench и HLE используется строго бинарная система оценки (правильно/неправильно). Возможности получить частичный балл за честное признание в незнании там просто нет. Из 10 рассмотренных в исследовании популярных бенчмарков только один, WildBench, присуждает частичные баллы за ответы формата я не знаю. Остальные же фактически наказывают модель за отказ галлюцинировать, создавая эпидемию штрафов за неуверенность и поощряя ее выдавать правдоподобную ложь.

🟡Что делать инженерам.

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

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

🔜 Читать статью полностью
🔜 Смотреть видео разбор

#AI #ML #LLM #Research #OpenAI
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ REFRAG: новое поколение RAG

REFRAG ускоряет работу Retrieval-Augmented Generation, сжимая контекст в chunk embeddings, сохраняя качество ответов.

📌 Результаты:

- До 30.85× быстрее первый токен

- До 16× длиннее эффективный контекст без потери точности

🔍 В чём идея:

Обычные RAG-промпты вставляют кучу текстов, половина из которых не нужна → модель тратит вычисления впустую.

REFRAG заменяет токены этих текстов кэшированными эмбеддингами, подгоняет их под размер декодера и подаёт вместе с вопросом.

Последовательность короче → внимание масштабируется по чанкам, а не по токенам → меньше памяти уходит на KV-кэш.

🎯 Как работает:

- Большинство чанков остаются сжатыми.

- Специальная политика выбирает, какие именно разжать обратно в токены, если важна точная формулировка.

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

- Политика сжатия/разжатия тренируется через reinforcement learning, используя лосс предсказания слова как сигнал.

📄 Paper: arxiv.org/abs/2509.01092
🔥2