Циклы исправления некорректного вывода
Если JSON не разбирается, отправьте ошибку модели и попросите её исправить вывод.
«Циклы исправления некорректного вывода» — бесплатный урок AI Agents на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Даже строгие режимы иногда дают сбой
Старые модели, особые случаи или провайдеры без строгого режима иногда возвращают некорректный JSON. Надёжные агенты восстанавливаются, прося модель исправить результат.
Basic Repair Loop
from pydantic import ValidationError
import json
def call_with_repair(messages, schema, max_attempts=3):
for attempt in range(max_attempts):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
response_format={'type': 'json_object'}
)
raw = response.choices[0].message.content
try:
return schema.model_validate_json(raw)
except (json.JSONDecodeError, ValidationError) as e:
messages.append({'role': 'assistant', 'content': raw})
messages.append({
'role': 'user',
'content': f'That output failed to validate: {e}.\nReturn ONLY valid JSON that matches the schema. No prose, no markdown fences.'
})
raise RuntimeError('Could not get valid output after repair attempts.')Почему это работает
Модель видит сообщение об ошибке и обычно исправляет результат на следующем шаге. Добавьте явные инструкции:
- «Без пояснений»
- «Без блоков Markdown»
- «Используйте точно такую форму: ...»
Удаление ограждений Markdown
Модели часто заключают JSON в ```json ... ```. Удалите эти ограждения перед разбором:
import re
def extract_json(text):
m = re.search(r'```(?:json)?\s*(.*?)```', text, re.S)
if m:
return m.group(1).strip()
return text.strip()
sample = '```json\n{"name": "Alice"}\n```'
print(extract_json(sample))
Выделение по первым скобкам
Если присутствуют лишние пояснения, выделите фрагмент от первой { до последней соответствующей }:
def find_json_slice(text):
start = text.find('{')
if start == -1:
return None
depth = 0
for i, c in enumerate(text[start:], start):
if c == '{': depth += 1
if c == '}':
depth -= 1
if depth == 0:
return text[start:i+1]
return None
sample = 'Here is your answer: {"name": "Alice", "age": 30} - hope that helps!'
print(find_json_slice(sample))
Инструменты, которые делают это за вас
- Instructor — объединяет Pydantic, циклы исправления и повторные попытки
- Outlines — гарантированные структурированные результаты с помощью управляемого декодирования
- jsonformer — проверка JSON на уровне каждого токена (модели HF)
Рабочие запросы для исправления
Включите конкретное сообщение об ошибке и краткое напоминание о формате:
repair_prompt = f'''
Your previous output had this error: {error}
Fix the output. Requirements:
- Valid JSON only
- Match this schema: {json.dumps(schema)}
- No prose, no markdown fences
'''Стоимость циклов исправления
Каждое исправление — это ещё один вызов LLM. Ограничьте число повторных попыток (2–3 достаточно: после этого модель вряд ли восстановится) и записывайте долю исправлений как показатель качества.
Исправления как показатель качества
Если доля исправлений превышает 5%, что-то не так: запрос неясен, схема слишком сложна или модель слишком мала. Проведите исследование.
Альтернатива: управляемое декодирование
Модели с открытым исходным кодом поддерживают декодирование с ограничениями грамматики — модель вообще не может создать недопустимый результат. Это делают Outlines, jsonformer и грамматики llama.cpp.
Альтернатива: функции вместо схемы
Принудительный вызов инструмента со строгим режимом — более чистая альтернатива режиму JSON с последующим исправлением. Используйте её всякий раз, когда провайдер это поддерживает.
Запись некорректных результатов
Записывайте каждый исправленный результат, чтобы анализировать закономерности:
log.warning('Repaired output', extra={'raw': raw, 'error': str(e), 'attempt': attempt})Когда следует остановиться
Если после N попыток исправления результат всё ещё недопустим, верните пользователю ошибку — не придумывайте запасной вариант. Честная ошибка лучше незаметного искажения данных.
Шаблон цикла исправления
Каков самый простой первый шаг в цикле исправления?
Итоги
Обнаружьте ошибки разбора, добавьте их как сообщение инструмента или пользователя и попросите модель исправить результат. Ограничьте число повторных попыток. Предпочитайте вызовы инструментов в строгом режиме, чтобы полностью устранить эту необходимость.
Изучай AI Agents с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 60
- Уроки
- 239
Часто задаваемые вопросы
Урок «Циклы исправления некорректного вывода» бесплатный?
Да — полный текст урока «Циклы исправления некорректного вывода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Циклы исправления некорректного вывода»?
Если JSON не разбирается, отправьте ошибку модели и попросите её исправить вывод. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Циклы исправления некорректного вывода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Режим JSON и вывод вызова инструментов
- Проверка схемы Pydantic
- Циклы исправления некорректного вывода
- Instructor / Outlines для гарантированной структуры