Проверяющие схемы и правила
Обеспечение соблюдения ограничений
«Проверяющие схемы и правила» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
Валидаторы обеспечивают соблюдение контракта
Валидатор — это защитный механизм, который проверяет вывод на соответствие явной спецификации: схеме JSON, набору бизнес-правил или им обоим. В отличие от классификатора модерации, валидатор детерминирован и полностью поддаётся аудиту: один и тот же вход всегда даёт один и тот же вердикт.
Слой проверки схемы
Первый валидатор проверяет, что вывод соответствует структурному контракту. Собирайте все ошибки, а не только первую, чтобы обратная связь для исправления была полной.
import jsonschema
def schema_errors(obj, schema):
v = jsonschema.Draft202012Validator(schema)
return [f"{list(e.path) or 'root'}: {e.message}"
for e in v.iter_errors(obj)]За пределами схемы: бизнес-правила
Схемы не могут выразить всё. Схема может указать, что discount — это число, но не то, что оно не должно превышать промежуточную сумму. Валидаторы правил кодируют такие инварианты, связывающие несколько полей и учитывающие предметную область.
RULES = [
('discount_le_subtotal', lambda o: o['discount'] <= o['subtotal']),
('total_consistent', lambda o: o['total'] == o['subtotal'] - o['discount']),
('currency_supported', lambda o: o['currency'] in SUPPORTED)
]
def rule_errors(o):
return [name for name, fn in RULES if not fn(o)]Типизированные модели как валидаторы
Библиотека типизированных моделей, например Pydantic, одновременно служит генератором схем и валидатором, поддерживая специальные валидаторы для правил. Ошибка разбора и есть вердикт.
from pydantic import BaseModel, field_validator
class Order(BaseModel):
subtotal: float
discount: float
total: float
@field_validator('discount')
@classmethod
def discount_ok(cls, v, info):
if v < 0:
raise ValueError('discount must be non-negative')
return vВалидаторы опоры на источники и цитат
Для выводов RAG проверяйте, что утверждения подтверждаются предоставленным контекстом. Требуйте от модели указывать идентификаторы источников, затем проверяйте условие exists для каждого указанного идентификатора и убеждайтесь, что цитируемые фрагменты действительно встречаются в источнике. Отклоняйте ответы, в которых указаны отсутствующие или выдуманные источники.
def citations_valid(answer, sources):
for cite in answer['citations']:
if cite['source_id'] not in sources:
return False
if cite['quote'] not in sources[cite['source_id']]:
return False
return TrueПроверки ссылочной целостности и межсистемные проверки
Некоторые правила требуют внешних запросов: существует ли указанный идентификатор заказа, есть ли товар в наличии, попадает ли дата в допустимый интервал? Эти валидаторы обращаются к вашим системам. Поддерживайте их высокую скорость, используя кэширование и пакетную обработку, поскольку они находятся на пути формирования ответа.
def order_exists(o):
return db.exists('SELECT 1 FROM orders WHERE id = %s', o['order_id'])Вердикты с указанием уровня критичности
Не все нарушения одинаково важны. Помечайте каждое правило уровнем критичности, чтобы конвейер мог выбрать правильное действие: безусловно блокировать критические нарушения, генерировать ответ заново при проблемах качества и пропускать с предупреждением незначительные нарушения.
RULE_SEVERITY = {
'discount_le_subtotal': 'critical',
'total_consistent': 'critical',
'tone_professional': 'warning'
}Объединяйте валидаторы в порядке выполнения
Запускайте валидаторы начиная с самых дешёвых и немедленно прекращайте проверку при безусловных сбоях: сначала схема, затем правила в памяти, потом внешние запросы и, наконец, проверки с оценкой моделью. Это снижает затраты на наиболее распространённом пути отклонения.
def validate_all(obj):
errs = schema_errors(obj, SCHEMA)
if errs: return Reject(errs, 'critical')
errs = rule_errors(obj)
if errs: return Reject(errs, max_severity(errs))
if not order_exists(obj): return Reject(['order_id'], 'critical')
return Accept()Валидаторы формируют обратную связь для исправления
Польза валидатора многократно возрастает, когда его сообщения поступают в цикл исправления. Формируйте ошибки, пригодные для машинной обработки, с указанием пути к полю, нарушенного правила и значения, вызвавшего ошибку, чтобы модель могла точно исправить её за один шаг.
{'errors': [
{'path': 'discount', 'rule': 'discount_le_subtotal',
'got': 120, 'limit': 100}
]}Тестируйте сами валидаторы
Ошибочный валидатор незаметно пропускает плохой вывод или блокирует хороший. Тестируйте каждое правило модульными тестами на положительных и отрицательных наборах данных, а для числовых инвариантов добавляйте тесты на основе свойств. Набор валидаторов — это критически важный для рабочей системы код, а не скрипт.
def test_discount_rule():
assert rule_errors({'discount':10,'subtotal':100,'total':90}) == []
assert 'discount_le_subtotal' in rule_errors(
{'discount':120,'subtotal':100,'total':-20})Валидаторы и ограниченное декодирование
Ограниченное декодирование предотвращает структурные ошибки во время генерации, но не может обеспечить соблюдение смысловых требований: оно не знает ваших бизнес-правил. Валидаторы выявляют смысловые нарушения постфактум. Используйте оба подхода: декодирование — для формы, валидаторы — для смысла, а цикл исправления — для устранения расхождений.
Быстрая проверка
Схема JSON указывает, что скидка и промежуточная сумма являются числами. Модель возвращает скидку 120 при промежуточной сумме 100. Какой слой должен это обнаружить?
Итоги
Валидаторы схем и правил:
- Проверка схемы охватывает структуру, а валидаторы правил — смысл.
- Типизированные модели создают схемы и выполняют проверку в одном месте.
- Для RAG и потоков данных добавляйте проверки опоры на источники, цитат и ссылочной целостности.
- Указывайте критичность, выполняйте проверки начиная с самых дешёвых и передавайте точные ошибки для исправления.
- Тестируйте валидаторы как критически важный для рабочей системы код.
Далее: проверка с помощью самокритики, когда модель проверяет собственный вывод.
Изучай AI Prompt Engineering с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 53
- Уроки
- 199
Часто задаваемые вопросы
Урок «Проверяющие схемы и правила» бесплатный?
Да — полный текст урока «Проверяющие схемы и правила» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «Проверяющие схемы и правила»?
Обеспечение соблюдения ограничений Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Проверяющие схемы и правила»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое защитные ограничения
- Фильтрация входных и выходных данных
- Проверяющие схемы и правила
- Проверка с помощью самокритики