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

Лента Хабр, только честная

Привет, Хабр!

На Хабр выходит множество статей разного качества. Часто, это статьи с вводящими в заблуждение или просто скучными заголовками. И мы это исправили - по ссылке ниже лента Хабр с честными (или как минимум смешными заголовками).

Посетить "Честную ленту" вы можете здесь: https://honest-habr-testamvera.amvera.io/

Код берет заголовки нашего любимого Хабра из его RSS и через нейронку переводит в "честный вид".

Пример "честного" заголовка
Пример "честного" заголовка
Еще один пример "честного" заголовка
Еще один пример "честного" заголовка

Обрабатывает скрипт совершенно все статьи, выложенные на Хабр. Так что вы можете выложить любую статью и посмотреть на ее обновленный честный вид! Главное, не обижайтесь, все это сделано во имя юмора :)

Как это работает

Если вас заинтересовало то, как это все устроено, в этой части статьи я расскажу все в деталях.

Итак, с чего все начинается.

Если не вдаваться в технические детали, то сервис работает довольно просто и логично. Его задача - взять заголовки из RSS Хабра, сохранить у себя и один раз обработать через LLM DeepSeek по заданному промпту, который магическим образом превратит заголовок в исчадье иронии, чтоб потом просто показать результат.

Разбёрем по шагам.

Шаг 1. Сбор заголовков с Хабра

Заголовки мы берем из RSS Хабра, который он сам и предоставляет. Простым языком, это просто свежая лента без красивой стилизации, как сделано на главной страничке. Из него мы получаем все, что нам надо: заголовок, автора, теги, краткое описание и дату.

Ниже приложу фрагмент кода, в котором мы немного забежим вперед.

Код выполняет несколько простых действий:

  1. По URL, заданному через одноименную переменную окружения, ходим к RSS, парсим его и, проходясь по каждому элементу, проверяем, не сохраняли мы его раннее.

  2. Если это новые статьи (и их заголовки еще не были сохранены в отдельный файлик состояния), то сохраняем их в файл состояния 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.

Надеюсь, вам понравился эксперимент с лентой Habr. Всем удачи и с наступающим Новым годом!

Источник

Возможности рынка
Логотип hadtotakeprofits sir
hadtotakeprofits sir Курс (HTTPS)
$0.0005101
$0.0005101$0.0005101
-19.54%
USD
График цены hadtotakeprofits sir (HTTPS) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.