Каждый час в канал @ai_release1 уходит свежая новость об ИИ, раз в сутки — дайджест, каждые 8 часов — видео, плюс ежедневный совет по Windows и еженедельная «связка» тем. Всё это живёт на одном недорогом VPS с 1 ГБ оперативной памяти, без участия человека и без ПК. За месяц накопилось ~450 постов и 716 подписчиков. В этой статье — как устроен пайплайн, на какие грабли мы наступали и как экономим токены.
Изначальная идея была простой: не читать новости об ИИ вручную, а получать их в Telegram в сжатом и проверенном виде. Но быстро выяснилось, что «просто RSS + пересказ» не работает:
Поэтому стек получился «тонкий, но злой»: Python-скрипты по расписанию systemd, внешние LLM-API, лёгкий метапоиск и статический сайт-зеркало.
Проект сознательно уложен в минимальную сумму:
| Статья расходов | Стоимость |
|---|---|
| VPS (1 ГБ RAM) | ~5 $/мес |
| Подписка OpenCode Zen GO (LLM-API) | 10 $/мес |
| Домен ai-release.net | 22 $/год (~1.8 $/мес) |
| Telegram Premium | 25 $/год (~2 $/мес) |
| **Итого** | **~18.8 $/мес** |
Дороже всего — LLM-подписка, но она покрывает и новости, и чат-бота, и редактуру. Генерация обложек не стоит ничего — собираем их из открытых источников (см. ниже).
Всё держится на systemd-таймерах и нескольких Python-скриптах:
ai-release-hourly.timer -> hourly.py (*:15) 1 новость в час
ai-release-video.timer -> video.py (0:30, 8:30, 16:30) 1 видео раз в 8 ч
ai-release-daily.timer -> daily.py (15:00 UTC / 18:00 МСК) дайджест дня
ai-release-stats.timer -> stats.py (18:00 UTC) статистика
ai-release-chat.service -> chat.py (daemon) ИИ-ответы в личке
ai-release-web.service -> site.py / web.py / guides.py веб-зеркало
Расписание задаётся через `OnCalendar`, например для часового таймера:
[Timer]
OnCalendar=*-*-* *:15:00
Persistent=true
Никакого брокера очередей и «оркестратора» — только таймеры. Для проекта такого размера это правильный выбор: каждый запуск — отдельный процесс, который падает и не роняет остальное.
Публикация — напрямую через Telegram Bot API. Источники новостей: RSS-агрегаторы (Хабр, Ars Technica, TechCrunch, VentureBeat, The Register, The Decoder и др.), первоисточники (блог OpenAI, Google Research, ArXiv API, Hugging Face Daily Papers, GitHub Trending, Hacker News через Algolia API) и авторские блоги (Simon Willison, Karpathy, Sebastian Raschka, Nathan Lambert). Запасной поиск — локальный SearXNG в Docker.
Первая версия публиковала всё подряд и превращалась в ленту дублей. Теперь есть три уровня фильтрации:
1. **Рейтинг.** Каждой новости считается скор из свежести, веса источника и качества заголовка. Первоисточники и авторы весят больше агрегаторов, свежее — важнее старого.
2. **Хэш заголовка.** Перед сравнением заголовок нормализуется: срезаются суффиксы изданий (`— TechCrunch`, `| WindowsLatest`), лидирующие `BREAKING:`/`СРОЧНО:`, хвосты вида `report says`, унифицируются кавычки и тире. Затем — хэш и проверка по SQLite:
def normalize_title(t: str) -> str:
t = re.sub(r"\s*[-—|]\s*(TechCrunch|Engadget|The Verge|WindowsLatest).*$", "", t, flags=re.I)
t = re.sub(r"^(BREAKING|СРОЧНО|EXCLUSIVE)\s*:?\s*", "", t, flags=re.I)
t = t.replace("«", '"').replace("»", '"').strip()
return t.lower()
3. **Смысловой дедуп через LLM.** Даже с нормализацией два источника могут рассказать об одном событии разными словами. Поэтому кандидат дополнительно сравнивается с текстами последних постов канала, и если это «то же событие» — отбрасывается.
Отдельно стоит фильтр SEO-мусора: домены не из белого списка пропускаются только при конкретном сигнале (название модели, компании или события), а широкие «ии/ai/нейросеть» — нет. Плюс чёрный список промо-маркеров («журнал о», «свежий выпуск», «подпишись»).
Это оказалось самой важной частью. Раньше саммари иногда подавало чужой вывод как факт и додумывало причины. Мы ужесточили промпт: излагать **только** то, что есть в заголовке и описании; не выдумывать причины, цифры и последствия; сохранять атрибуцию («по данным исследования», «считают журналисты»), если вывод принадлежит источнику. Плюс снизили `temperature` с 0.8 до 0.5.
Пример из практики: пост про Windows 10 подал мнение издания как факт и придумал причины. Пришлось ввести отдельное фактическое правило — «поддержка Windows 10 прекращена 14.10.2025, бесплатных обновлений безопасности нет» — чтобы редактор добавлял контекст безопасности, когда новость советует оставаться на старой ОС.
LLM — самая дорогая часть пайплайна, поэтому мы:
Для длинных саммари батч формируется одним запросом с запасом по `max_tokens` — иначе модель тратит токены на reasoning и обрывает ответ.
Генерация картинок упёрлась в платную модель и лимиты. Поэтому обложка собирается «бесплатно», в несколько шагов:
1. `og:image` статьи-источника;
2. стоковая картинка по теме через метапоиск (allowlist: Unsplash, Pexels, Pixabay, Wikimedia, Flickr, pinimg);
3. тематическая аниме/манга-иллюстрация;
4. заранее заготовленный фолбэк-набор.
Картинки дополнительно проверяются HEAD-запросом. Если Telegram не может забрать изображение по URL (HTTP 400), пост не теряется — подставляется другая обложка и публикация повторяется.
Сеть и внешние API падают регулярно. Что сделано:
У каждого поста есть страница на статическом сайте-зеркале `ai-release.net` (RU + EN), плюс sitemap с `hreflang`, `robots.txt` и мгновенная индексация через **IndexNow** (Bing + Yandex) при каждой публикации. Аналитика — Google Analytics 4 и Yandex.Metrika.
Отдельная тема — **AI SEO**, чтобы нейросети и ИИ-агрегаторы сами подхватывали контент:
`robots.txt` открыт всем ИИ-ботам (GPTBot, PerplexityBot, ClaudeBot, Google-Extended). За месяц это дало заметную долю трафика от LLM-краулеров.
Бот отвечает подписчикам в личке через ту же LLM. Публичный чат — это недоверенный ввод, поэтому защита строится в три слоя:
Плюс история диалогов ограничена по длине, чтобы контекст не разрастался и не тянул за собой утечки.
1. Для «умной» ленты не нужен свой сервер с GPU — достаточно хорошо спроектированного пайплайна и внешних LLM.
2. Дедупликация и борьба с галлюцинациями важнее, чем качество модели.
3. Экономия токенов — это в первую очередь кэш и роутинг, а не «более дешёвая модель».
4. Для индексации в эпоху LLM нужен отдельный слой: `llms.txt`, markdown-версии и открытые краулеры.
---
Новости об ИИ каждый час и разборы — в канале @ai_release1, архив постов и гайды — на сайте ai-release.net.
💬 **Вопросы и обсуждение — в комментариях ниже.**