Агенты на LangChain и LangGraph: как мы сделали автономный новостной портал it-herald.ru

Собрали связку AI-агентов, которая сама отбирает новости с Hacker News, переводит их, проверяет себя по чек-листу и постит в телеграм-канал - без единой ручной публикации.

ai
Агенты на LangChain и LangGraph: как мы сделали автономный новостной портал it-herald.ru

Задача

Для клиентских проектов с AI периодически встаёт вопрос: no-code сборщики агентов быстро дают демо, но в проде с ними тяжело - не видно, что агент делает на каждом шаге, сложно тестировать отдельные узлы, непонятно, во сколько обходится каждый запрос, и долго чинить, когда на реальных данных что-то идёт не так.

Мы решили закрыть этот пробел на низкоуровневом стеке — LangChain и LangGraph, где логика и обработка ошибок пишутся руками, а не собираются из блоков. Чтобы разобраться не по документации, а на практике, выбрали пилотный проект: агенты, которые сами собирают IT-новости с Hacker News, переводят и упаковывают их в читаемый вид. Тема не случайная — команда сама давно читала Hacker News и хотела дайджест без лишнего шума.

Так родился it-herald.ru — новостной сайт с телеграм-каналом @it_herald для дайджестов. Сам портал в этом проекте вторичен: это полигон, на котором мы отработали архитектуру и подход к агентам, которые сейчас переносим в проекты клиентов.

Архитектура решения

Систему разбили на независимые куски, каждый решает свою узкую задачу:

  • Сайт на Laravel с базой данных — отображает новости. Дополнительно выжали максимум по SEO: портал быстро попал в топ по части запросов и засветился в AI-выдаче Яндекса и Google.
  • Парсер новостей с Hacker News (poll_hn) — обычный python-скрипт без единого агента, работает через открытое API HN.
  • Парсер текста новости (parse_hn) — тоже без агентов, но один из ключевых этапов системы.
  • Агент-переводчик (translate_hn) — оркестратор с несколькими субагентами внутри.
  • SMM-агент (post_telegram_news, post_telegram_digest) — публикует новости и дайджесты в телеграм-канал по расписанию.

 

Как агенты находят и подготавливают новости

Каждая новость с Hacker News это ссылка на чужую страницу с неизвестной заранее разметкой. Задача парсера - вытащить только текст новости, без тегов, скриптов и стилей: на типичной странице полезного текста от силы процентов десять, остальное шум.

Здесь же закладывается экономия, которая определяет всю дальнейшую стоимость системы: чем меньше лишнего текста уходит на вход агентам, тем дешевле обработка. Оставляем заголовки, изображения, списки, таблицы, фреймы - то, что реально несёт смысл. Отдельно ведём список доменов, с которых данные заведомо не забираем (Wikipedia, GitHub и подобные) - гонять агента по ним нет смысла.

 

Агент-переводчик: оценка, перевод, рефлексия

Первый агент, «Переводчик», забирает в работу 5 непереведённых статей за раз и проходит по цепочке шагов.

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

Работа с изображениями. Если оценка пройдена, агент находит картинки, сохраняет их на сервере и строит матрицу соответствий «оригинальный URL → новый URL», которую держит в памяти до конца обработки статьи — так изображения не теряются при переводе.

Перевод и сборка. Перевод на русский, форматирование в HTML, таблицы, подключение изображений. На выходе - готовая HTML-статья.

Метаданные. Тут же агент определяет SEO-теги, название, краткое описание, теги, обложку и параллельно собирает markdown-текст для поста в телеграм-канал.

Отдельно стоит отметить строгую типизацию: LangChain заставляет агента возвращать данные точно в заданной структуре. Если поле объявлено как int, агент вернёт число или заданное значение по умолчанию - а не выдуманную строку вроде «не найдено». Для нас это стало ключевым доводом в пользу низкоуровневого стека: по сути, полноценное ООП на уровне агентов, а не просто текст на выходе из чат-бота.

Самопроверка. Самое интересное происходит перед сохранением. Вместо того чтобы сразу писать результат в базу, запускается рефлексия: агент вычитывает всё, что создал, и проверяет себя примерно по 20 критериям - точность перевода, доступность картинок, соответствие текста в ТГ содержанию статьи и лимиту по объёму, тон и так далее.

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

Именно этот контур почти полностью убирает галлюцинации модели - не за счёт более умного промпта, а за счёт того, что агент обязан сверять свою же работу с чек-листом, прежде чем она попадёт на сайт.

SMM-агент: публикации и дайджесты

Второй агент отвечает за телеграм-канал и решает две задачи.

Первая — публиковать самые важные из свежих новостей в фиксированные слоты (сейчас это 13:00 и 18:30 по Москве; в кроне заложено до 4 слотов в день, но два оказались достаточными, чтобы не заспамить канал). В каждом слоте агент получает на вход массив новостей за последние 36 часов - не полный текст, а краткое содержание для телеграма, с параметрами: рейтинг на HN, число комментариев, время публикации. По формуле считает среднюю оценку «интересности» и на выходе отдаёт не текст, а просто ID новости-победителя. Дальше отдельный скрипт берёт этот ID, находит новость в базе и публикует её через бота.

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

Здесь работает та же схема с рефлексией: максимум три круга самопроверки перед публикацией. За всё время не было ни одного пропуска из-за неисправимой ошибки — ошибки случались, но агент всегда успевал их поправить в пределах трёх кругов.

Технологии: LangChain, LangGraph, LangSmith

Агенты построены на связке LangChain и LangGraph: вокруг них крутится оркестрирующий скрипт, который хранит оперативные данные между шагами и передаёт их между узлами графа — от оценки к переводу, от перевода к рефлексии и обратно на доработку, если что-то не сошлось.

По-настоящему полезной всю инфраструктуру сделал LangSmith. Через него видно каждый запрос к модели, каждый параметр и стоимость каждого вызова в отдельности. Под каждого агента и субагента можно собрать тестовый датасет, прогнать его, отладить — и довести автоматизацию до состояния, когда прогон стоит копейки. После этого систему можно оставить работать по крону и не трогать, пока не понадобится масштабирование.

Токены и деньги

В проекте используются две модели с разным назначением:

  • openai:gpt-4.1-mini — лёгкая модель для оценки и постинга, тратит буквально 5 центов в день, иногда меньше.
  • anthropic:claude-sonnet-5 — тяжёлая модель для перевода. Стоимость прогона сильно зависит от объёма сырых данных статьи и в среднем составляет от 2 до 20 центов за прогон.

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

 

Результаты

  • Портал работает автономно: новости отбираются, переводятся, проверяются и публикуются без ручного участия, а редактор нужен только для разбора логов по отклонённым статьям.
  • Сайт неожиданно начал жить своей SEO-жизнью: органический трафик и попадание в AI-выдачу Яндекса и Google.
  • Контур рефлексии почти полностью снял проблему галлюцинаций модели на проде — без необходимости держать человека на вычитке каждой статьи.
  • Мы получили воспроизводимый паттерн «оценка → обработка → самопроверка → публикация или откат» на LangChain и LangGraph, с полной прозрачностью стоимости через LangSmith.
  • Этот паттерн уже используется в клиентском проекте — агентах техподдержки, которые не просто отвечают клиентам, а на лету решают проблемы без подключения технических специалистов.

Если вам нужен AI-агент, который работает в проде предсказуемо и с понятной ценой за запрос — пишите нам, разберём вашу задачу.

Есть задача? найдём решение!

Заполните форму, мы свяжемся с вами в месенджере и назначим онлайн-встречу, обсудим детали и предложим решение

Normdev development Логотип Normdev development