Claude Haiku 5.5 и 4.5: классификация, извлечение, сводки
Сравнение Haiku 5.5 и 4.5 на реальных запросах к API: классификация, извлечение и сводки. Проверьте JSON-контракты, учёт использования и безопасный порядок миграции.
Claude Haiku 5.5 стоит оценить для повторяющихся задач в приложениях, но прежде чем заменять ею Haiku 4.5, нужно проверить, соответствует ли вывод вашему контракту. В нашем небольшом тесте Ofox обе версии вернули ожидаемые значения для классификации и извлечения данных. Структура сводок различалась, и обе версии оборачивали ответы в блоки кода Markdown, несмотря на просьбу вернуть JSON. Ответ, который выглядит правильным, не обязательно подходит для передачи строгому JSON-парсеру.
В статье сравниваются три искусственно составленные задачи, отправленные через реальный API, приводятся записанные результаты и описывается процедура миграции для разработчиков, поддерживающих пакетную обработку или серверную часть приложения. Тест не устанавливает, какая модель в целом точнее, быстрее или дешевле. На каждую задачу для каждой модели отправили по одному запросу — всего шесть запросов; схема структурированного вывода не задавалась.
Anthropic представила Haiku 5.5 7 октября, позиционируя её для задач с большим объёмом запросов, включая классификацию и составление сводок. Эти заявления о продукте следует отличать от узких наблюдений, приведённых ниже.

Скриншот реального интерфейса Ofox, снятый 12 октября: на нём показаны идентификатор модели и пример с Anthropic SDK. В приведённом ниже сравнении используется отдельно заданный маршрут Chat Completions; этот скриншот показывает справочную конфигурацию, а не успешность оценки.
Условия теста
Мы использовали https://api.ofox.io/v1/chat/completions, max_tokens: 1800 и следующие точные ID Ofox:
anthropic/claude-haiku-4.5
anthropic/claude-haiku-5.5
Температуру и параметры рассуждений мы явно не задавали. Значения по умолчанию, маршрутизация и учёт токенов могут различаться у провайдеров. Поэтому одинаковый пользовательский текст не гарантирует одинакового фактического вычислительного бюджета. В запросах не было данных клиентов, реальных заказов или персональной информации.
В наборе материалов для скачивания есть запросы, записанные ответы с удалёнными служебными полями рассуждений и скрипты. Запуск скриптов API отправляет реальные запросы и может повлечь расходы за использование; сначала проверьте их и задайте собственный ограниченный бюджет тестирования. Первоначальные наблюдения датированы запуском теста и не генерируются заново при каждом просмотре этой страницы.
| Задача | Ожидаемые данные | Критерий приёмки |
|---|---|---|
| Классифицировать четыре обращения | A — billing; B — technical; C — account; D — billing | Точное соответствие ожидаемых ID и меток |
| Извлечь данные заказа | BX-71; количество 12; дата доставки отсутствует; EUR | Сохранить типы «целое число» и null; не придумывать дату |
| Составить сводку встречи | Maya; крайний срок — 14 октября; пилот только на английском; цена не определена | Сохранить утверждённое решение и нерешённый вопрос; отдельно проверить структуру |
В запросе на составление сводки перечислялись именованные поля, но формальная схема не задавалась. Такой тест полезен для выявления риска интеграции, но не доказывает, что модель не способна следовать схеме, соблюдение которой обеспечивается явно.
Результаты: значения и структура ответа проверяются отдельно
| Задача | Haiku 4.5 | Haiku 5.5 |
|---|---|---|
| Метки обращений | Возвращены четыре ожидаемые метки | Возвращены четыре ожидаемые метки |
| Извлечение данных заказа | Ожидаемые поля и значения, в том числе дата доставки null | Ожидаемые поля и значения, в том числе дата доставки null |
| Структура сводки | Массив tasks верхнего уровня с отдельными записями | Запрошенные поля на верхнем уровне |
| Строгий JSON непосредственно из текста | Есть блоки кода Markdown | Есть блоки кода Markdown |
Для классификации и извлечения значения совпали после удаления единственного внешнего блока кода. Если ваш обработчик напрямую вызывает json.loads(response_text), такой же ответ приведёт к ошибке разбора. Заранее определите и задокументируйте, принимает ли обработчик один блок кода; не исправляйте молча произвольный некорректный вывод, пока он не станет похож на ожидаемый ответ.
Сводка Haiku 5.5 представляла собой плоский объект:
{
"owner": "Maya",
"deadline": "2026-10-14",
"decision": "English-only pilot approved",
"unresolved": "Price undecided"
}
В Haiku 4.5 черновик письма, одобрение пилота и неопределённая цена вместо этого были сгруппированы в отдельные записи задач. В такой структуре содержалась полезная информация, но обработчик, ожидающий поля верхнего уровня owner и deadline, их не нашёл бы. При одном образце и недостаточно определённой схеме ответственный вывод — проверить и обеспечить соблюдение контракта интеграции, а не утверждать, что одна версия всегда лучше составляет сводки.
В плоском объекте действие по подготовке письма тоже подразумевается, а не указывается явно. Если бизнес-процессу нужны и действие, и решение, задайте для них отдельные поля. «Соответствует схеме» и «содержит все важные для работы факты» — два разных критерия приёмки.
Наблюдаемая задержка и число токенов
Это длительность запросов, измеренная на клиентской стороне, и число токенов, указанное API. Показатели учитывают выбранный маршрут через шлюз и не являются измерением только времени вычислений модели.
| Задача | 4.5, секунды | 5.5, секунды | 4.5, входные / выходные токены | 5.5, входные / выходные токены |
|---|---|---|---|---|
| Классификация | 1,833 | 1,791 | 64 / 43 | 89 / 45 |
| Извлечение | 1,750 | 1,779 | 61 / 49 | 88 / 46 |
| Сводка | 1,979 | 2,411 | 64 / 142 | 87 / 191 |
В этом запуске запрос на сводку к версии 5.5 выполнялся дольше. Это единичное наблюдение не опровергает более общие заявления поставщика и не позволяет предсказать задержку в вашей рабочей среде. Прежде чем менять целевые показатели уровня обслуживания, повторите тест на репрезентативных примерах, учитывайте ошибки и соберите распределение задержек.
Не считайте слова в видимом ответе оплаченными выходными токенами. Записывайте возвращаемые поля usage и сверяйте их с данными о запросе у провайдера. В таблице приведены данные, возвращённые API; она не объясняет все различия во внутреннем учёте и не заявляет окончательную сумму в долларах.
При планировании бюджета сравнивайте стоимость одного принятого результата, а не только тарифы на входные и выходные токены. Практический шаблон расчёта:
cost per accepted result =
reconciled spend across initial attempts, retries and fallbacks
/ number of results that pass your acceptance rules
Не исключайте из числителя ни отклонённые результаты, ни резервные вызовы. Если принятых результатов нет, отношение не определено, а не равно нулю. Прежде чем рассчитывать расходы, проверьте актуальные тарифы конкретного провайдера и применимые уровни кэширования или контекста. В этой статье намеренно не приводится фиксированное заявление об экономии при использовании Ofox.
Задайте более строгий контракт для извлечения данных
Начните с запроса, в котором явно указаны правила для отсутствующих значений и типов. Это улучшенный шаблон, а не запрос, использованный для приведённых выше измерений:
Extract only facts explicitly present in the input.
Return a single JSON object, without Markdown or commentary.
Keys must be exactly:
order_id: string
quantity: integer
delivery_date: ISO YYYY-MM-DD string, or null if not stated
currency: three-letter currency code, or null if not stated
Do not infer a delivery date from today's date.
Do not convert an unknown value to an empty string.
Input:
Order BX-71 contains 12 notebooks. Delivery is not scheduled.
Total: 48 EUR.
Проверяйте полученный объект в коде. Если выбранный маршрут поддерживает вывод с ограничением по схеме, проверьте эту возможность на конкретных модели и конечной точке, прежде чем внедрять её: в наших тестах только по запросам эта возможность не проверялась.
import json
def validate_order(text):
value = json.loads(text) # Strict: intentionally rejects code fences.
expected = {"order_id", "quantity", "delivery_date", "currency"}
if not isinstance(value, dict) or set(value) != expected:
raise ValueError("Unexpected object shape")
if not isinstance(value["order_id"], str):
raise ValueError("order_id must be a string")
if type(value["quantity"]) is not int:
raise ValueError("quantity must be an integer")
# Fixture-specific assertions; replace with production business rules.
if value != {"order_id": "BX-71", "quantity": 12,
"delivery_date": None, "currency": "EUR"}:
raise ValueError("Fixture facts do not match")
return value
Проверка точных значений подходит для этого искусственно составленного примера. Валидатор для рабочей среды также должен учитывать предметные правила: допустимые значения валюты, корректные даты и идентификаторы записей. Нельзя сравнивать каждую запись клиента с BX-71.
Перейдите на новую версию, не теряя записи с ошибками
Храните ID модели в явной конфигурационной переменной и не удаляйте исходную модель, пока замена не пройдёт репрезентативную оценку. Для каждого входного сообщения записывайте стабильный ID записи, версию запроса, ID модели, число попыток, возвращённые данные об использовании, статус валидации и результат. Сохраняйте ошибки как записи, а не удаляйте соответствующие строки из пакетной обработки.
Начните с небольшого размеченного набора, включающего типичные и пограничные случаи: отсутствующие даты, противоречивую информацию, неизвестные категории, пустой ввод, необычно длинный текст и встроенные во входные данные инструкции. Считайте входные документы данными. Они не должны подменять инструкции по извлечению или выбирать произвольные инструменты.
Отдельно сравнивайте смысловую приемлемость, синтаксис JSON и структуру. Прежде чем расширять развёртывание, разберите расхождения. На этапе ограниченного развёртывания сохраните старый маршрут как контролируемый резервный вариант, установите предел повторных попыток и отслеживайте дублирующую обработку. Если запрос завершается по тайм-ауту, он всё равно мог дойти до провайдера; не исходите из того, что использование не было учтено.
Для классификации определите, что делать, если ни одна из разрешённых меток не подходит. Для сводок задайте, какие факты допустимо опускать. Для извлечения данных определите, должны ли неоднозначные поля становиться null или отправляться на проверку человеком. Такие решения обычно сильнее влияют на корректность приложения, чем одна лишь замена строки с названием модели.
Если вы также используете Claude Code, отдельно проверьте его подключение с помощью руководства по диагностике различий между curl и клиентом. Успешный вызов текстового API ничего не говорит о работе инструментов или конфигурации вашего клиента для программирования.
Часто задаваемые вопросы
- Показала ли Haiku 5.5 лучший результат во всех трёх тестах?
- Оснований для такого общего вывода нет. Обе версии вернули ожидаемые значения для классификации и извлечения данных. Структура сводок различалась; в каждом измеренном ответе были блоки кода Markdown, которые строгий JSON-парсер отверг бы.
- Всегда ли Haiku 5.5 обходится дешевле за выполненную задачу?
- Этот тест этого не доказывает. Сравнивайте фактически принятые результаты, все повторные попытки и резервные вызовы, актуальные тарифы провайдера и сверенные данные об использовании. Одного лишь более низкого тарифа недостаточно, чтобы оценить стоимость выполнения задачи целиком.
- Можно ли перейти на новую версию, изменив только ID модели?
- Возможно, этого хватит, чтобы отправить запрос, но для проверки миграции приложения этого недостаточно. Повторно проверьте синтаксис вывода, поля, полноту по смыслу, лимиты, задержку и поведение при откате.


