Обновить
560.37

Python *

Высокоуровневый язык программирования

Сначала показывать
Порог рейтинга

Как выбрать гиперпараметры для xgboost?

Настройка параметров модели
Настройка параметров модели

Всем привет! Мой жизненный путь в сфере технологий начинался с машинного обучения для финансовых моделей и привел меня к data scientist в IT-компании. Решил написать свою первую статью и затронуть важную тему, которой обычно мало кто придает значение. Многие, работая над моделью, сталкиваются с тем, как правильно выбрать гиперпараметры. Обычно, это делается методом перебора по сетке с байесовской оптимизацией. Так я и делал раньше и не задумывался, что в этом есть какая-то проблема. Благо, у меня был хороший учитель, который обратил внимание на этот незначительный момент.

1. Так в чем, собственно, проблема?

Перебирая по сетке с байесовской оптимизацией вы позволяете поиску выбирать за вас и все, казалось бы, решено. Но хотелось бы объяснить, как именно адаптировать модель под новый датасет, чтобы это соответствовало именно вашим характеристикам. Конечно, настройка гиперпараметров не так важна, как разработка алгоритмов обнаружения. Но если вы не понимаете математику, которая лежит в основе модели, то не увидите, как работают алгоритмы и все будет наугад. В данной статье я хочу представить вам самый простой способ, как достичь идеальных гиперпараметров, а не просто плыть по течению.

Основная мысль:

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

2. Как настроить гиперпараметры так, чтобы не тратить время и добиться нужного результата практически сразу?

Схема довольно простая

eta=0.1
max_depth=10
subsample=1.0
min_child_weight=5
col_sample_bytree=0.2
objective='reg:linear'

Далее, делим на 20% данные для проверки и делаем список значения обнаружения для обучения и тестирования.

num_round=1000000
  • Можно поэкспериментировать с уровнем глубины. Начать с max_depth=10. При ошибки выше, чем на обучении - можно ставить 12, если ниже - ставим 5.

  • Когда определился с глубиной, то настраиваю параметр субдискретизации. Начинаю с 1.0, меняю его на 0.8. Если ошибка выше, то - 0.9 или 1.0

  • Настраиваю так же min child_weight и col_sample_bytree.

  • Eta уменьшаю на 0.05.

Оставляю программу работать и получаю оптимальный num_round. Использую эти параметры как базу, дополняя ее небольшими экспериментами.

Заключение.
Надеюсь, вам были полезны мои мысли и находки. И хотя гиперпараметры не идеальные, но такая настройка очень близка к самому лучшему результату, который только может быть. Поделитесь своими идеями по настройке гиперпараметров. Я могу лишь дополнить свой способ рассуждениями моего первого учителя и вдохновителя https://youtube.com/@realmikemozg?si=jEe52LlzSBfVDGed

Теги:
+2
Комментарии0

Учим Python — представлен интерактивный учебник, который работает прямо в браузере. Он поможет освоить базу буквально за пару месяцев:

  • Больше 100 заданий — основы для понимания основных концепций языка, беглого кодинга программ и выстраивания логики сервисов.

  • Примеры кода — не просто теория, анужно решать задачи сразу после прочтения материала.

  • Есть текстовые материалы, вшитые YouTube-уроки, задачи, дополнительные лекции и контрольные вопросы.

Теги:
+2
Комментарии2

Раздолбайский дух Sanic.

Как выглядела версия 18.12.0
Как выглядела версия 18.12.0

Обновлял свои сэмплы простеньких API-сервачков. Версия на Sanic отказывалась работать, так что закатал рукава и пошёл читать их маны. Захожу на сайт, а тут... Батюшки! Всё чинно, благородно, серьёзно так. Я отлично помню, что рисовал их дебаг в консоли. Эх, куда дели раздолбайский дух? :)

Теги:
+1
Комментарии0

5 случаев, когда Fine-tuning лучше RAG

Все говорят "RAG для всего". Но есть кейсы, где fine-tuning выигрывает — и это не только про статичные данные.
Все говорят "RAG для всего". Но есть кейсы, где fine-tuning выигрывает — и это не только про статичные данные.

Все говорят "RAG для всего". Но есть кейсы, где fine-tuning выигрывает — и это не только про статичные данные.

1. Жёсткий формат вывода

Бот для CRM должен всегда возвращать:

{"name": "...", "phone": "...", "intent": "..."}

RAG не гарантирует формат. Fine-tuning — да. Модель "запоминает" структуру на уровне весов.

2. Доменный жаргон

Врач пишет: "в/в капельно NaCl 0.9% 400мл". Юрист: "п.1 ч.2 ст.158 УК".

RAG найдёт документ, но не научит модель "говорить на языке". Fine-tuning встраивает терминологию в модель.

3. Логика без документов

Расчёт стоимости доставки: вес, габариты, зоны, сезонность, тип клиента — 20 переменных.

Это не в документе, это в голове логиста. Fine-tuning переносит экспертизу в модель.

4. Стиль эскалации

Банковский бот не должен говорить "не знаю". Только: "Уточню у специалиста, ожидайте".

RAG учит контенту, fine-tuning — поведению и тону.

5. Скорость

RAG: эмбеддинг → поиск → генерация = 3 вызова, ~2 сек.

Fine-tuned модель: 1 вызов, ~0.5 сек.

Для голосового бота или real-time чата — критично.

Когда всё же RAG: данные часто меняются, нужны ссылки на источник, конфиденциальность.

Гибрид работает: fine-tuning для формата и стиля + RAG для актуальных данных.

А вы где использовали fine-tuning?

Теги:
+1
Комментарии2

пет-проект невозможно доделать - только выпустить в открытую бету

Что ж, встречайте открытую бету проекта

📚📚📚📚📚📚📚📚📚📚
SweetReader!
📚📚📚📚📚📚📚📚📚📚

Что это:
Пространство для авторов и читателей, упор сделан на книги с высоким уровнем визуала (графические романы, комиксы, манги, книги с упором на иллюстрации). 

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

На текущий момент это MVP - буквально базовая версия продукта, есть планы по его доработке и даже (о, ужас) "дорожная карта", которую, может быть, я реализую )))

_____

Должен упомянуть, что автор идеи и базового дизайна, которые я впоследствии доработал - Семён Диваченко.

Буду рад обратной связи тут в комментариях. Если найдёте баг или ошибку (а это на текущей стадии несложно), в меню есть кнопка "Ошибка?" специально для неравнодушных пользователей.

Теги:
-2
Комментарии0

Обновлён проект Python Scripts, где более 60 Python-скриптов для любых задач, включая алгоритмы по парсингу, работе с видео и фото, клонированию сайтов, скачиванию с сайтов и другие популярные решения.

Ранее был представлен учебный проект «Числа Python, которые должен знать каждый программист» (Python Numbers Every Programmer Should Know). Проект также доступен на GitHub.

Теги:
-3
Комментарии1

Представлен учебный проект «Числа Python, которые должен знать каждый программист» (Python Numbers Every Programmer Should Know). Проект также доступен на GitHub.

«Существуют цифры\числа\значения, которые должен знать каждый программист на Python. Например, насколько быстро или медленно добавляется элемент в список в Python? А как насчёт открытия файла? Это занимает меньше миллисекунды? Есть ли что‑то, что замедляет этот процесс? Если у вас есть алгоритм, чувствительный к производительности, какую структуру данных следует использовать? Сколько памяти занимает число с плавающей запятой? А как насчёт одного символа или пустой строки? Насколько быстр FastAPI по сравнению с Django? Я хотел бы уделить немного времени и записать показатели производительности, специально ориентированные на разработчиков Python», — сообщил автор проекта Майкл Кеннеди.

Теги:
+7
Комментарии2

Тестирую Claude Code на написание белых модов к игре.

Процесс: обсуждение, сбор данных по структуре игры и установке модов, написание кода и деплой.

С первым модом для WoT справился. Тестирую дальше. Кому-то полезна будет потом информация о процессе, выкладывать или лишнее?

Теги:
+1
Комментарии4

Всем привет!

В этом посту я хочу подвести итоги года.

Во первых всех с наступающим ^-^.

Во вторых в этом году я познал НАМНОГО больше чем в прошлом году.

К примеру - познал что батарея без своего разъёма - это очень плохо.

В этом году я сделал много проектов и до сих пор делаю их:

  • "ЛИСП машина" - мой первый по настоящему крутой проект.

  • Микрокомпьютер с GUI - для меня это был крутой проект из-за попытки реализовать GUI.

  • Компилятор pycc - хоть и не компилирует в машинный код, но для меня это вершина в моём "языкописательстве" (поправьте если что).

  • Ядро Pech - бета скоро станет 2.0.0. Почему так резко? PEF должен был быть с первого релиза но, я не люблю терпеть и выложил без PEF (к моменту выпуска я уже был полностью погружен в создание PEF).

  • Ядро PearKernel - первые попытки соорудить своё ядро.

Также делаю свою ОС на ядре Pech.

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

Желаю вам в следующем году побольше крутых проектов, денег на эти проекты и на жизнь, больше знаний и... Вообще надеюсь чтобы вы отметили этот новый год на отлично.

Кстати как и просили. Пример кода на PEF:

[HEADER]
prio:2
pid:1
name:TEST
[ATTRS]
x:0
[PROG]
while True:
    print(x)
    x += 1
    await asyncio.sleep(SLEEP_TIME) #0.020 секунд (20 мс.)

А проще:

[HEADER]
prio:ваш приоритет.
pid:ваш pid (уникальный).
name:имя вашего процесса.
[ATTRS]
имя:любое значение (В ОДНУ СТРОКУ!)
[PROG]
ваш код

Данный пост хотел закинуть в "Я пиарюсь" но карма не позволяет.

Всем удачи!

Теги:
+3
Комментарии4

Представлен открытый проект на Python под названием Reverse API engineer. Это консольный инструмент, который фиксирует трафик браузера и автоматически генерирует готовые к работе клиенты Python API. Больше никакого ручного реверс‑инжиниринга — просто просматривайте, записывайте и получайте чистый API‑код.

«Этот инструмент выполняет код локально, используя Claude Code‑ пожалуйста, следите за выводом/ На некоторых веб‑сайтах используется расширенная система обнаружения ботов, которая может ограничивать захват или требовать ручного взаимодействия», — пояснил автор проекта.

Особенности Reverse API:

  • автоматизация браузера: создан на базе Playground с режимом скрытности для реалистичного просмотра;

  • режим автономного агента: полностью автоматизированное взаимодействие с браузером с помощью агентов искусственного интеллекта (автоматический режим с MCP, использование браузера, stagehand);

  • запись HAR: фиксирует весь сетевой трафик в архивном формате HTTP;

  • генерация на основе искусственного интеллекта: использует Claude 4.5 для анализа трафика и генерации чистого кода на Python;

  • поддержка нескольких SDK: встроенная интеграция с Claude и OpenCode SDK;

  • интерактивный интерфейс командной строки: минималистичный интерфейс терминала с переключением режимов (Shift+Tab);

  • готовность к работе: сгенерированные скрипты содержат обработку ошибок, подсказки по вводу текста и документацию;

  • история сеансов: все запуски сохраняются локально с полными журналами сообщений;

  • отслеживание затрат: подробное использование токенов и оценка затрат с поддержкой кэширования.

Теги:
+1
Комментарии0

Я создал обвязку вокруг Pywikibot для простой загрузки файлов в Wikimedia Commons: https://gitlab.com/vitaly-zdanevich/pwb_wrapper_for_simpler_uploading_to_commons

Stateless, позволяет загружать по одному файлу и все из текущей папки (для поддерживаемых расширений). Примеры синтаксиса:

upload.py --file my.jpg --source https://example.com --license 'PD-old' --category 'Sunsets in Batumi' --date '2025-12-27' --desc 'A beautiful sunset from the beach' --target myrenamed.jpg

Либо например

upload.py my.jpg --category 'Sunsets in Batumi' --date '2025-12-27'

Я туда много загружаю - мы живём в горящей библиотеке, и мне важно спасти побольше данных. Базовый загрузчик (Upload Wizard) в браузере так себе. Существуют и прочие инструменты загрузки в Commons, и это мой третий инструмент для этой задачи - уже был скрипт для gThumb и браузерное расширение.

Только этим своим новым скриптом загрузил уже сотни файлов. Вам теперь тоже ещё легче будет спасти какие-нибудь сканы старых газет - помните что в Commons можно загружать только файлы со свободной лицензией - например когда автор умер более 70 лет назад.

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

Теги:
0
Комментарии0

Перевел почти всё на Grok 4.1 с декабря не смотря на ажиотаж в других моделях.
1. Дешево за большой контекст
2. Code execution дает возможность дешево анализировать данные
3. Реальные расходы токенов на задачи уровня flash и mini моделей, но качество заметно лучше
4. Хорошо следует схемам
5. Контекст 2M

Экономия в 3-4 раза с Claude Sonnet.

Где использовал:
HR-тематика: массовая обработка резюме и вакансий
Анализ данных, поиск информации

  • Claude Sonnet: $3 / $15 за 1M токенов (input/output)

  • Grok 4.1 Fast: $0.20 / $0.50 за 1M токенов

Использую Grok 4.1 Fast для простых задач и 4.1 Fast Reasoning когда нужно "подумать".

Расскажите в комментариях, на каких моделях работаете и для каких задач?

Теги:
-3
Комментарии3

IMPulse - Open Source менеджмент инцидентов. Freeze, Jira, ChatOps

Прошло достаточно времени с прошлой публикации: мы добавили много нового и хотим поделиться этим и нашими планами.

Из нового

  • У нас появился механизм Freeze, который выполняет пару задач. С одной стороны он отключает уведомления по инциденту на некоторое время, например на выходные. С другой - исключает создание таких же инцидентов на время "заморозки". Этот функционал похож на Silence Alertmanager'а.

  • Появилась интеграция с системой трекинга задач, Jira.

  • Теперь есть возможность просматривать закрытые (архивные) инциденты.

  • Добавлены метрики.

  • IMPulse теперь можно запускать в нескольких экземплярах. В случае недоступности основного (primary) инстанса, работу подхватит запасной (standby).

  • Webhook'и стали ещё мощнее. Теперь с их помощью можно очень гибко формировать JSON для отправки в любую сторонюю систему.

  • Появилась интеграция с алертами из Grafana.

  • IMPulse научился перечитывать (reload) конфигурацию без полной перезагрузки. Также вы можете добавить проверку конфигурации в CI/CD перед её применением.

  • В UI теперь есть индикатор online / offline, чтобы понимать, актуальная ли сейчас информацию на экране. К слову, несмотря на внешнюю простоту, UI очень гибок: умеет фильтровать инциденты по лейблам (в качестве фильтров можно использовать regex'ы), можно сортировать инциденты по нескольким столбцам, а также выделять цветом интересующие данные.

  • В случае заполнения диска, IMPulse теперь продолжит работать. Обновления по инцидентам будут храниться в оперативной памяти пока не появится место на диске. Настройте алерты на ERROR логи, чтобы вовремя среагировать.

Планы

В первой статье я уже упоминал, что мы считаем крайне важным для всех, кто работает с инцидентами, иметь общий контекст. Многие решения при проектировании принимались, исходя из этого. Сейчас можно констатировать, что ChatOps стал основой IMPulse и дальнешее движение будет под этим знаменем. Мы будем глубже интегрироваться с мессенджерами, чтобы команде дежурных / devops'ов не нужно было переходить в UI. Да, обязательно останутся задачи, которые не решить в рамках мессенджера, но мы постараемся минимизировать их количество.

Здесь часть из наших планов на ближайшие пару месяцев:

  • добавить работу с группами в Slack и Mattermost;

  • добавить в UI механизм аутентификации;

  • перенести кнопки для работы с инцидентами в UI;

  • реализовать механизм подавления инцидентов на основе правил по аналогии с Inhibition в Prometheus. Если согласно правилам инцидент становится дочерним, то уведомления по нему прекращаются пока не будет решена основная проблема. Это позволит уменьшить количество активности по инцидентам.

По поводу других новшест мы пока сохраним интригу!

Критика и советы

Мы растём, решаем всё больше проблем, но конечно же всегда остаются незакрытые потребности. Будем рады услышать, чего не хватает лично вам и постараемся с этим помочь. Особенно интересно услышать мнение людей, которые ищут куда мигрировать с Grafana OnCall. Мы открыты к обратной связи и критике, будем рады услышать замечания. Наша задача - стать лучше благодаря сообществу.

Оставайтесь с нами в Telegram - мы используем его для общения с русским сообществом, следите за обновлениями в GitHub. Мы продолжаем!

Предыдущие публикации

Теги:
-1
Комментарии0

Ближайшие события

Всем привет!

Сегодня был выпущен релиз Pech 2.0.0 BETA!

Основные изменения:

  1. Новый формат написания: PEF (Pech Executable File):

    Этот формат был сделан с целью упростить написания

    кода и работы с переменными.

Мало да? Ну это же бета :-).

Также не основные изменения (это не грандиозно, но нужно):

  1. Выяснилось, что моё ядро с функциями НАМНОГО медленнее

    чем с exec и compile (с exec минимум на 10 тыс. задачах 10.7 мс!)

  2. Выяснилось, что нужно будет сделать кэширование для процессов.

Планы на будущее:

Сделать кэширование.

Сделать кучу серверов.

Да этого мало, но эти изменения пригодятся.

Удачи!

Теги:
-3
Комментарии2

Как разделить строку в Python: «split()» и альтернативы для разработчиков и аналитиков данных

Разделение строк — рутина для разработчиков и аналитиков: парсинг CSV, обработка логов, пользовательского ввода. Подготовили подробный обзор, где разобрали, как работает «split()» (включая «sep» и «maxsplit»), когда выбирать «partition()/rpartition()», «splitlines()», преобразование в список символов и «re.split()» для сложных правил. И добавили практические примеры, где и какой подход удобнее и надежнее применять.

Подробную инструкцию смотрите в базе знаний Рег.облака.

Теги:
+1
Комментарии0

Еще один вариант маршрутизации трафика через два сетевых интерфейса на основе списка доменных имен.

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

Краткое содержание: ставим локальный dns resolver с плагином на python, который, при разрешении имени в адрес, устанавливает маршрут через альтернативный интерфейс, если адрес соответствует регулярному выражению. Для использования решения требуется умение сконфигурировать и запустить сервис в вашем любимом дистрибутиве/сервис-менеджере, готового пакета для установки нет.

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

Для реализации идеи нужен ДНС сервер, который позволяет достаточно просто писать плагины/хуки. Первым попавшимся на глаза был PowerDNS Recursor, который позволяет писать плагины на lua. И первая реализация была для него. Но lua это больше про компактность, чем про удобство, например, поддержку регулярных выражений можно так назвать только из вежливости. Тем не менее, всё работало как предполагалось, и достаточно надежно, пока не был найден Unbound DNS который позволяет писать плагины на python, и, в итоге, был написан аналог на питоне, который и предлагаю вашему вниманию.

Все файлы доступны на github. Файлов всего 5 и все достаточно короткие.

Файл reroute.conf: пример файла конфигурации ДНС сервера. 192.168.0.1 и 172.16.17.1 — это адреса маршрутизаторов для первого и второго интерфейсов, соответственно. /etc/unbound/reroute.py — собственно плагин выполняющий основную работу. Из существенных моментов: chroot необходимо отключить, чтобы могли нормально работать скрипты на python и сервис должен работать от root чтобы добавлять маршруты.

Файл reroute.py — плагин, который выполняет необходимые дествия, reroute_conf.py — файл конфигурации для плагина, можно записать оба параметра прямо в плагин и обойтись без него. Вся работа выполняется в функции do_reroute, весь остальной код взят, практически без изменений, из документации unbound dns.

Файл rrdomains.txt — список регулярных выражений в формате python regex, при совпадении с которыми для всех ip-адресов разрешаемого доменного имени выполняется установка альтернативного маршрута.

Файл bashrc содержит определение функции reroute. Если во время работы наткнулись на сайт, для которого необходима маршрутизация через второй интерфейс, можно воспользоваться быстрым перенаправлением с помощью команды reroute в терминале. Или добавить доменное имя или регулярное выражение для него в rrdomains.txt и перезапустить dns сервер.

На этом всё, успешного маршрутизирования!

Теги:
+2
Комментарии0

Всем привет!

Сегодня состоялся релиз версии 1.0 моего исследовательского ядра Pech (ранее PearKernel). Проект прошел большой путь трансформации архитектуры, и я готов поделиться результатами.

Основные изменения:

  1. Архитектура системных серверов:
    Теперь Pech следует микроядерным концептам. Вместо монолитной логики я внедряю систему серверов. Это изолированные процессы, которые наделены специфическими полномочиями (Capabilities). Например, реализованный в этом релизе FS-сервер имеет прямой доступ к файловой системе и предоставляет интерфейсы для других пользовательских процессов.

  2. Асинхронный IPC:
    Механизм межпроцессного взаимодействия (IPC) полностью переработан. Теперь он базируется на системе полнодуплексных (full-duplex) асинхронных каналов. Для управления очередями сообщений была разработана собственная реализация асинхронной очереди (asyncio.Queue), так как в asyncio для MicroPython не было asyncio.Queue.

  3. Переход на кооперативную многозадачность:
    Я принял решение временно отказаться от собственной реализации вытесняющей многозадачности в пользу модели на базе asyncio. Это позволило значительно повысить стабильность работы системы и упростить логику переключения контекста между серверами. В планах на будущие версии — гибридная модель, объединяющая гибкость asyncio и строгий контроль ресурсов.

  4. Рефакторинг ядра:
    Я отошел от структуры «всё в одном классе». Логика ядра теперь декомпозирована, что упрощает масштабирование. При проектировании я ориентировался на концепции Mach 3.0, стараясь адаптировать их под современный асинхронный подход.

Планы:

В ближайшие пару месяцев я сосредоточусь на разработке инфраструктуры серверов и создании фреймворка для GUI.

Ссылка на репозиторий в первом комментарии. Жду конструктивной критики и идей по развитию архитектуры IPC!

Удачи!

Теги:
-5
Комментарии13

Успевайте поучаствовать в CodeRunWinterChallenge до 25 декабря!

Вечная зима… Лорд Нуль погрузил мир CodeRun в лёд. Только Кодерун с вашей помощью может бросить злодею вызов, покорить Пик Кода, остановить Ледниковый период и вернуть тепло... Впереди — 21 день восхождения…

Решайте задачи каждый день, помогайте Кодеруну и боритесь за призы:

  • Топ-20 получат умные колонки Яндекс Станция Лайт 2.

  • Топ-100 получат сертификаты, карьерные консультации и приоритет при отборе в Яндекс.

→ Подробности на странице челленджа

Теги:
0
Комментарии0

Потыкать создание дашбордов из данных табличек с AI.
Бесплатно тут можно: https://ai.arckep.ru
Никакой рекламы, просто делюсь. Работает на Grok.

Теги:
+5
Комментарии0

📊 Multi-LLM Orchestrator v0.7.0: подсчёт токенов и мониторинг через Prometheus

На этой неделе вышел релиз v0.7.0 — завершена фаза observability. Теперь библиотека автоматически считает токены, оценивает стоимость запросов и экспортирует метрики в Prometheus. Всё работает из коробки.

Предыдущие релизы:

🔢 Автоматический подсчёт токенов

Библиотека автоматически считает токены для каждого запроса — и для prompt, и для completion. Используется tiktoken с fallback на оценку по словам.

from orchestrator import Router
from orchestrator.providers import GigaChatProvider, ProviderConfig

router = Router()
router.add_provider(GigaChatProvider(ProviderConfig(
    name="gigachat",
    api_key="your_key",
    model="GigaChat",
    verify_ssl=False
)))

# Токены считаются автоматически
response = await router.route("Напиши стихотворение про Python")

# Получаем статистику
metrics = router.get_metrics()
print(f"Total tokens: {metrics['gigachat'].total_tokens}")
print(f"  Prompt: {metrics['gigachat'].total_prompt_tokens}")
print(f"  Completion: {metrics['gigachat'].total_completion_tokens}")

Результат:

Total tokens: 75
  Prompt: 20
  Completion: 55

💰 Оценка стоимости запросов

Расчёт стоимости в реальном времени. Цены настраиваются в pricing.py (фиксированные значения для демонстрации — для production рекомендуется настроить под свои тарифы).

Результаты тестов с реальными провайдерами:

  • GigaChat: 75 tokens → ₽0.0750

  • YandexGPT: 105 tokens → ₽0.1575

  • Streaming: 342 tokens → ₽0.3420

📈 Интеграция с Prometheus

HTTP-эндпоинт /metrics в формате Prometheus. Метрики обновляются в реальном времени и готовы для scraping.

# Запускаем metrics server
await router.start_metrics_server(port=9090)

# Делаем запросы
await router.route("Привет!")

# Метрики доступны: http://localhost:9090/metrics

Экспортируемые метрики:

  • llm_requests_total — количество запросов

  • llm_request_latency_seconds — histogram латентности

  • llm_tokens_total — токены (prompt/completion)

  • llm_cost_total — стоимость в RUB

  • llm_provider_health — health status (0-1)

Готово для визуализации с Grafana.

🏗️ Архитектура

Router → Metrics Engine → Prometheus Exporter → Grafana.
Router → Metrics Engine → Prometheus Exporter → Grafana.

✅ Тестирование на реальных провайдерах

Все функции протестированы с production API и реальными ключами:

Подсчёт токенов:

  • GigaChat — 75 токенов, ₽0.0750 (стихотворение про Python)

  • YandexGPT — 105 токенов, ₽0.1575 (объяснение ML концепции)

Streaming-режим:

  • GigaChat — 342 токена, ₽0.3420 (генерация длинного текста)

Prometheus endpoint:

  • HTTP /metrics — корректный формат, все метрики экспортируются

Качество кода: 203 теста • 81% покрытие • mypy strict без ошибок


📦 Установка

pip install multi-llm-orchestrator==0.7.0

Новые зависимости: prometheus-client, tiktoken, aiohttp

🎯 Планы на v0.8.0

В следующей версии планируется добавить:

  • Динамическое обновление цен — автоматическое получение актуальных тарифов через API провайдеров

  • Provider-specific tokenizers — нативные токенизаторы для GigaChat и YandexGPT (вместо универсального tiktoken)

  • Расширенная аналитика латентности — percentiles p50, p95, p99 для детального анализа производительности

  • Cost analytics — уведомления о превышении бюджета, детальная разбивка расходов по моделям

  • Prometheus Pushgateway — поддержка push-модели для serverless окружений

Если используете библиотеку — пишите в комментариях, какие функции нужны вам!

🔗 Ссылки

Теги:
+1
Комментарии0
1
23 ...

Вклад авторов