Pavel Zloi – Telegram
Pavel Zloi
2.18K subscribers
582 photos
49 videos
2 files
836 links
директор ИИ · инженер‑интегратор
@eprogrammist | https://github.com/EvilFreelancer

20 лет в IT
∈ 10 лет в разработке
∈ 3 года в ML/AI

Поддержать автора:
https://pay.cloudtips.ru/p/937f48ac
Download Telegram
Очень интересную фишечку обнаружил в Google Таблицах, оказывается можно редактировать/анализировать таблицу общаясь в формате чатика с Gemini интегрированную прямо в редактор.

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

Вот краткий пересказ:

Новые революционные модели стали на сколько-то там процентов лучше предыдущих и по мнению экспертов ещё вкуснее умнее.

Они доступны только по API, так что вкусить их смогут только самые упрямые.

На всяких редитах основной вопрос это нейминг, релизить модель 4.1 после 4.5 идея странная.

Лично я надеялся на релиз опенсорс моделей, но видимо придется подождать ещё немного.
21👍103
Forwarded from Хабр / ML & AI
Помощник читателя: визуализируем сюжет

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

- граф связей между героями;

- хронологию событий;

- карту мест действия. Читать далее

#python #machine_learning #artificial_intelligence #natural_language_processing #литература | @habr_ai
👍124
Fish Speech API

Представляю вашему вниманию кастомный OpenAI-подобный API-сервер для генерации голоса, основанный на fish-speech-1.5 от FishAudio.

Поддерживает как обычный text-to-speech (TTS), так и подмену голоса через референс-аудио.
Работает через REST, всё максимально похоже на формат OpenAI /v1/audio/speech, так что можно просто подменить endpoint и не менять клиент.

Что умеет:
- Генерация речи на базе модели fish-speech-1.5
- Стилизация речи под голос из аудио
- Кастомные параметры: top_p, temperature, max_new_tokens и др.
- Работает в докере или вручную через Python 3.12
Работает только на Nvidia.


🛠 Быстрый старт:
git clone https://github.com/EvilFreelancer/docker-fish-speech-server
cd fish-speech-api
cp docker-compose.dist.yml docker-compose.yml
docker compose up -d


Пример запроса:
curl http://localhost:8000/audio/speech \
-X POST \
-F model="fish-speech-1.5" \
-F input="Hello, this is a test of Fish Speech API" \
--output "speech.wav"


🎧 Хотите "подменить" голос? Просто добавьте reference_audio.

🔗 Исходники тут: https://github.com/EvilFreelancer/docker-fish-speech-server

Если у вас возникнут вопросы или потребуется помощь, вы можете задать свой вопрос в чате канала Pavel Zloi.
59👍6
🚀 Обновление моего публичного API-сервера

Я перенёс своё решение с самописного OpenAI-совместимого API-сервера на прокси LiteLLM, что позволило значительно упростить поддержку и расширить функциональность.

Теперь мой API-сервер поддерживает не только распознавание речи (ASR), но и генерацию речи (TTS) и текстовое общение с большими языковыми моделями (LLM).


🌊 Модель для генерации речи из текста — fish-speech-1.5

Добавлена поддержка модели fish-speech-1.5, которая позволяет выполнять преобразование текста в речь используя формат OpenAI-совместимых клиентов.

Для тестирования этой возможности я подготовил скрипт на Python: openai-tts.py

А это пример cURL запроса:
curl https://api.rpa.icu/audio/speech \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://news.1rj.ru/str/evilfreelancer" \
-d '{
"model": "fish-speech-1.5",
"input": "Hello, this is a test of Fish Speech API",
"voice": "english"
}' \
--output "speech.wav"



💬 Думающая большая языковая модель — deepseek-r1:8b


Также теперь через API теперь можно общаться с thinking моделью deepseek-r1:8b, которая благодаря тому, что основана на LLaMA 3.1 8B, поддерживает function calling.

Скрипт-пример общения с моделью: openai-chat.py

А это пример cURL запроса:
curl https://api.rpa.icu/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://news.1rj.ru/str/evilfreelancer" \
-d '{
"model": "deepseek-r1:8b",
"messages": [
{
"role": "user",
"content": "Write a one-sentence bedtime story about a unicorn."
}
]
}'



Обе новые модели работают на одной RTX 4090.

🧠 Всё это благодаря LiteLLM работает в рамках OpenAI-совместимого API, и по-прежнему доступно по тожму же адресу и тому же токену, пока что бесплатно:
OPENAI_BASE_URL=https://api.rpa.icu
OPENAI_API_KEY=https://news.1rj.ru/str/evilfreelancer


Документацию обновил и дополнил: https://api.rpa.icu/docs/

———

Раньше я думал, что давать доступ к моделям только через API — это удел ленивых инженеров. Но спецы из OpenAI намедни показали мне, что это на самом деле общепризнанная мировая практика, и теперь я, как и положено, действую по заветам лидеров рынка. 😎

#rpa
1🔥19
Добавил в апишку модель ReZero-v0.1:3b-250404, а если точнее то конвертированную в GGUF версию.

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

Подробнее о модели ReZero можно почитать тут, а тут исходники.

Пример использования:
curl https://api.rpa.icu/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://news.1rj.ru/str/evilfreelancer" \
-d '{
"model": "ReZero-v0.1:3b-250404",
"messages": [
{"role": "user",
"content": "Write a one-sentence bedtime story about a unicorn."}
]
}'

#rpa
527👍2🔥2
Pavel Zloi
Fish Speech API Представляю вашему вниманию кастомный OpenAI-подобный API-сервер для генерации голоса, основанный на fish-speech-1.5 от FishAudio. Поддерживает как обычный text-to-speech (TTS), так и подмену голоса через референс-аудио. Работает через REST…
Добавил в Fish Speech API поддержку голосов

Теперь при помощи параметра voice вы можете выбрать голос из заранее подготовленных сэмплов, полный список в папке examples, а взял я их со спейса fishaudio/fish-speech-1 на HuggingFace.

Пример использования:
curl http://localhost:8000/audio/speech \
-X POST \
-F model="fish-speech-1.5" \
-F voice="english-nice" \
-F input="Dr. Eleanor Whitaker, a quantum physicist from Edinburgh, surreptitiously analyzed the enigmatic hieroglyphs while humming Für Elise —her quizzical expression mirrored the cryptic symbols perplexing arrangement, yet she remained determined to decipher their archaic secrets." \
--output "speech.wav"


Помимо этого добавил в апишку возможность работать в режиме отправки JSON запросов:
curl http://localhost:8000/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "fish-speech-1.5",
"input": "Dr. Eleanor Whitaker, a quantum physicist from Edinburgh, surreptitiously analyzed the enigmatic hieroglyphs while humming Für Elise —her quizzical expression mirrored the cryptic symbols perplexing arrangement, yet she remained determined to decipher their archaic secrets.",
"reference_audio": "=base64..."
}' \
--output "speech.wav"


И ещё одно очень важное наблюдение

Модель Fish Speech очень плохо делает короткие сообщения, если хотите получить приемлемое качество то стоит присылать ей сразу абзац текста целиком, и если она начинает повторяться то ещё и repetition_penalty побольше делать.
🔥62
Провозился несколько часов c LiteLLM, моя цель была сделать Prometheus Exporter чтобы считать сколько тот или иной юзер израсходовал токенов у какой модели.

Однако, оказалось, что разработчики LiteLLM лукавят заверяя нас, что их детище это полностью OpenSource проект, тут как говорится есть нюанс, чтобы заработали такие штуки как Prometheus Exporter, SSO и прочие полезности надо занести им немного денег за лицензию.

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

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

# HELP llm_tokens_by_user_total Total tokens used per user_email and model
# TYPE llm_tokens_by_user_total gauge
llm_tokens_by_user_total{model="deepseek-r1:8b",type="prompt",user_email="user@example.com"} 88.0
llm_tokens_by_user_total{model="deepseek-r1:8b",type="completion",user_email="user@example.com"} 3177.0
llm_tokens_by_user_total{model="deepseek-r1:8b",type="total",user_email="user@example.com"} 3265.0
👍9🔥1
Forwarded from Dealer.AI
This media is not supported in your browser
VIEW IN TELEGRAM
Дядя помнит, когда приму курил его дед. А теперь "раскуривать" новый распределённый аналог llama.cpp нам.

So, prima.cpp is a distributed implementation of llama.cpp that lets you run 70B-level LLMs on your everyday devices—💻 laptops, 🖥️ desktops, 📱 phones, and tablets.(с)

В пачке Примы:
- Heterogeneous, low-resource, cross-platform clusters (e.g., home devices connected by Wi-Fi);
- Quantization (Q4K and IQ1);
- Mixed CPU/GPU computing
Disk offloading;
- Piped-ring parallelism with prefetching;
- Automatic workload distribution.

Подробнее тут: https://huggingface.co/papers/2504.08791
🔥13👍73
Добавил в апишку несколько новых моделей

На этот раз все модели семейства GigaChat, использовать так:
curl https://api.rpa.icu/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer https://news.1rj.ru/str/evilfreelancer" \
-d '{
"model": "GigaChat-2-Pro",
"messages": [
{"role": "user",
"content": "Расскажи, снегурочка, где была?"}
]
}'

Полный список всех новых моделей:
- GigaChat
- GigaChat-Max
- GigaChat-Plus
- GigaChat-Pro
- GigaChat-2
- GigaChat-2-Max
- GigaChat-2-Pro

И на десерт сберовский инстанс полноразмерной дипсик:
- Sber-DeepSeek-R1

#rpa
1🔥14👍5
Canary-Serve

Представляю вашему вниманию проект EvilFreelancer/docker-canary-serve - это небольшой FastAPI-сервер позволяющий работать с моделями NVIDIA Canary, выполняет быстрое многоязычное распознавание речи и умеет генерировать субтитры.

Поддерживает все основные модели семейства Canary:
- nvidia/canary-1b
- nvidia/canary-1b-flash
- nvidia/canary-180m-flash

Запустить так:
git clone https://github.com/EvilFreelancer/docker-canary-serve.git
cd docker-canary-serve
cp docker-compose.dist.yml docker-compose.yml
docker-compose up -d


Юзать так:
curl http://localhost:9000/inference \
-F file=@sample.wav \
-F language=en \
-F response_format=srt


Ограничения:
- Работает только на видеокартах Nvidia
- Базовые модели поддерживают только несколько языков: en, de, fr, es
- Для работы 180m модели нужно 2.5Гб VRAM, для работы 1B модели нужно 14Гб VRAM
👍10🔥3
Пару слов про аспектно-ориентированное программирование

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

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

Как не пытался сделать, всё фигня получалась, потом вспомнил, что я в одном проекте на PHP (который некоторыми недальновидными компаниями не считается за опыт) нечто подобное делал при помощи декораторов.

Попробовал на питоне, сработало идеально.

Надеюсь этот простой метод профилирования через дектораторы пригодится и вам.
🔥7👍3
Кейс про сборку приватного LLM-чата

Намедни завершил один любопытный проект — приватный чат с ИИ на базе Open WebUI с возможностью работы с моделями провайдеров OpenAI и Google Gemini, с централизованным управлением и мониторингом.

Проект решил построить на нескольких ключевых компонентах:

Traefik в режиме reverse proxy для маршрутизации и автоматического получения сертификтов Let's Encrypt
LiteLLM в режиме прокси с OpenAI-совместимым API, позволяющий подключать разные LLM-провайдеры через единую точку входа
Open WebUI интерфейс для чата, настроенный на работу через LiteLLM, с управлением доступом пользователей
– Связка Prometheus и Grafana для сбора и визуализации метрик (количество созданных чатов, активности пользователей и частоту использования моделей)

Всё поднял через Docker Compose, при этом конфигами и ключами управление происходит через .env файл.

Мониторинг — это была отдельная головная боль, изначально планировал использовать LiteLLM в режиме exporter, но оказывается в OpenSource проекте это удовольствие стоит денег, пробовал поднять альтернативный exporter-litellm, но он к сожалению не давал детализации по конкретным пользователям и моделям, пошёл по другому пути, через экспортер Open WebUI, нашёл подходящий проект exporter-openwebui, вот он уже выдал почти все нужные данные, кроме количества токенов, но заказчика это устроило.

В общем такая вот простая и красивая система получилась, ничего лишнего, работает отлично. Пишите если интересно собрать что-то подобное — архитектура достаточно универсальна, можно адаптировать под свои задачи.
🔥15👍72❤‍🔥1🫡1🆒1
После нескольких дней размышлений о компактности и эффективности охлаждения, принял решение заменить кулеры Снеговик M-T4 на систему жидкостного охлаждения ExeGate BlackWater-120. Причина? Высота радиаторов из комплекта Снеговика, несмотря на их достойные характеристики, они стали проблемой для установки дополнительных видеокарт в сервер gpu01.

Выбор пал на односекционную СЖО BlackWater-120, которая, по заявлениям производителя, способна справляться с процессорами до 150 ватт TDP, чего для моих трудяг, паре Intel Xeon E5-2690 v2 с TDP в 130 ватт - как-раз должно быть впору.

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

#server
6👍4🔥3
Чуть не забыл, сегодня же четвёртое мая!
11💩2
Несколько дней раздумываю над проектом тестирования LLM на русском языке в режиме маршрутизатора.

Мне прежде всего интересно установить как модели справляются с:
1) вопросами и маршрутами описанными на русском языке
2) минималистичным structured output который позволил был выполнить интеграцию модели в уже работающие системы
3) сколько роутов модели могут вытянуть максимально

И бонусный вопрос
4) зависимость точности от размера контекста

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

На скриншоте результат теста нескольких квантованных моделей, каждая определяет маршрут без учёта контекста диалога (по последнему вопросу) и на 4-8 маршрутах (в среднем 5).

В планах написать генератор синтетических вопросов и роутов, чтобы можно было выполнять оценку по разным метрикам.
🔥6
Почему я считаю, что RAG это call?

Пару часов назад Александр на своем канале Dealer AI снова обратил внимание на RAG-системы с точки зрения важности тестирования и оценки метрик до внедрения указанных систем в продакшен.

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

Как-то раз общался с заказчиком по одному проекту и пытался объяснить ему важность предварительного сбора бенчмарков для оценки качества системы. Логика у меня была простая: если предположим, некая RAG-система состоит из трёх последовательных звеньев (эмбеддер, ретривер, LLM), каждое из которых имеет точность, скажем, 90%, то интуитивно кажется, что и общая точность будет примерно на том же уровне. Однако на самом деле всё сложнее.

Согласно теории надёжности, в последовательных системах ошибки наследуются, и итоговая точность определяется перемножением точностей всех звеньев. Если каждый из трёх модулей даёт точность 90% (0.9), то реальная точность системы будет равна:
0.9 = 0.9
0.9 * 0.9 ≈ 0.81 (81%)
0.9 * 0.9 * 0.9 ≈ 0.729 (72.9%)
0.9 * 0.9 * 0.9 * 0.9 ≈ 0.656 (65.6%)

Это значит, что при последовательном соединении звеньев системы и с увеличением их количества вероятность ошибки увеличивается.

Подробнее о наследовании ошибок можно почитать в публикации про закон Люссера.

С другой стороны, интуитивно (без учёта наследования ошибок) может показаться, что точность системы определяется её самым слабым компонентом, в нашем примере — 90%, и, как следствие, заказчик принимает решение пренебречь предрелизным тестированием, так как верит в надёжность RAG-системы, полагаясь на интуицию.

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

Приведу ещё один пример. Если мы используем сверхточный эмбеддер (99%), средний по качеству ретривер (90%) и относительно слабую языковую модель (70%), общая точность станет:
0.99 * 0.9 * 0.7 ≈ 0.623 (62.3%)

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

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

Очень понравились аналогии приведенные автором и то как подробно он описал свое первое знакомство с данным паттерном и как потом постигал дзен итеративной разработки.

Расскажу как я вайбкожу.

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

Далее прошу модель проанализировать полученную информацию и составить шаблон классов с заглушками функций и структуру проекта. Классы прошу делать с учетом паттернов solid, dry, kiss и прочие.

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

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

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

Подобный подход называют итеративным вайбкодингом, а llm в этой схеме выступает в роли продвинутого Т9 забирающая на себя рутину.

Среди нескольких подходов которые я попробовал, и столкнулся с проблемами изложенными в статье, описанный выше оказался единственным при котором я не теряю контроль, получаю адекватный продукт соотвествующий требованиям и при этом имею полное понимаете кодовой базы.
👍235🔥3👏1😱1
Открытая версия Suno (генератора музыки и песен): https://ace-step.github.io/
Модель: https://huggingface.co/ACE-Step/ACE-Step-v1-3.5B
Код: https://github.com/ace-step/ACE-Step

Поддерживает русский до какой-то степени, на сайте есть пример на нём. По качеству как ранние версии Suno, в принципе довольно хорошо, но косяки всё равно слышны, особенно в вокале.
👍71
Прочёл публикацию "Как превратить ChatGPT в кофаундера: личный опыт и практические приёмы", очень неплохо придумал автор, я как-то даже не задумывался над тем чтобы превратить модельку в советчика по бизнес-вопросам.

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