惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
P
Privacy International News Feed
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 叶小钗
F
Fortinet All Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 最新话题
AWS News Blog
AWS News Blog
Engineering at Meta
Engineering at Meta
Attack and Defense Labs
Attack and Defense Labs
Recent Announcements
Recent Announcements
Recent Commits to openclaw:main
Recent Commits to openclaw:main
PCI Perspectives
PCI Perspectives
Cloudbric
Cloudbric
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
IT之家
IT之家
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
J
Java Code Geeks
M
MIT News - Artificial intelligence
Cisco Talos Blog
Cisco Talos Blog
V2EX - 技术
V2EX - 技术
Webroot Blog
Webroot Blog
Microsoft Security Blog
Microsoft Security Blog
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
G
Google Developers Blog
W
WeLiveSecurity
罗磊的独立博客
P
Privacy & Cybersecurity Law Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
T
Tailwind CSS Blog
V
Visual Studio Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Secure Thoughts
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
P
Proofpoint News Feed

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Codex 5.3 vs Claude Opus 4.6 на реальном Java-монолите
NickAlister · 2026-05-15 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение9 мин

Охват и читатели2

Кейс

Дисклеймер

У меня всё никак не было времени довести эту статью до публикации и уже можно было бы делать новое сравнение на новых моделях (финальное сравнительное ревью я делал 19 апреля 2026 года). К тому же Opus 4.6 тогда был прямо перед запуском Opus 4.7, и у меня есть субъективное ощущение, что перед выходом новой версии старая начинает тупеть, потому мои результаты могут сильно отличаться от ваших. Нужно также понимать, что claude и codex могут работать по-разному в зависимости от времени суток, региона, нагрузки, текущей версии модели и фазы луны. Такое сравнение может устаревать буквально за час. Результат будет другим для других задач, языка программирования, набора тулов, MCP, промптов, документации, размера проекта.

Предыстория

В статье «Вайбкодинг — это гемблинг» я обещал, что расскажу больше про свои эксперименты при разработке многомодульного монолитного java-проекта https://github.com/NGirchev/open-daimon с разными AI-тулами. Купив подписку claude за 100 баксов для личного использования, я заметил, что поначалу он работал хорошо, а затем токены стали заканчиваться слишком быстро, и я хотел альтернатив. В это время рабочая codex подписка казалась экономнее, и я захотел сравнить 2 подписки на своём личном проекте с личными аккаунтами. К счастью, в этот момент OpenAI предложила мне месяц бесплатной базовой подписки ($20).

<cut />

В тот момент в моём проекте я уже частично перевёл логику агента из библиотеки Spring AI на самописную FSM и ReAct-паттерн. Я решил понемногу отказываться от Spring AI, потому что memory, которую они поставляют, меня не устраивает, саммаризацию пришлось делать самому, их агентский loop скрытый, кеширование промптов не работает, часть метаинформации не пробрасывается, но отказ от Spring AI я опишу в будущих статьях, не об этом сейчас.

Так вот, код всё ещё не работал как надо, было много багов. И я решил, раз claude не справляется, почему бы не дать шанс codex.

Что именно сравнивалось

Я сделал так: целиком скопировал проект в соседнюю папку, создал отдельные ветки opus_4_6 и codex_5_3 и запустил агентов с одинаковым не слишком подробным промптом - чистый вайбкодинг. Я не читал промежуточных результатов, всегда говорил ему: "делай как считаешь нужным", потом запускал ревью, потом просил починить и так до тех пор, пока сценарий не был успешен и не были устранены все замечания, кроме minor. Просто ждал результата и указал как единственный критерий - прохождение всех тестов, включая e2e, которые заранее были написаны и работали со Spring AI loop.

Cross review Opus и Codex

Область

opus_4_6

codex_5_3

Кто сильнее

Фильтрация thinking и <tool_call> в стриминговом выводе пользователю в Telegram

Отдельный StreamingAnswerFilter режет служебный мусор до отправки события в UI

Часть логики размазана по stream-обработке и post-processing

opus_4_6

Защита от зависшего AI-stream

Нет timeout и fallback

Есть timeout + fallback на обычный chatModel.call()

codex_5_3

Понятность Telegram-рендера: что отправить, отредактировать или откатить

Чистая модель RenderedUpdate, сначала решение, потом side effects

Больше мутаций прямо в context/actions

opus_4_6

Память после рестарта и длинные треды

Память проще, без нового recovery-сценария

Восстановление истории из БД поверх уже существующей summarization

codex_5_3

Разделение progress и final answer в проектном streaming-контракте

Регрессия PARTIAL_ANSWER вместо FINAL_ANSWER_CHUNK

Контракт FINAL_ANSWER_CHUNK сохранён

codex_5_3

Тесты на chunk'и, tool calls и Telegram updates

Больше streaming-oriented тестов

Больше тестов вокруг новых фич

opus_4_6

Готовность к merge по ./mvnw verify -P e2e

Зелёный

Падал в REST test slice

opus_4_6

Полезные фичи сверх самого streaming loop

Меньше

Больше: URL hygiene, history recovery, batching для Telegram progress

codex_5_3

Если совсем коротко по таблице: opus_4_6 лучше держит архитектуру streaming-пайплайна, а codex_5_3 быстрее делает прикладные фичи, но вместе с ними и дополнительную сложность, и concurrency-риски.

Но тут сразу важная и смешная оговорка. Когда я позже попросил вывести sequence diagram / цепочку вызовов, выяснилось, что часть красивого архитектурного кода в opus_4_6, которую он расхваливал в review, вообще не запускалась. Тесты проходили не потому, что новый ReAct/FSM streaming-flow был правильно встроен, а потому что старый Spring AI streaming всё ещё работал и закрывал e2e-сценарии.

Но давайте всё равно представим, что opus_4_6 смог бы найти свои проблемы вовремя и дописал бы свою классную архитектуру.

Рассмотрим подробнее, что же нашли ИИ на review.

Review opus_4_6 ветки

В opus_4_6 лучше всего получилась граница между сырым потоком от модели и текстом, который уже можно показывать человеку.

Вся история с <think> и <tool_call> должна быть удалена в некоторых режимах до того, как пользователь увидит текст. В таких режимах отображается только финальный ответ пользователю. И вот тут StreamingAnswerFilter был на правильном месте: перед эмитом события в Telegram.

LLM в stream mode не отдаёт аккуратные готовые предложения. Она может прислать <th, потом следующим чанком ink>, потом кусок внутреннего reasoning, потом закрывающий тег. Поэтому недостаточно просто в конце взять полный текст и удалить из него <think>. К этому моменту кусок уже мог улететь пользователю.

У opus_4_6 идея была примерно такая:

StreamingAnswerFilter filter = new StreamingAnswerFilter();

chatModel.stream(prompt)
        .map(chunk -> chunk.getResult().getOutput().getText())
        .map(filter::feed)
        .filter(visibleText -> !visibleText.isBlank())
        .doOnNext(visibleText ->
                ctx.emitEvent(AgentStreamEvent.partialAnswer(visibleText, iteration)))
        .blockLast();

String tail = filter.flush();
if (!tail.isBlank()) {
    ctx.emitEvent(AgentStreamEvent.partialAnswer(tail, iteration));
}

То есть дальше по цепочке идёт уже очищенный текст. Если модель прислала что-то такое:

"Ответ: "
"<th"
"ink>internal reasoning</think>"
" результат"
"<tool_call>...</tool_call>"

то Telegram/UI должен увидеть только:

Ответ:  результат

А в codex_5_3 часть логики была ближе к обработке stream chunk'ов и частично добивалась уже post-processing'ом. Упрощённо опасное место выглядит так:

StringBuilder fullText = new StringBuilder();

chatModel.stream(prompt)
        .map(chunk -> chunk.getResult().getOutput().getText())
        .doOnNext(delta -> {
            fullText.append(delta);
            ctx.emitEvent(AgentStreamEvent.partialAnswer(delta, iteration));
        })
        .blockLast();

String sanitized = sanitizeFinalAnswerText(fullText.toString());

sanitizeFinalAnswerText(...) потом может всё правильно вычистить, но для Telegram это уже поздно. delta уже могла попасть наружу.

opus_4_6 создал TelegramBuffer, построил renderer вокруг RenderedUpdate: сначала решаем, что надо сделать с сообщением, и только потом отдельный слой реально идёт в Telegram API.

RenderedUpdate update = renderer.render(event, context);
telegramActions.apply(update, context);

В codex_5_3 больше логики было завязано на мутацию context/actions. На таком streaming-flow оно быстрее становится местом, где ты боишься трогать один сценарий, потому что можешь сломать другой, а второй поток просто всё сломает.

Review codex_5_3 ветки

Первое - timeout для stream-вызова. В opus_4_6 был обычный blockLast(). Если LLM-провайдер начал stream и не завершил его нормально, обработка могла зависнуть. В codex_5_3 стоял blockLast(Duration.ofMinutes(10)), а если stream не успел отдать ни одного чанка, код уходил в обычный chatModel.call(...). Если часть чанков уже пришла, ситуация сложнее. Но для пустого или не стартовавшего stream это полезная страховка.

Второе - восстановление истории после рестарта. codex_5_3 добавил сценарий, где пустая in-memory ChatMemory восстанавливается из уже сохранённой истории разговора в БД. Для пользователя Telegram это выглядит просто: бот не должен забывать разговор только потому, что приложение перезапустилось. Пользователь пишет в тот же чат и ожидает, что агент хотя бы примерно помнит прошлый контекст. Т.е. история была и раньше, но могла не подтянуться из бд в некоторых сценариях. А ещё если при восстановлении истории сообщения могли задублироваться, кодекс добавил дедупликацию и гарантировал загрузку истории.

Третье - проверка ссылок. В codex_5_3 появился UrlLivenessCheckerImpl, который отсекает явно нерабочие URL перед показом пользователю. Это не решает проблему галлюцинированных ссылок полностью: живая ссылка всё ещё может быть нерелевантной, но мёртвые ссылки теперь можно вычистить.

Четвёртое - правила ReAct prompt'а были вынесены из основного agent loop, а для простых запросов появился отдельный путь без tools и итераций. Это давало больше контроля над тем, какие инструкции получает модель: язык ответа, обязательные аргументы tool calls, история предыдущих шагов. Правда, тесты на этот слой были минимальными.

Итого

opus_4_6 был лучше именно в архитектуре streaming pipeline: как идут чанки, где режутся теги, где принимается решение по Telegram-сообщению, где делится длинный текст. А codex_5_3 быстрее тащил новые возможности и исправлял баги, ничего не переусложнял, но, возможно, со временем код бы был менее поддерживаемым. Почему opus_4_6 не дошёл до всех этих проблем? Вероятно они просто не воспроизвелись, ведь код работал по старому и не вызывал новый код.

Баги, которые ИИ нашли друг у друга

Что могло сломаться

opus_4_6

codex_5_3

Риск

Stream может зависнуть без timeout, и пользователь просто не дождётся ответа

Да

Нет

Высокий

История диалога может побиться при параллельных обращениях

Нет

Да

Высокий

Telegram progress может потерять кусок ответа или показать его не в том порядке

Риск ниже

Риск выше

Высокий

Thinking/status и финальный ответ могут смешаться в одном streaming-flow

Да

Нет

Высокий

Полный ./mvnw verify -P e2e не проходит

Нет

Да

Блокер

Генерация слабо отменяется, даже если результат уже не нужен

Да

Да

Средний

Чем больше recovery, URL-checking и Telegram batching, тем больше нового состояния

Меньше

Больше

Средний

Вывод

Я не стал брать ни одну из двух веток целиком, а взял лучшее из обеих.

Второй эксперимент: codex_5_3 против gpt_5_5

После сравнения Codex и Claude я окончательно убедился, что Codex подходит для моих задач больше и выходит дешевле. Поэтому на следующем эксперименте я сфокусировался на сравнении двух моделей. К тому моменту вышла gpt_5_5, и раз уж codex_5_3 оказался неплох, то стоило сравнить его с новой моделью.

Я взял codex ветку после 1 эксперимента как основную, но тесты всё ещё были нестабильны: бот плохо справлялся со стримингом ответа в Telegram. Я снова целиком скопировал проект в соседнюю папку и сделал ветки codex_5_3 и gpt_5_5.

Review codex_5_3

codex_5_3 взялся за ту часть кода, которая принимает сообщение пользователя и отправляет ответ в Telegram. Поэтому результат был не самый аккуратный, но полезный.

В этой ветке бот уже не пытался редактировать Telegram-сообщение после каждого нового фрагмента мгновенно. Он копил промежуточный текст, отправлял обновления реже, а финальный ответ показывал отдельно, как и планировалось. Во второй итерации он ещё и начал обрабатывать часть случаев 429 Too Many Requests: если Telegram просил подождать несколько секунд, бот ждал и пробовал отправить сообщение снова, так как у Telegram есть лимиты.

Результат gpt_5_5

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

Вывод

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

А codex_5_3, модель исключительно хорошая для разработческих задач, она шла и выполняла всё в цикле, как профессиональный разработчик, с фокусом на деталях. На работе я также использовал её в assistant coding и она также справлялась с большинством задач.

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

Это поведение, кстати, подтверждается документацией Anthropic opusplan-model-settingopusplan в Claude Code: Opus используется для plan mode, а для execution Claude Code переключается на Sonnet. Также они добавили /adviser на модели Opus. Потому скажу, что мой эксперимент был для достаточно специфичного условия - запускать агента автономно с минимальным числом самописных сабагентов. И лично для меня это показательно.

Codex-5-3, запущенный в телеграм-боте без доп. контроля исключительно для автономного development'a для java пет-проекта в моём сетапе, подходит лучше. Для всего остального придётся экспериментировать, писать тестовые harness'ы.