Perplexity на минималках: как собрать AI-редактора в Telegram за 0 рублей (Gemini + GitHub Actions)
Идея была в том, чтобы получить аналог Perplexity с его разделом "Discover", только в виде Telegram-канала.
Хотелось получить что-то вроде «умной» сводки западных СМИ, которая работает по принципу: пришло сообщение, быстро прочитал, понял суть, пошел дальше.
В итоге собрал бота, который ходит по источникам, выбирает важное, фильтрует, пишет пост и выдергивает обложки статей, чтобы пост выглядел красиво, либо добавляет эмодзи и буллиты для коротких сводок.
Стек за 0 рублей
- Gemini Flash. Google агрессивно демпингует бесплатными лимиты (20 запросов в сутки). С текстовыми задачами такого уровня Flash-версия вполне справляется.
- Python. Скрипт на 200 строк. Бесплатно, спасибо Гвидо :)
- GitHub Actions. Настраиваем cron-расписание в YAML-файле и GitHub сам запускает контейнер, выполняет код и затухает до следующего запуска. Бывают перебои в работе, но если постов в день немного, то подойдет.
Сетка вещания (пока тестово)
- 10:00: Рынки и политика (сухая сводка).
- 13:00: Технологии и стартапы (лонгрид).
- 19:00: Эссе или глубокий разбор тренда.
Бот не ищет новости в гугле, а ходит по списку RSS: TechCrunch, The Verge, Reuters, Hacker News.
Самое важное (внезапно) промптинг
Залог красивых и качественных постов в шлифовке системного промпта. Вот, что реально помогло улучшить стиль текста:
1. Убрать «Я» и задать голосу тон.
ИИ часто пишет: «Я проанализировал статью и считаю, что этот шаг рискованный» или «Это революционное изменение». Чтобы этого избежать в системном промпте прописываем роль и общие правила, которые применяются к последующим промптам через отдельную переменную SHARED_STYLE. То есть мы не используют один промпт, а собираем общий из частей в зависимости от режима (сводка или эссе).
2. Запрет на вступления и заключения
ИИ всегда пытается сделать "сэндвич": вступление -> "мясо" -> вывод. В новостях это кажется лишним. Можно дать вводных - «Запрещено использовать фразы: "В этой статье говорится", "Давайте рассмотрим", "В заключение". Начинай сразу с сути. Первое предложение должно содержать глагол действия и главного героя новости».
3. Структура и контекст
Нужно понимание, почему это важно. Лучше попросить модель искать в тексте ответы на вопросы:
- Что случилось? (Факт)
- Почему сейчас? (Контекст)
- Кому от этого больно/хорошо? (Последствия)
В коде передаю не просто текст статьи, а структуру: Title: ... Content: ... Source: ... Не нужно ограничивать промпт строгим количеством символов. Лучше задать количество предложений. Так у нейронки не возникает паники и она начинает писать более естественно.
На выходе запрашиваем размеченный HTML, где ссылки нативно вшиты в текст, типа: «...сообщает The Verge», чтобы выглядело как в редакции.
Работа с медиа
Генерировать картинки дорого и часто получается крипово (привет, пальцы). Самое элегантное решение оказалось самым простым. Скрипт парсит страницу источника, ищет мета-тег og:image и забирает обложку статьи. В Telegram это выглядит как превью: заголовок, текст, реальное фото.
Что получилось
Канал работает автономно, нужно периодически проверять запуски в Github. Если Actions упал, то придет письмо на почту. Если все ОК, то получаем пост в канале.
Название а-ля серьезные медиа: "The Explainer". Пока в формате песочницы, тестирую промпты, чтобы добиться баланса между сухостью и живостью автора. Если интересно посмотреть на результат, то подписывайтесь по ссылке:
Спасибо, что дочитали. Буду раз обсудить детали в комментариях.