● HABR WEEKLY DIGEST · AI / AGENTS / LLM

AI-статьи недели с Хабра

Разборы, рецепты и инструменты по LLM и агентам, которые можно применить: о чём статья — что главное — что попробовать за вечер.

🗓 окно 2026-08-24 — 2026-08-31 ⚡ статей: 10 👀 на заметку: 4 📡 отсканировано: 300
📝 О чём пишут на этой неделе

Неделя получилась про выжимание того, что уже стоит: почти все сильные статьи не про новые модели, а про флаги, префиксы и кэш. Двумя RTX 3090 подняли генерацию с 32 до 75 токенов в секунду на тех же весах, одна строка со временем в начале системного промпта уронила попадание в кэш с 98% до 1%, а профиль обвязки под GigaChat добавил 9,8 пункта к решённым задачам и срезал 41% токенов. Второй сюжет — агент врёт там, где у него нет фактов: про распиновку вашей платы, про имена полей в базе, про соответствие резюме вакансии, и лечится это не моделью посильнее, а тем, чтобы подсунуть ей справочник и требовать дословную цитату. Отдельно порадовали две статьи про то, как всё ломается на стыке: ML-конвейер, который молча ходил в интернет за токенизатором, и MoE-модель, тормозившая из-за невключённого XMP в BIOS.

Главные статьи недели

01

Те же веса, пять флагов: с 32 до 75 токенов в секунду на двух RTX 3090

✍ Andrey Borodulin Хабр ⏱ ≈7 мин Искусственный интеллект Настройка Linux Компьютерное железо
О чём

Qwen3.8-27B на двух RTX 3090 из коробки выдаёт 32 токена в секунду, хотя две карты по 936 ГБ/с столько выдавать не должны. Автор разбирает узкое место по частям и доводит генерацию до 74,8 токена, не трогая веса. Каждый флаг описан одинаково: зачем, что писать, что даёт и где ломается, — то есть карточку можно перенести на свою сборку.

🔑 Главное
  • Вклады считаются по отдельности: MTP в послойном режиме даёт 32,4 → 58,5 ток/с, один -sm tensor без MTP — 48,2, вместе — 74,8 при 43,6 ГБ занятой памяти из 48.
  • Глубина черновика упирается в потолок: 2 → 52,8, 3 → 57,3, 4 → 57,6, 6 → 54,3 ток/с. Автор советует ставить 3 или 4.
  • Тензорный параллелизм тем выгоднее, чем длиннее контекст: на 240K — 55,4 против 34,4 ток/с, но обработка промпта на 40K падает с 1410 до 1121, то есть на 20%.
  • -c задаёт суммарный пул KV на сервер, а не длину запроса: -c 524288 --parallel 2 — это два слота по 262 144 токена, и два занятых слота дают 47,4 и 50,3 ток/с вместо 74,8.
  • Сборка кванта решает единицы процентов: bartowski Q6_K_L — 60,2 ток/с против 57,6 у unsloth Q8_0. Причину автор даёт гипотезой, а не замером: у bartowski блок MTP-головы лежит в Q4_0, у unsloth — в Q6_K. Прямого сравнения Q6 против Q6 в один день он не делал.
⚡ Попробовать за вечер
  • Поднять llama-server из образа ghcr.io/ggml-org/llama.cpp:full-cuda с -sm tensor и обязательным --ipc=host --shm-size=2g: без него первый же decode падает с CUDA error: unhandled system error.
  • Включить встроенную MTP-голову и задать пул KV: --spec-type draft-mtp --spec-draft-n-max 3 -ctk q4_0 -ctv q4_0 -ctkd q4_0 -ctvd q4_0 -c 524288 --parallel 2 -ub 256, затем сверить строку старта n_slots = 2, n_ctx_slot = 262144. Кэш черновика отдельный: -ctk/-ctv на него не действуют, и без -ctkd/-ctvd он останется в f16 и молча съест видеопамять.
  • Метрика: три прогона /completion с "cache_prompt": false и temperature: 0, сравнить predicted_per_second до и после флагов — отдельный бенчмарк не нужен.
Где придётся достроить Репозитория нет: дампер таблицы тензоров описан словами («полсотни строк на Python»), а набор задач на качество автор только описывает — 16 задач, 13/16 у всех четырёх сборок, — но ни ссылки, ни файлов не даёт и сам называет это дымовым тестом, а не бенчмарком. Числа сняты на двух RTX 3090 по PCIe 4.0 x16 и сборке 10666 — на x8 или x4 автор результат не проверял и говорит об этом прямо.
Шкала от 0 до 100 токенов в секунду: 32 из коробки и 75 после включения флагов из статьи
На картинке: шкала токенов в секунду с двумя отметками — 32 «из коробки» и 75 «те же веса, пять флагов», подпись стенда: llama.cpp, 2× RTX 3090, без NVLink.
02

Одна строка в начале системного промпта убивала кэш целиком

✍ Игорь Хабр ⏱ ≈4 мин Искусственный интеллект Python Open source
О чём

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

🔑 Главное
  • Токен из кэша дешевле не «немного»: у DeepSeek $0,44 против $0,014 за миллион, то есть в 31 раз; у OpenAI $4,00 против $0,40; у Anthropic $3,00 против $0,30.
  • Живой замер на DeepSeek: сборка live-broken даёт cache_hit=0 на всех четырёх вызовах, live-fixedcache_hit=1152 из примерно 1180 промпт-токенов начиная со второго вызова.
  • Виновник опознаётся глазами: system = f"Current time: {datetime.now()}...". После переноса времени в хвост доля кэшируемого префикса выросла с 1% до 98%, а общий префикс — с 8 слов до 730.
  • У Anthropic кэш покрывает tools, system, messages именно в этом порядке, поэтому схемы инструментов, собранные из словаря с плавающим порядком ключей, рвут префикс в первой же позиции. В коде промпта этого не видно.
  • В бенчмарке есть отрицательный контроль: короткий промпт даёт 0,0% → 0,0% и вердикт NO GAIN — инструмент честно говорит, когда чинить нечего.
⚡ Попробовать за вечер
  • Открыть системный промпт своего агента и убрать из первой строки время, UUID и прочую динамику в хвост. Это чинится вообще без инструментов и занимает десять секунд.
  • Если пользуетесь Claude Code, лог уже лежит на диске: pip install prefixcash, затем python -m examples.import_claude_code --out cc.jsonl и prefixcash report --file cc.jsonl. Адаптер переносит только поля usage, тексты промптов не читает.
  • Метрика: prefixcash diagnose --file calls.jsonl --session live-broken — смотреть строку cacheable prefix до и после правки; хватает двух вызовов в одной сессии, диагностика сравнивает соседние.
Где придётся достроить Сравнение «сломано против починено» снято только на DeepSeek; на своём трафике Claude Code автор показывает лишь итоговый хит-рейт — 97 877 вызовов, 32,5 млрд токенов, 98% из кэша. Суммы по OpenAI и Anthropic посчитаны по прайсу, а не сняты со счёта. Автор сам называет вторую поправку: запись в кэш у Anthropic дороже обычного токена в 1,25–2 раза, инструмент этого не моделирует и завышает экономию примерно на 2%. Готовый сбор логов есть под Claude Code и LiteLLM (там три строки колбэка); на голом OpenAI-совместимом SDK дописывать пять строк и ждать трафика. И ещё: команда python -m examples.import_claude_code стоит сразу после pip install, хотя сам файл автор показывает в репозитории — шага git clone в статье нет.
Терминал с отчётом prefixcash diagnose: cacheable prefix 1%, разрыв на dynamic_time из статьи
На картинке: отчёт prefixcash diagnose на живой сессии DeepSeek — cacheable prefix 1%, общий префикс 8 слов, виновник dynamic_time со значением 09:01:11. В тепловой карте зелёное пришло из кеша, красное рвёт кеш, а оранжевым помечены ещё 715 слов, потерянных после разрыва.
03

Обвязка вместо модели: профиль GigaChat в Deep Agents дал +9,8 пункта и −41% токенов

✍ Сергей Тращенков Хабр ⏱ ≈19 мин Искусственный интеллект Машинное обучение Блог компании Сбер
О чём

Команда не трогала веса модели, а переписала всё, что вокруг неё: системный промпт, описания инструментов и пять основных middleware (шестой подключается по надобности). Разбор полезен даже тем, у кого нет GigaChat: это готовый список того, обо что спотыкается агент на неидеальной модели, и как каждую поломку чинить текстом, а не дообучением.

🔑 Главное
  • На наборе из 391 задачи профиль поднял GigaChat 3.5 с 302/391 (77,2%) до 340/391 (87,0%), а GigaChat 3 Ultra — с 79,8% до тех же 87,0%.
  • Расход токенов упал с 7,37 млн до 4,32 млн, то есть на 41%: обвязка не только повышает качество, но и снимает холостые круги.
  • Показательная трасса: «переименуй oldname.txt в newname.txt» без профиля — 213 секунд и падение с GraphRecursionError: Recursion limit of 80 reached; с профилем — один вызов mv за 7 секунд.
  • Профиль двухслойный: 10 блоков системного промпта и переписанные описания семи встроенных инструментов задают инструкции модели, а перехватчики (middleware) гарантируют поведение уже кодом. Один из них, LoopBreaker, распознаёт пять сигнатур зацикливания.
  • Ограничение API, из-за которого пришлось менять архитектуру: SystemMessage должно быть строго одно и первым, вставка в середину диалога даёт 400 Bad Request, поэтому подсказки middleware уходят как HumanMessage.
⚡ Попробовать за вечер
  • Поставить профиль и ничего не менять в коде приложения: uv add deepagents-gigachat==0.0.3, дальше create_deep_agent() подхватит его сам через entry point.
  • Перенести к себе два фикса, даже не ставя пакет: дописать в описание edit_file требование срезать префикс <line_no>\t из вывода read_file, а в описание grep — уходить в терминал для регулярных выражений. Десять блоков системного промпта лежат открыто в deepagents_gigachat/prompts.py; файл с описаниями инструментов автор не называет, в статье есть только фрагмент описания edit_file.
  • Метрика: прогнать открытый harness-bench-fast на зафиксированном наборе задач v0.16.0 до и после подключения профиля и считать две величины — долю решённых задач и суммарные токены. Оценивать только детерминированными проверками (pytest, SQL, сверка XLSX), не LLM-судьёй.
Где придётся достроить Все замеры сделаны на закрытой модели, нужен доступ к GigaChat API, а про авторизацию и переменные окружения в статье нет ни слова. Универсального рецепта «как собрать профиль под свою модель» тоже нет — есть подробное описание готового. Команда запуска самого бенчмарка не приведена. Пин ==0.0.3 нужен ради воспроизводимости приведённых цифр: пока статью готовили, вышла 0.0.4 — и именно в абзаце про неё всплывает база 87,5%, с табличными 87,0% автор её нигде не сводит.
Чертёж архитектуры обвязки агента: системный промпт, shell safety, loop breaker и память вокруг ядра LLM из статьи
На картинке: схема обвязки в виде инженерного чертежа — вокруг ядра LLM четыре модуля (системный промпт, проверка shell-команд, детектор зацикливания, память), справа псевдокод цикла с проверками «Blocked by Shell Safety» и «Stopped by Loop Breaker».
04

Подключить модель к своим числам: Ollama, LibreChat и MCP вместо RAG

✍ Aigerim Rakhimova Хабр ⏱ ≈20 мин Искусственный интеллект IT-инфраструктура Open source
О чём

Путь от AnythingLLM через LibreChat к связке «локальная модель + MCP-сервер», записанный командами, а не лозунгами. Главная мысль спорная и полезная: для аналитики RAG не подходит принципиально, потому что похожий по смыслу кусок текста — не то же самое, что точное число.

🔑 Главное
  • Замер на одной виртуалке (Tesla T4, 4 vCPU, 16 ГБ): gemma4:e4b даёт 45,03 токена в секунду, 12b — 21,88, то есть примерно вдвое медленнее. Роли развели: маленькая на обкатку промпта, большая на рабочие сценарии.
  • Ключевое правило системного промпта: каждое число в выводе обязано иметь источник — либо конкретный ответ инструмента в этом же диалоге, либо расчёт, реально выполненный через Run Code.
  • describe_cube обязателен перед каждым query_cube: это единственный источник регистрозависимых имён полей. Сам query_cube по умолчанию отдаёт не больше 1000 строк (больше — лимитом в явном виде) и возвращает row_count и флаг truncated.
  • Размер контекста задаётся двумя слоями: дефолт зашивается в Modelfile (PARAMETER num_ctx 16384), а поверх переопределяется в librechat.yaml через addParams — там уже num_ctx: 32768 вместе с temperature: 0.3 и num_predict: 768.
  • Грабли безопасности: Ollama сначала слушала 0.0.0.0 и была доступна любому, кто знал адрес. Закрыли на 127.0.0.1 и поставили nginx, который сверяет заголовок Authorization и иначе отдаёт 401.
⚡ Попробовать за вечер
  • Поднять локальную модель и сразу замерить своё железо: curl -fsSL https://ollama.com/install.sh | sh, ollama pull gemma4:e4b, затем ollama run <модель> --verbose "тест".
  • Собрать именованную модель под задачу: Modelfile с PARAMETER num_ctx 16384, потом ollama create, а сервис донастроить через systemctl edit ollama с OLLAMA_KEEP_ALIVE=-1 и OLLAMA_HOST=127.0.0.1:11434.
  • Метрика: сравнить eval rate двух моделей на одном железе и отдельно посчитать долю ответов, где каждое число подтверждено вызовом инструмента, а не придумано.
Где придётся достроить Источник данных — XLTable, собственный продукт авторов. MCP-сервер у него есть, но в статье нет ни ссылки, ни репозитория, ни команды установки — достать его по тексту нельзя, так что свой придётся писать по двенадцатистрочному эскизу на FastMCP. Юнит ollama-warmup.service в тексте обещан, но блок кода под ним пуст. Главную работу автор называет сам — системный промпт, — но опубликована из него одна фраза. В примерах есть опечатки: в конфиге nginx стоит $httpauthorization вместо $http_authorization, в Python — if name == "__main__":.
Экран настройки агента xltable-agent в LibreChat с моделью, инструкциями и списком инструментов из статьи
На картинке: экран Agents в LibreChat: модель gemma4-12b-xltable:latest, в Instructions — роль агента и требование строго держаться протокола, не переставляя шаги и не пропуская проверочные вызовы (на экране по-английски), в Tools подключены Run Code, Artifacts и MCP-сервер xltable с четырьмя вызовами, в Skills — xltable-dashboards.
05

Отключили интернет — и ML-конвейер встал: кто всё это время ходил в сеть

✍ Ярослав Шмулев Хабр ⏱ ≈11 мин Искусственный интеллект Python IT-инфраструктура
О чём

Разбор того, какие популярные библиотеки молча ходят в интернет при первом вызове и почему это всплывает только в закрытом контуре. Читать стоит и тем, у кого нет закрытого контура: те же скрытые загрузки означают, что ваш прод зависит от чужого блоб-хранилища и падает вместе с ним.

🔑 Главное
  • tiktoken не автономен: файлы .tiktoken не входят в пакет и качаются с openaipublic.blob.core.windows.net, а кэш по умолчанию лежит не в ~/.cache, а в $TMPDIR/data-gym-cache. Он переживает перезапуск процесса, но не перезапуск пода.
  • Опасны конструкторы без явного имени модели: у FastEmbedEmbeddings() зашит дефолт BAAI/bge-small-en-v1.5, у HuggingFaceEmbeddings()sentence-transformers/all-mpnet-base-v2.
  • Поход в сеть спрятан за цепочкой вызовов, которую автор выписывает целиком: Chroma → HuggingFaceEmbeddings → SentenceTransformer → transformers → huggingface_hub. По строке Chroma.from_documents(...) в своём коде этого не увидеть.
  • fastembed тянет ONNX-модель либо с Hugging Face, либо из бакета Qdrant в Google Cloud Storage, и второй источник корпоративное зеркало HF не закрывает.
  • Переменные окружения устарели незаметно: TRANSFORMERS_CACHE в transformers v5 уже удалена, TRANSFORMERS_OFFLINE — устаревший синоним HF_HUB_OFFLINE. Актуальны HF_HOME, HF_HUB_CACHE, TIKTOKEN_CACHE_DIR, HF_ENDPOINT.
⚡ Попробовать за вечер
  • Запустить свой образ без сети: docker run --rm --network none my-ml-app:latest python -m app.smoke_test. Проверять не импорт модулей, а реальный сценарий — инициализацию клиентов, проход по документу и запрос к ретриверу: скрытые загрузки живут в первом вызове.
  • Собрать образ с прогретым кэшем: выставить ENV HF_HOME=/opt/hf-cache и TIKTOKEN_CACHE_DIR=/opt/tiktoken-cache, прогреть слоем RUN python -c "import tiktoken; tiktoken.get_encoding('cl100k_base')" и только после прогрева ставить HF_HUB_OFFLINE=1.
  • Метрика: тот же прогон с --network none должен дойти до конца — автор советует поставить его отдельным шагом в CI, тогда каждая новая скрытая загрузка валит сборку, а не прод.
Где придётся достроить Репозитория нет, и содержимое app/smoke_test.py описано словами — что именно туда класть, решать вам. Для tiktoken названо правило «имя файла в кэше — SHA-1 от URL источника», но ни команды вычисления, ни самого URL-источника не дано, а это самый неочевидный шаг. spaCy, NLTK и whisper только названы — офлайн-рецепта для них нет.
06

Модель уверенно врёт про вашу плату: лечится справочником с картой пинов

✍ Alexex14 Хабр ⏱ ≈5 мин Искусственный интеллект Программирование микроконтроллеров
О чём

Код компилируется с первого раза, заливается без ошибок, а на экране цветной шум: модель не знает распиновку конкретной платы и уверенно её выдумывает. Автор собрал скиллы с картой ресурсов под восемь плат. Сам он называет это нехваткой контекста, и тогда приём напрашивается везде, где у модели нет фактов, но есть уверенный тон.

🔑 Главное
  • У Waveshare ESP32-C6-LCD-1.47 дисплей и слот microSD сидят на одной шине SPI: MOSI (GPIO6) и SCLK (GPIO7) общие. Модель, не знающая этого, разведёт их по разным шинам, и работать не будет.
  • Контроллер ST7789 рассчитан на матрицу 240×320, а стекло обрезанное, 172×320 — драйвер обязан смещать область записи на 34 пикселя, плюс нужна инверсия цвета.
  • На Raspberry Pi Pico выводы GPIO23, 24, 25 и 29 существуют в коде, но физически отсутствуют на 40-пиновом разъёме. У ESP32 канал ADC2 занят Wi-Fi и при работающем радио возвращает таймаут.
  • Частота 100 МГц вместо нужных 96 молча убивает USB у STM32F411, а HAL_Delay() вешает плату, если вручную не определён SysTick_Handler.
  • Структура скилла трёхслойная и экономит контекст: короткая выжимка SKILL.md читается всегда, тяжёлые справочники из reference/ подгружаются по надобности, в template/ лежит полностью рабочий проект.
⚡ Попробовать за вечер
  • Поставить готовый скилл под свою плату: git clone https://github.com/alexex1993/mcu-skills.git, cd mcu-skills, затем ./scripts/install.sh --list и ./scripts/install.sh stm32f411-blackpill. В репозитории 8 плат — два STM32, четыре ESP32, Arduino Nano и RP2040.
  • Скопировать каталог скилла в .claude/skills/ внутри своего проекта прошивки и дописывать туда занятые ресурсы по мере находок — тогда знание версионируется в git рядом с кодом, а не живёт в голове.
  • Метрика: замеров в статье нет, так что мерить придётся самому — попросить агента сгенерировать прошивку под вашу плату до и после установки скилла и посчитать, сколько раз он ошибся с пинами, шиной и тактированием.
Где придётся достроить Измерений эффекта в статье нет вообще — только качественное «стало лучше», ни одного замера до и после. Автозагрузка скилла работает в Claude Code, для другого агента файлы придётся перепаковывать самому. Плат всего восемь, так что вашей там может не оказаться и справочник придётся писать с нуля — а примера содержимого SKILL.md в тексте нет, есть только описание слоёв.
Лог Claude Code: скилл rp2040-pico загружен, идёт поиск тактовой частоты из статьи
На картинке: лог агента — Skill(rp2040-pico) и Successfully loaded skill, следом поиск тактовой частоты в board-hardware и обращение к platformio.ini. Это и есть момент, когда агент берёт факты из справочника, а не выдумывает их.
07

MoE-модель тормозит: чек-лист из трёх шагов, и первый — в BIOS

✍ MaDeLa Хабр ⏱ ≈8 мин Искусственный интеллект Linux Open source
О чём

Вы запускаете большую MoE-модель через llama.cpp, а скорость в разы ниже ожидаемой. Три места, куда смотреть по порядку: скорость оперативной памяти, размещение слоёв и привязка потоков к ядрам. Полезно тем, что самая частая причина оказывается вообще не в настройках инференса.

🔑 Главное
  • Иерархия узких мест объясняет всё остальное: 504 ГБ/с у видеопамяти RTX 4070 против 96 ГБ/с теоретического пика двухканальной DDR5-6000. Разрыв по паспортным цифрам примерно пятикратный, причём реальная скорость оперативки, как оговаривает автор, ещё ниже.
  • Включение XMP восстановило скорость генерации MoE «примерно с одной трети от нормального уровня». Невключённый профиль XMP или EXPO стоит первым в списке трёх причин — раньше любых настроек запуска.
  • На i5-12600K ядра 0–11 это P-ядра, 12–15 — E-ядра. Исключение E-ядер из набора потоков дало 20–30% скорости там, где упирались в процессор. Шаг только для Linux: на Windows автор советует его пропустить и отмечает, что производительность там по его замерам в среднем на 15–20% ниже.
  • Ловушка --override-tensor: шаблон только по *_exps не заденет ffn_*_shexp — общий эксперт, который активен всегда, останется в видеопамяти.
  • Предупреждение по --n-cpu-moe: если модель весит около 60 ГБ, попытка отправить всех её экспертов в оперативку при 64 ГБ RAM кладёт систему целиком.
⚡ Попробовать за вечер
  • Проверить память первым делом: sudo dmidecode -t memory | grep -E "Speed|Configured" и сравнить Configured Memory Speed с паспортной скоростью планок. Не совпало — включить XMP или EXPO в BIOS.
  • Получить готовую строку запуска вместо автоподбора: llama-fit-params -m model.gguf -fitt 1024 -fitc 65536 вернёт связку -c, -ngl и -ot, которую можно зафиксировать в скрипте — фиксированные параметры стартуют мгновенно, а зондирование добавляет к старту обычно 1–5 секунд, на очень больших моделях и больше десяти.
  • Метрика: прибить потоки к P-ядрам через taskset -c 0-11 llama-server ... (диапазон уточнить по lscpu -e) и сравнить токены в секунду до и после.
Где придётся достроить Это перевод и адаптация чужой статьи, и автор сам оговаривает, что объём оперативной памяти на стенде между экспериментами менялся. Таблицы «до и после» в токенах в секунду нет вообще — только проценты, а полные бенчмарки вынесены в 52-страничный справочник на Яндекс.Диске, репозитория нет. Рецепт привязан к Linux, гибридным Intel 12-го поколения и новее и картам NVIDIA; имена тензоров зависят от архитектуры, а как посмотреть структуру своего GGUF, не показано.
08

Растянуть окно контекста: готовые значения YaRN по моделям

✍ Антон Васильев Хабр ⏱ ≈15 мин Машинное обучение Искусственный интеллект
О чём

Почему модель не видит дальше обученного окна и как это чинится масштабированием RoPE. Ценность не в теории, а в том, что автор даёт готовые значения множителей под конкретные модели и честно считает, во что растянутое окно обойдётся по памяти.

🔑 Главное
  • Готовые множители: Qwen3.8-27B и Qwen3.8-Flash-Next — factor: 4.0 (262K → ~1M); у Qwen3.5-4B практичнее factor: 2.0, потому что миллион у четырёхмиллиардной модели на практике нерабочий.
  • partial_rotary_factor считается из устройства слоя, а не угадывается: размерность головы в Gated DeltaNet равна 256, RoPE применяется к 64 из них, отсюда 64/256 = 0,25.
  • Цена в памяти посчитана таблицей: у Qwen3.8-27B KV-кэш в FP16 — примерно 17,2 ГБ на 262K и 68,7 ГБ на 1M, потому что полных слоёв внимания всего 16 из 64.
  • Gemma 4 — исключение: sliding-слои видят только 512 токенов, за дальнюю память отвечают 7 глобальных слоёв со своим RoPE, и YaRN здесь просто не тот инструмент — получится двойное масштабирование.
  • Правило выбора: если задача звучит как «примени простое действие к каждому куску», берите маленькую модель и растягивайте окно; если нужны слова «сопоставь» или «сделай вывод из всего документа», экономия на KV-кэше того не стоит.
⚡ Попробовать за вечер
  • Растянуть окно в llama.cpp одной строкой — у MiniCPM5-1B множитель 4.0 превращает нативные 131K в 524K: llama-server -m MiniCPM5-1B-Q4_K_M.gguf --ctx-size 524288 --rope-scaling yarn --yarn-orig-len 131072 --rope-scale 4.0 --flash-attn --cache-type-k q8_0 --cache-type-v q8_0. Квантование KV в Q8 режет кэш вдвое против FP16, Q4 — примерно вчетверо.
  • Ограничить агента, чтобы размышления не съели расширенное окно: для Qwen3.8-27B автор советует резать рассуждения на 262K, а финальный ответ на 131K.
  • Метрика: прогнать свою задачу на растянутом и исходном окне и сверить ответы. Готового порога автор не даёт, он лишь советует подбирать factor под свои задачи.
Где придётся достроить Ни одного замера качества после растяжения в статье нет: автор советует подбирать factor под свои задачи, но сам не приводит ни NIAH, ни RULER, ни цифр «до и после». Требование «обязательно проверить качество на своих данных» сказано узко — про ручное переопределение слоёв Gemma 4 в transformers, а как это сделать послойно, не показано. Репозитория и готового файла конфигурации тоже нет: конфиги даны фрагментами, а где брать GGUF-сборки под названные модели, не сказано вовсе — ни ссылки, ни имени репозитория.
09

Три способа подключить LLM к базе на 253 таблицы: в прод ушёл самый наивный

✍ n_cto Хабр ⏱ ≈10 мин Машинное обучение SQL Управление разработкой
О чём

Спор «MCP или schema linking или вся схема в промт» разрешили замером на живой базе из 253 таблиц вместо аргументов уровня «мне кажется». Полезна не столько таблица результатов, сколько сама процедура: правила зачёта зафиксированы до прогонов, сравниваются наборы строк, а не тексты запросов. А заодно выясняется, что чаще всех ошибалась не модель.

🔑 Главное
  • Стенд: MSSQL, 253 таблицы, 3550 колонок, самая широкая — 274 колонки, и всего 3 записи с описаниями полей. Модель MiniMax-M2, температура 0, по три попытки на вопрос.
  • Результат по трём веткам (время — медиана задержки): MCP-инструменты — 13,8% с первой попытки и 37,9% с трёх, 104 с, 4,76 ₽ за вопрос и 24,5 вызова инструментов; schema linking — 31,0% и 55,2%, 43 с, 0,39 ₽; «вся схема в промт» (58 727 токенов) — 24,1% и 58,6%, 22 с, 3,30 ₽.
  • Наивный вариант оказался вдвое быстрее schema linking и впятеро быстрее MCP: два последовательных вызова модели проигрывают одному, даже когда контекст в 20 раз больше. По точности автор победителя не объявляет — разрыв в один вопрос он сам называет шумом, а в прод ветку выбрал за скорость и простоту.
  • Разметка тоже врёт: судья-разметчик ошибся трижды на 29 эталонов, и ошибку в 77 раз (432 вместо 33 434) поймала не перекрёстная проверка, а проверка на бизнес-инвариант.
  • Восемь вопросов не взял никто, и три из них упираются в семантику, которая живёт в коде приложения, а не в базе. Мини-тест «данных в базе нет» провалили все три ветки со счётом 0 из 3: каждая уверенно выдала исполнимый SQL по пустым колонкам.
⚡ Попробовать за вечер
  • Собрать золотой набор из 20–30 реальных вопросов аналитиков и эталонный SQL к каждому, подтверждённый вторым независимым запросом и проверкой на бизнес-инвариант вроде «в стране с тысячами пользователей не может быть ноль активных партнёров».
  • Прогнать свои ветки в одинаковых условиях: температура 0, три попытки на вопрос, единый шаблон обратной связи после неудачи, а сравнивать наборы строк, а не текст запроса, как это делают в Spider и BIRD. Наивный baseline «вся схема в промт» обязателен.
  • Метрика: точность с первой и с третьей попытки, медианная задержка и рубли за вопрос. Прикидка на своих числах делается до прогона: «размер схемы в токенах × цена input × среднее число попыток» против цены и задержки второго вызова модели.
Где придётся достроить Ни репозитория, ни строчки кода, ни текстов промптов: они обещаны «в первом комментарии», а вопросы и схему автор не выкладывает по NDA. Эталоны строил агент на Claude, а не человек, и трижды ошибся. Все цифры сняты за один прогон одной модели, и автор прямо предупреждает, что на Claude или GPT-4 арифметика будет другой — переносить стоит метод, а не проценты.
10

LLM-судья вместо косинуса: точность подбора выросла с 44 до 66%

✍ Иван Кузнецов Хабр ⏱ ≈11 мин Машинное обучение Natural Language Processing Поисковые технологии
О чём

Замена косинусной близости на LLM-судью в подборе кандидатов, доведённая до продакшена вместе с измерениями. Главное здесь не сам приём, а оснастка вокруг: детерминированный валидатор цитат и перестановочный тест, которые ловят самообман раньше, чем он доедет до прода.

🔑 Главное
  • Строгая точность топ-10 выросла с 43,7% (83 из 190 у чистого векторного поиска) до 66,3% на боевой конфигурации. Тендерные 65,8% сняты на замкнутом наборе, а пересчёт на живом пуле дал 63,7% — эту поправку автор находит у себя сам.
  • Тендер четырёх моделей на 476 парах развёл качество и честность: gpt-5-mini — 65,8% точности при всего 6,5% цитат, не найденных в резюме дословно, и $4,77 за прогон; gpt-4.1-mini — сопоставимые 64,2%, но 27,2% цитат мимо текста. Разбор руками показал, что выдуманных фактов среди расхождений почти нет: модель цитирует по памяти — меняет глагол на синоним, склеивает два пункта списка.
  • Валидатор цитат работает без нейросети: вхождение подстроки после нормализации пробелов и регистра, при доле совпадения от 0,85 подмена на настоящий кусок текста, всё остальное выбрасывается. Порог годности конфигурации — 90% выживших цитат у обязательных требований.
  • Именно этот порог зарубил соблазнительную экономию: урезание глубины рассуждений прошло все метрики качества (65,3% против 65,8% при вдвое меньшей цене), но выживаемость цитат упала до 86,8%, и валидатор выбросил 716 цитат вместо 365.
  • Перебор 1330 комбинаций весов доказал, что взвешивание не нужно: 95-й перцентиль подгонки на перемешанных метках — 46,8%, а разница между взвешенной суммой и простой сортировкой лежит в пределах от −2,6 до 0,0 пункта. В прод ушла сортировка по одной шкале с нулём подогнанных параметров.
⚡ Попробовать за вечер
  • Заморозить эталон до любых улучшений: разметить пары «запрос — документ» тремя вердиктами («подходит», «пограничный», «мимо»), поставить дату заморозки и привинтить тест, который падает, когда базовые числа перестают воспроизводиться.
  • Переписать промпт судьи под строгий JSON: оценки 0–100, чек-лист требований со статусами и обязательная дословная цитата до 200 символов на каждый пункт; нет подтверждения — source = null и статус не выше «частично». Поверх — валидатор вхождения подстроки.
  • Метрика: перестановочный тест — перемешать метки эталона 1000 раз, повторить свой перебор на каждом перемешивании и взять 95-й перцентиль как потолок подгонки на чистом шуме. Если прирост ниже этого потолка, его нет.
Где придётся достроить Репозитория нет, полного текста промпта судьи тоже — он пересказан по пунктам, дословно приведена одна фраза. Для валидатора названа доля совпадения 0,85, но не сказано, каким алгоритмом сходства она считается; модель эмбеддингов и векторное хранилище не названы. Автор честно предупреждает, что проценты не переносятся: один разметчик, 19 вакансий, доверительные интервалы широкие и краями перекрываются.
💬

На что обратить внимание

Статьи и темы, которые стоит держать в голове, но в готовый рецепт «попробовать вечером» они не складываются.

🧱 Полная сборка llama.cpp под Windows и RTX 3090

✍ Q3_ResultsХабр⏱ ≈34 мин

Пошаговая инструкция от установки CUDA Toolkit и MSVC до запуска llama-server, с таблицей квантов под 24 ГБ: Q4_K_M — 16–17 ГБ, Q6_K — 22 ГБ, Q8_0 уже не влезает. В карточки не пошла из-за пересечения с разбором флагов выше и расхождения внутри самой статьи: в команде стоит -ngl 999, а в её же разборе — -ngl 99.

Читать ↗

🔖 Закладка, считающая скорость GGUF на Hugging Face

✍ AlexeyХабр⏱ ≈6 мин

Букмарклет дорисовывает к карточке модели расчётные токены в секунду и максимальный контекст по каждому кванту, читая заголовок GGUF range-запросом на 400 КБ вместо скачивания весов. Идея хороша, до карточки не дотянула: константы оверхеда и резерва откалиброваны под одну RTX 3070 и три модели, способа померить их для своего железа статья не даёт, MoE формула не считает вовсе, а автор сам называет результат «баловством» и допускает, что подогнал его.

Читать ↗

📉 Лимиты Claude Code падают 31 августа

✍ Жемал ХамидунХабр⏱ ≈14 мин

Промо-надбавка +50% к недельным лимитам заканчивается, остаётся 67% привычной ёмкости. Из практичного: множители нового токенизатора (обычные промпты ×1,373, а CLAUDE.md ×1,445, и он читается в начале каждой сессии) и поле model во frontmatter субагентов, которым массовые механические прогоны переводят на модель подешевле. Переменную окружения для подключения стороннего провайдера автор не назвал, а половина текста устареет вместе с дедлайном.

Читать ↗

📐 Метрики оценки LLM, RAG и агентов

✍ ИльяХабр⏱ ≈7 мин

Разбор пяти независимых измерений качества ответа и разделения ошибок RAG на retrieval и generation: если документ не нашёлся — одна причина, если нашёлся, а модель ответила своё — совсем другая. Рамка полезная, но до карточки не дотягивает: числа автор сам называет условными, а самое практичное (золотой набор, калибровка судьи, проверка вызовов инструментов) вынесено в платный курс.

Читать ↗
🎯

Мой план на эту неделю

Из всех статей выше — три, по которым реально что-то сделаю. Не «прочитать», а внедрить.

Сделать: открыть системный промпт своего агента, убрать динамику из первой строки и прогнать prefixcash diagnose по логам — сверить долю кэшируемого префикса до и после
до среды
Сделать: запустить свой ML-образ через docker run --network none с реальным сценарием, а не импортом, и выписать всех, кто полез в сеть
до пятницы
Сделать: включить -sm tensor и --spec-type draft-mtp на своей сборке llama.cpp и замерить predicted_per_second тремя прогонами
до воскресенья
#

Метаданные

сгенерировано 2026-08-31T06:47:42Z
окно 2026-08-24 — 2026-08-31 (7 дней)
отсканировано / в дайджест 300 / 14
источник Habr, постраничный API (хабы: Искусственный интеллект, Машинное обучение, NLP / LLM, плюс «Лучшее за неделю»)
отбор 236 AI-кандидатов по сохраняемости → 32 полных текста → 10 карточек, каждая с уликой из текста и проходом на опровержение
пропущенные ленты нет
×
Открыть статью