Привет, Хабр!
На Хабр выходит множество статей разного качества. Часто, это статьи с вводящими в заблуждение или просто скучными заголовками. И мы это исправили - по ссылке ниже лента Хабр с честными (или как минимум смешными заголовками).
Посетить "Честную ленту" вы можете здесь: https://honest-habr-testamvera.amvera.io/
Код берет заголовки нашего любимого Хабра из его RSS и через нейронку переводит в "честный вид".
Обрабатывает скрипт совершенно все статьи, выложенные на Хабр. Так что вы можете выложить любую статью и посмотреть на ее обновленный честный вид! Главное, не обижайтесь, все это сделано во имя юмора :)
Как это работаетЕсли вас заинтересовало то, как это все устроено, в этой части статьи я расскажу все в деталях.
Если не вдаваться в технические детали, то сервис работает довольно просто и логично. Его задача - взять заголовки из RSS Хабра, сохранить у себя и один раз обработать через LLM DeepSeek по заданному промпту, который магическим образом превратит заголовок в исчадье иронии, чтоб потом просто показать результат.
Разбёрем по шагам.
Заголовки мы берем из 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])
Прежде чем генерировать новые заголовки, мы проверяем, обрабатывали ли мы его уже. Это делается просто - в 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}} Честно:
И тут в бой вступает само веб-приложение: https://honest-habr-testamvera.amvera.io/.
Оно имеет максимально приближенный к Хабру стиль. Здесь мы отображаем буквально все:
Прогресс генерации.
Все недавно сгенерированные заголовки и их описания.
И на этом все. Хоть это и звучит достаточно просто, техническая реализация заняла некоторое время.
Если вдруг у вас появится идея создать что-то подобное или доработать существующее, просмотреть исходный код вы можете в нашем GitHub по ссылке.
Мы разместили у нас же в облаке Amvera Cloud, где можно деплоить через git push и уже есть инференс нейронок с оплатой в рублях. И буду честен (раз статья про честность) упомянул это здесь, так как это корпоративный блог)
Код проекта с необходимыми переменными доступен на GitHub.
Источник


