Сколько раз вы ловили LLM на вранье?
Она пишет уверенно, с фактами, ссылками. А потом оказывается, что цитаты вымышлены, даты перепутаны, а JSON — невалидный. И это не баг, это фича больших языковых моделей. Они не умеют проверять себя. А вы умеете? Quale умеет за вас.
Мы привыкли, что LLM галлюцинируют — это их вторая натура. Но что, если поставить между моделью и пользователем фильтр, который отсеет очевидный бред? Именно такую задачу решает Quale — легковесная Python-библиотека для пост-валидации ответов LLM. Без GPU, без датасетов, без переобучения. Просто цепочка проверок.
Quale (от лат. qualis — «какой») — открытый инструмент, который задаёт вопрос «какого качества этот ответ?» и не стесняется ругаться, если ответ — откровенный мусор.
Анатомия Quale: как это работает
Quale — это не ещё один прокси-сервер или фреймворк для промптов. Это набор валидаторов, которые вы цепляете к выводу любой LLM. Каждый валидатор возвращает Pass или Fail, и если хотя бы один провалился — Quale может либо просто предупредить, либо попросить модель перегенерировать ответ, либо вовсе заблокировать вывод.
Встроенные валидаторы на май 2026:
- FactCheck — сверяет факты с предоставленным контекстом (RAG-friendly).
- JSONValidator — проверяет, что ответ парсится в заданную схему (Pydantic, JSON Schema).
- RegexGuard — отсекает ответы, не соответствующие регулярному выражению (например, формат даты).
- LogiCheck — ловит внутренние противоречия (модель сказала A и не-A в одном абзаце).
- NoSycophant — специальный валидатор против подлизывания, который мы уже обсуждали в статье про sycophancy.
Звучит логично, но есть нюанс: на каждый запрос Quale делает дополнительный вызов LLM (или несколько). Времени это добавляет, зато нервов экономит кучу.
Установка и первый запуск
Ставится одной командой:
pip install qualeВсё. Никаких внешних зависимостей, кроме pydantic и httpx (для вызова моделей). Интеграция с любым провайдером — OpenAI, Anthropic, локальные модели через Ollama или llama.cpp. Для локального запуска LLM можете подсмотреть наш гид по Ollama.
Пример использования — допустим, вы хотите, чтобы голосовой ассистент всегда возвращал время в формате HH:MM и не выдумывал города.
from quale import Quale, RegexGuard, FactCheck# Создаем пайплайн
q = Quale(guards=[
RegexGuard(pattern=r'^\d{2}:\d{2}$', field='time'),
FactCheck(context="Текущее время в Москве 14:30, в Лондоне 12:30")
])# Ответ от GPT-4o (или любой другой модели)
response = "Сейчас в Москве 14:30"result = q.validate(response)
if result.failed:
print(f"Ошибка: {result.reasons}")
else:
print("Ответ чист")
Если модель ответит "14-30" — RegexGuard завернёт. Если скажет "15:00" без контекста — FactCheck поймает. Quale не даст уйти непроверенному бреду.
Сравнение с альтернативами: Quale vs Guardrails vs NeMo
| Критерий | Quale | Guardrails AI | NVIDIA NeMo Guardrails |
|---|---|---|---|
| Размер | ~200 КБ | ~5 МБ | ~50 МБ (с CUDA) |
| Необходимость GPU | Нет | Нет | Опционально |
| Кастомные валидаторы | Простой Python-класс | YAML + Python | Сложно, свой язык Colang |
| Интеграция с Tool Calling | Прямо из коробки | Через парсеры | Только кастом |
| Кривая обучения | Почти плоская | Средняя | Крутая |
Quale выигрывает в простоте и лёгкости. Guardrails AI предлагает больше встроенных «рейлов» (rails), но настраивать их через YAML — то ещё удовольствие. NeMo — монстр для enterprise, с ним вы потратите день на конфиги, если захотите просто проверить формат даты. Quale же делает одно дело хорошо и без претензий.
Разработчикам, которые активно используют Tool Calling с локальными LLM, Quale сэкономит часы отладки — он напрямую валидирует аргументы вызовов инструментов.
Кому Quale нужен кровь из носу?
- Разработчикам чат-ботов. Если ваш бот выдаёт расписание автобусов 1987 года — клиенты этого не оценят.
- Инженерам RAG-систем. Quale умеет сверять ответы с источниками, это как сверка с оригиналом, только автоматическая.
- Тем, кто устал от галлюцинаций в коде. Валидируйте не только JSON, но и Python-код, сгенерированный LLM, на синтаксис и типы.
- Исследователям. Quale упрощает бенчмарки — не нужно писать костыли для проверки каждой строчки вывода.
Не советую так делать: не вешайте валидацию на каждый чих. Если ваш use-case терпит единичные ошибки — Quale только замедлит процесс. Используйте его там, где цена ошибки высока: финансы, медицина, юридические консультации, автогенерация кода в проде.
Кстати, в архитектуре двухслойной валидации, о которой мы писали в разборе документации, Quale мог бы заменить собой первый слой — быстрая проверка кода на семантику, а второй слой (юридическая экспертиза) остаётся человеку. С Quale вы просто пишете: q.add(FactCheck(source_doc)) — и готово.
Бонус: как Quale помогает бороться с «сикофантией»
В статье «Как заставить LLM перестать подлизываться» мы разбирали, как модели склонны соглашаться с пользователем, даже если тот неправ. Quale решает это элегантно — валидатор NoSycophant сравнивает ответ с нейтральным референсом (например, выводом той же модели без контекста пользователя). Если два ответа совпадают по сути — всё ок. Если ответ явно подстраивается под юзера — валидатор кричит «STOP». Работает неидеально, но лучше, чем ничего.
А для тех, кто предпочитает «заставить LLM врать с доказательствами», а не гадать — есть проект CausaNova, где Quale может использоваться для проверки каузальных объяснений на непротиворечивость.
Наш совет: попробуйте Quale на небольшом датасете ошибок, который вы собрали с продуктива. Часто оказывается, что 80% галлюцинаций ловятся простым FactCheck и RegexGuard. Не усложняйте. И не верьте LLM на слово — проверяйте Quale.