Блог • AWS / Bedrock
Структурированный вывод Claude в Amazon Bedrock гарантирует форму JSON—зачем журналам batch и скопированному чату всё равно нужна локальная трёхшаговая проверка?
19 октября 2026 AWS объявила structured outputs для Claude в Bedrock: constrained decoding с JSON Schema, schema через output_config, strict tools, additionalProperties:false. Batch и streaming включены.
Полное сравнение structured output — в руководстве по structured output 2026. Валидный schema не заменяет проверку прав — см. статью schema недостаточно. Как JSON Schema связывает tools и ответы: зачем ИИ нужен JSON Schema. Эта статья — только о трёх локальных шагах после Bedrock.
- Запросы Bedrock кладут JSON Schema в output_config.format с additionalProperties:false.
- API гарантирует форму одного ответа Invoke — не логи, batch-файлы и копии из консоли.
- Локально: (1) JSON Schema validate, (2) JSON repair после markdown-ограждений, (3) построчная проверка JSONL в batch.
- Один TICKET_SCHEMA для образцов API, строк логов и batch — локально ловить enum, пропуски и лишние поля.
Решение: Bedrock отвечает за форму ответа API; логи, batch и скопированный чат всё равно требуют локального validate schema, repair ограждений и проверки строк JSONL.
Что Bedrock добавил для Claude 19 октября?
AWS пишет в официальном What's New: structured outputs для Claude в Bedrock с constrained decoding, strict tools, batch и streaming.
Технические детали — в блоге AWS Machine Learning. Гарантия API — не конец журнального pipeline.
Как прикрепить JSON Schema в output_config?
В Bedrock output_config.format.type = json_schema, определение объекта в schema. additionalProperties:false на корне. Пример: ticket_id, priority (enum), summary.
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Return one support ticket as JSON."
}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"additionalProperties": false,
"required": ["ticket_id", "priority", "summary"],
"properties": {
"ticket_id": { "type": "string" },
"priority": { "enum": ["low", "medium", "high"] },
"summary": { "type": "string", "maxLength": 200 }
}
}
}
}
}
Batch часто — JSONL, строка на запись. Стриминг, склеенный на клиенте, Bedrock повторно не проверяет.
Зачем validate локально, если API гарантирует форму?
Тело Invoke на стороне Bedrock соответствует schema, но артефакты искажаются: префиксы логов, экранирование CloudWatch, ограждения ```json, пустые или обрезанные строки batch.
{
"ticket_id": "TCK-1042",
"priority": "high",
"summary": "Bedrock batch row passed constrained decoding"
}
Если priority = urgent или появляется owner, SLA срабатывает неверно. SAMPLE_BAD — enum вне диапазона; ловите тем же TICKET_SCHEMA.
{
"ticket_id": "TCK-1042",
"priority": "urgent",
"summary": "enum value not in schema"
}
Какой TICKET_SCHEMA локально?
Используйте JSON Schema , чтобы зафиксировать поля и enum. priority только low/medium/high; additionalProperties:false отклоняет лишние ключи. Прохождение — только форма.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": false,
"required": ["ticket_id", "priority", "summary"],
"properties": {
"ticket_id": {
"type": "string",
"description": "Support ticket ID, e.g. TCK-1042"
},
"priority": {
"enum": ["low", "medium", "high"]
},
"summary": {
"type": "string",
"maxLength": 200
}
}
}
| Что видно | Схема | Локально |
|---|---|---|
| priority = urgent | Не проходит: enum без urgent. | Отклонить ingest или на ручную проверку. |
| ticket_id — число | Не проходит: нужен string. | Repair или удалить строку batch. |
| лишнее поле owner | Не проходит: additionalProperties:false. | Убрать поле или отклонить запись. |
Что исправляет каждый локальный шаг?
Bedrock — онлайн-декодер, JSONNote — офлайн QA. Порядок: JSON по schema, repair ограждений, строки JSONL.
| Шаг | Что обрабатывает |
|---|---|
| JSON Schema validate | Образцы API, фрагменты из логов, строки после repair. |
| JSON repair (markdown-ограждения) | Блоки ```json``` из Playground или чата. |
| проверка строк JSONL | Batch Bedrock: каждая строка parse + schema отдельно. |
Как выполнить три шага в JSONNote?
- 1Шаг 1: validate schema
Откройте JSON Schema. TICKET_SCHEMA в первое поле, SAMPLE_OK или JSON из лога во второе.
- 2Шаг 2: repair ограждений
Откройте JSON Repair. Вставьте чат с ```json, снимите ограждения, снова validate.
- 3Шаг 3: строки JSONL
Откройте инструмент JSONL. Загрузите batch Bedrock, проверьте parse каждой строки; TICKET_SCHEMA для enum или обрезки.
Вопросы
Можно ли пропустить локальный validate с Bedrock?
Нет. API гарантирует только текущее тело Invoke. Логи, batch, копии и кэши нужно снова проверять тем же schema в приложении.
Как связаны strict tools и schema output_config?
Оба используют JSON Schema при декодировании, но на разных слоях: аргументы tools и output_config. Храните schemas отдельно для локальных проверок.
Нужно ли перезапускать весь batch при сбое одной строки JSONL?
Не обязательно. JSONL-инструмент для номера строки, TICKET_SCHEMA для enum, обрезки или синтаксиса. Повтор только failed строк — дешевле полного batch.
Нужно ли additionalProperties:false в локальной schema?
Да. Выравнивайте schema запроса Bedrock и локальный TICKET_SCHEMA — иначе API и ingest расходятся.
Нужны ли streaming-ответам проверки JSONL?
Streaming: склеить один ответ, затем Schema + Repair. JSONL только для многострочных batch-файлов.
Итог
Bedrock фиксирует ответы Claude API в JSON Schema; batch, склеенный streaming, логи и вставка всё ещё ломают форму.
Решение: онлайн — output_config Bedrock; офлайн — тот же TICKET_SCHEMA, Repair ограждений, JSONL для batch.
Дальше: validate образцов Bedrock, Repair скопированных ограждений, JSONL для batch.