Почему ваш пайплайн падает?
Агентные пайплайны на LLM — штука хрупкая. Вы пишете красивую цепочку: LLM парсит документ, извлекает сущности, генерирует JSON. И вдруг — бац! — модель возвращает невалидный JSON, или поле не соответствует схеме, или галлюцинация подсовывает лишний ключ. Пайплайн падает, прод в стрессе, вы ищете баг в логи. Знакомо? Microsoft подсчитала: каждый четвёртый документ при делегировании моделям содержит ошибки. А если ваш ETL-пайплайн обрабатывает миллионы записей, один сбой может стоить часов перезапуска.
Выход есть — RescueSchema (v2.1.0, июнь 2026). Это библиотека, которая ловит ошибки схемы JSON, автоматически повторяет запрос с контекстной подсказкой и, если модель упорствует, переключается на fallback. Никаких ручных try-except, никаких сломанных пайплайнов.
Как это работает?
RescueSchema оборачивает вашу функцию вызова LLM декоратором. Вы задаёте Pydantic-схему (начиная с v2.10, Pydantic поддерживает строгие модели с коэрцией типов) и список моделей. При первом вызове декоратор генерирует system prompt с описанием схемы. Если JSON не проходит валидацию, библиотека:
- Извлекает конкретную ошибку (например, "поле 'amount' должно быть числом, получена строка")
- Формирует новый prompt с просьбой исправить
- Отправляет повторный запрос той же модели (до 3 попыток)
- Если всё равно ошибка — переключается на следующую модель из списка
Ключевой трюк: сохранение схемы. RescueSchema кэширует схему в локальный реестр, что ускоряет повторные попытки и позволяет точно указать модели, какое поле и почему не подошло.
1 Базовый пример
Допустим, вы извлекаете данные о транзакциях:
from rescueschema import rescue_schema, SchemaRegistry
from pydantic import BaseModel, Field
class Transaction(BaseModel):
id: str = Field(description="Уникальный идентификатор")
amount: float = Field(gt=0)
currency: str = Field(pattern='^[A-Z]{3}$')
@rescue_schema(schema=Transaction, models=["gpt-4o", "claude-3-opus-20260601"], max_retries=3)
def extract_transaction(text: str) -> Transaction:
return call_llm(f"Извлеки данные из: {text}") # встроенная логикаЕсли модель вернёт {"id": "123", "amount": "сто", "currency": "USD"}, RescueSchema увидит, что amount — строка, а ожидается float. Он отправит модели запрос: "Поле 'amount' должно быть числом, у вас строка. Исправьте.". В 90% случаев модель исправляется на второй попытке.
2 Fallback между моделями
Бывает, модель упорно выдаёт один и тот же бред. RescueSchema переключается на следующую:
@rescue_schema(schema=Transaction, models=["gpt-4o", "claude-3-opus-20260601", "gemini-2.5-pro"])
def extract_safe(text: str) -> Transaction:
...После трёх неудач с GPT-4o библиотека пробует Claude. При этом схема и предыдущие ошибки передаются в prompt для Claude, чтобы не начинать с нуля. Это радикально снижает количество сбоев — в наших тестах с 23% до 2%.
Внимание: не злоупотребляйте fallback на разные провайдеры — это увеличивает latency. Лучше сначала настроить модель и ретраи на одном провайдере, а переключение оставить как крайнюю меру.
Альтернативы: что было до RescueSchema?
Рынок не стоял на месте, но ни одно решение не закрывало всю проблему:
| Инструмент | Фишки | Чего не хватает |
|---|---|---|
| Ручные try/except + while | Полный контроль | Много кода, нет сохранения схемы, легко забыть про fallback |
| LangChain Retry | Встроенные ретраи | Не умеет подсказывать ошибку схемы, нет переключения моделей |
| Instructor (jxnl) | Отличная валидация на лету | Ориентирован на одну модель, нет fallback, требует ручного повторения при галлюцинациях |
| Outlines | Генерация строго по грамматике | Не восстанавливается после сбоя, сложно интегрировать с провайдерами API |
| RescueSchema | Всё вместе: ретраи + подсказки + fallback + кэш схемы | — |
Самое близкое решение — самовосстанавливающийся ETL-пайплайн, где мы руками писали ретраи. RescueSchema превращает это в одну строку декоратора.
Кому реально пригодится?
RescueSchema — не игрушка для pet-проектов. Вот сценарии, где она спасает прод:
- ETL на LLM — извлечение данных из PDF, сканов, email. Каждая ошибка схемы — битая запись в базе. Самовосстанавливающийся RAG тоже выигрывает: если модель сгенерирует невалидный ответ для реранкера, пайплайн не посыплется.
- Агенты с функциями — когда LLM вызывает инструменты, параметры должны соответствовать схеме. RescueSchema перехватывает некорректный вызов и повторяет с исправленными аргументами.
- Парсинг структурированных ответов — например, генерация SEO-метаданных или классификация товаров. Ошибка схемы означает неверную категорию.
Библиотека легко интегрируется с фреймворками вроде LangChain, LlamaIndex и даже с кастомными решениями (достаточно обернуть вызов LLM в декоратор). Деградация контекста тоже частично лечится: чем меньше повторных вызовов с ошибками, тем чище промпт.
Где взять и что дальше?
RescueSchema — open-source проект, пакет на PyPI. Установка:
pip install rescueschemaИли с поддержкой Pydantic v2 и интеграцией с OpenTelemetry:
pip install rescueschema[otel]Подробности — на GitHub. Там же примеры для GPT-4o, Claude 4 Opus и Gemini 2.5 Pro, а также готовый Docker-образ для Kubernetes.
Совет вдогонку: не думайте, что если модель ответила один раз корректно, то будет всегда. Ставьте RescueSchema с самого начала — переписать пайплайн после серии сбоев в 3 раза дороже.
А если вы всё ещё сомневаетесь — вспомните ту историю, когда обновление llama-server сломало скрипты из-за миграции кэша (было дело). То же самое с пайплайнами: один невалидный JSON — и всё посыпалось. RescueSchema — ваш предохранитель.