Perplexity на минималках: как собрать AI-редактора в Telegram за 0 рублей (Gemini + GitHub Actions)

Идея была в том, чтобы получить аналог Perplexity с его разделом "Discover", только в виде Telegram-канала.

Иллюстрация от GPT Image 1
Иллюстрация от GPT Image 1

Хотелось получить что-то вроде «умной» сводки западных СМИ, которая работает по принципу: пришло сообщение, быстро прочитал, понял суть, пошел дальше.

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

Стек за 0 рублей

  1. Gemini Flash. Google агрессивно демпингует бесплатными лимиты (20 запросов в сутки). С текстовыми задачами такого уровня Flash-версия вполне справляется.
  2. Python. Скрипт на 200 строк. Бесплатно, спасибо Гвидо :)
  3. 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". Пока в формате песочницы, тестирую промпты, чтобы добиться баланса между сухостью и живостью автора. Если интересно посмотреть на результат, то подписывайтесь по ссылке:

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

2
Начать дискуссию