Привет, Хабр!
На Хабр выходит множество статей разного качества. Часто, это статьи с вводящими в заблуждение или просто скучными заголовками. И мы это исправили - по ссылке ниже лента Хабр с честными (или как минимум смешными заголовками).
Посетить "Честную ленту" вы можете здесь: https://honest-habr-testamvera.amvera.io/
Код берет заголовки нашего любимого Хабра из его RSS и через нейронку переводит в "честный вид".


Обрабатывает скрипт совершенно все статьи, выложенные на Хабр. Так что вы можете выложить любую статью и посмотреть на ее обновленный честный вид! Главное, не обижайтесь, все это сделано во имя юмора :)
Как это работает
Если вас заинтересовало то, как это все устроено, в этой части статьи я расскажу все в деталях.
Итак, с чего все начинается.
Если не вдаваться в технические детали, то сервис работает довольно просто и логично. Его задача - взять заголовки из RSS Хабра, сохранить у себя и один раз обработать через LLM DeepSeek по заданному промпту, который магическим образом превратит заголовок в исчадье иронии, чтоб потом просто показать результат.
Разбёрем по шагам.
Шаг 1. Сбор заголовков с Хабра
Заголовки мы берем из RSS Хабра, который он сам и предоставляет. Простым языком, это просто свежая лента без красивой стилизации, как сделано на главной страничке. Из него мы получаем все, что нам надо: заголовок, автора, теги, к��аткое описание и дату.
Ниже приложу фрагмент кода, в котором мы немного забежим вперед.
Код выполняет несколько простых действий:
По URL, заданному через одноименную переменную окружения, ходим к RSS, парсим его и, проходясь по каждому элементу, проверяем, не сохраняли мы его раннее.
Если это новые статьи (и их заголовки еще не были сохранены в отдельный файлик состояния), то сохраняем их в файл состояния
articles.jsonс обязательной сортировкой.
RSS_URL = os.getenv("RSS_URL", "https://habr.com/ru/rss/articles/?fl=ru")
def update_from_rss(rss_url):
r = requests.get(rss_url, timeout=20, headers={"User-Agent": "honest-rss-api/1.0"})
r.raise_for_status()
parsed = feedparser.parse(r.text)
entries = list(parsed.entries or [])
old_items = read_articles()
saved_by_link = {}
saved_by_original = {}
for it in old_items:
link = s(it.get("link"))
orig = s(it.get("original_title"))
title = s(it.get("title"))
if link:
saved_by_link[link] = it
if orig and title and title != orig:
saved_by_original[orig] = title
new_items = []
count = 0
for e in entries:
if count >= MAX_STORE:
break
link = s(getattr(e, "link", None))
orig_title = s(getattr(e, "title", None))
if not link or not orig_title:
continue
tags = []
tags_raw = getattr(e, "tags", None) or []
for t in tags_raw:
if isinstance(t, dict) and t.get("term"):
tags.append({"term": t.get("term")})
saved = saved_by_link.get(link) or {}
saved_title = s(saved.get("title"))
if (not saved_title) or (saved_title == orig_title):
saved_title = saved_by_original.get(orig_title) or ""
item = {
"ts": entry_ts(e),
"published": s(getattr(e, "published", None) or getattr(e, "updated", None)),
"link": link,
"author": s(getattr(e, "author", None) or getattr(e, "creator", None)),
"summary": s(getattr(e, "summary", None) or getattr(e, "description", None)),
"tags": tags,
"original_title": orig_title,
"title": saved_title or orig_title,
}
new_items.append(item)
count += 1
new_items.sort(key=lambda x: (to_int(x.get("ts")), s(x.get("title"))), reverse=True)
write_json(ARTICLES_FILE, new_items[:MAX_STORE])
Шаг 2. Генерация честных заголовков
Прежде чем генерировать новые заголовки, мы проверяем, обрабатывали ли мы его уже. Это делается просто - в articles.json, помимо оригинального названия, мы храним и честные. Как видно из кода выше, при первом попадании статьи в файл состояния, его честый заголовок равен оригинальному.
Т.е. если original_title == title, то заголовок еще зеленый и мы с гордо поднятой головой можем отдавать его на съедение и обработку LLM.
Для генерации заголовка мы используем DeepSeek-V3 из Amvera LLM Inference API с параллельной обработкой (просто одновременно отправляем несколько запросов).
При отправке запроса используем следующий промпт, который мы очень удачно выбили из другой нейронки:
Ты — жесткий редактор сатирической ленты «Честная лента».
Твоя задача — переписывать заголовки IT-статей максимально честно, жёстко и цинично,
в стиле усталого IT-сообщества.
Стиль:
- жёсткий редакционный сарказм
- прям на грани, разрешена провокация - в этом смысл
- ощущение «мы это уже видели тысячу раз»
- если будет мягко - будет неинтересно
Правила:
- НЕ менять названия компаний, продуктов и технологий
- НЕ выдумывать факты
- НЕ добавлять кликбейт
- Заголовок должен звучать как честный комментарий к статье
- Верни ТОЛЬКО заголовок, без кавычек и пояснений
Надо чтобы было на грани.
Допустимы заголовки
«Я и Rust Дартаньян, а вы все д..мо»
Примеры:
Оригинал: Корпоративный блог о микросервисах
Честно: Корпоративный блог сам себя не напишет
Оригинал: Обзор новой версии ChatGPT
Честно: Пишем нейронкой про нейронки
Оригинал: Как мы внедряли AI в бизнес
Честно: У нас KPI на статьи
Оригинал: Почему разработчики уходят из профессии
Честно: Жизненный опыт IT-шника. Не мы такие, жизнь такая.
Оригинал: Новый фреймворк для JavaScript
Честно: В интернете кто-то снова не прав
Другие примеры:
- Корпоративный блог сам себя не напишет
- У нас KPI на статьи
- В интернете кто-то снова не прав
- Хабр не жалобная книга, но…
- Новость популярна, а мы умеем пользоваться Гугл Транслейтом
- Нейросеть все стерпит
- Подписывайтесь на мой телеграм канал
- Люди читают статьи, и иногда это реклама, наша реклама
- В СССР мороженое было вкуснее, а трава зеленее
- Скрепно сломали интернет
- Все что не запрещено, запрещено
- Конечно, никого не волновало, что Хабр не про инфоциганство
- Хабр уже не торт
- Нейродегенеративный контент про нейроконтент
- Очень интересно, но ничего непонятно
- Меня все (не) спрашивали, но я написал
- Разбираемся в Китайском трехкопеечном оборудовании, убеждаясь в его «трехкопеечности»
- Запускаем doom на счетах
- Хабр не Пикабу, но когда это меня останавливало
- Жизненный опыт IT-шника. Не мы такие, жизнь такая.
- Яндекс сменил оттенок кнопки. Работают. Творят.
- У нас NIH-синдром. Об этом должен знать каждый
- 20 плюсов на 21 просмотр. Просто материал крутой
- Пишем нейронкой про нейронки
- Заряжаем воду через монитор
Оригинал:
{{TITLE}}
Честно:
Шаг 3. Отображение всего гениального через фронт
И тут в бой вступает само веб-приложен��е: https://honest-habr-testamvera.amvera.io/.
Оно имеет максимально приближенный к Хабру стиль. Здесь мы отображаем буквально все:
Прогресс генерации.
Все недавно сгенерированные заголовки и их описания.
И на этом все. Хоть это и звучит достаточно просто, техническая реализация заняла некоторое время.
Если вдруг у вас появится идея создать что-то подобное или доработать существующее, просмотреть исходный код вы можете в нашем GitHub по ссылке.
Где запущен проект?
Мы разместили у нас же в облаке Amvera Cloud, где можно деплоить через git push и уже есть инференс нейронок с оплатой в рублях. И буду честен (раз статья про честность) упомянул это здесь, так как это корпоративный блог)
Код проекта с необходимыми переменными доступен на GitHub.
