AIKraft Agents
Инструменты9 ноября 2026 г., 23:45 МСК🤖 Auto

Solvi: ИИ-решения с проверкой фактов и отказом от галлюцинаций

Новая среда Solvi позволяет разработчикам создавать системы принятия решений, где LLM лишь предлагает варианты, а жесткие правила и код гарантируют точность. Библиотека внедряет концепцию 'System 1 / System 2' в production-код.

Баннер новости 11563

Принцип работы: Код решает, ИИ предлагает

Solvi — это среда выполнения (runtime), которая меняет парадигму использования LLM. Вместо того чтобы доверять модели на 100%, Solvi использует гибридный подход: языковая модель (LLM) или классификатор выступают в роли 'System 1' (быстрые интуитивные предложения), а ваш Python-код и строгие правила — как 'System 2' (медленное, логическое подтверждение).

Ключевая особенность — абстиненция. Если модель не может подтвердить факт цитатой из текста или если жесткое правило (hard check) нарушено, система не гадает, а отказывается от ответа или эскалирует задачу человеку. Каждый ответ сопровождается хеш-цепочкой (hash-chained trace), позволяющей воспроизвести процесс принятия решения и найти ошибку.

Архитектура и готовые модули

Библиотека разделена на 'готовые системы' (ready systems) для конкретных задач и 'строительные блоки' (core). Основные модули:

  • solvi.document: Анализ документов. Извлекает факты (числа, даты) с указанием точных цитат и смещений (character offsets) в исходном тексте. Если текст неоднозначен, поле помечается как 'abstain'.
  • solvi.build: Классификация на основе размеченных примеров. Гарантирует уровень ошибок (max_risk) и автоматически переключается на медленный путь (LLM) только для сложных случаев.
  • solvi.Agent: Агент, действующий в среде. Использует 'Knowledge' (базу знаний с источниками) для планирования действий. Поддерживает 'RiskBudget' — управление рисками при автономных действиях.
  • solvi.Guard: Фильтр для вызовов инструментов (tool calls) агента, предотвращающий вредоносные или ошибочные действия.

Производительность и бенчмарки

В документации приводятся результаты тестирования модуля solvi.build на четырех стандартных наборах данных. Система показала конкурентоспособность с ручными настройками, требуя при этом в 2-4 раза меньше кода.

Набор данных Задача Результат Solvi (default) Сравнение с ручными настройками
Banking77 Классификация намерений Соответствует или превосходит Лучше соблюдение гарантий ошибок
Abt-Buy Классификация товаров Соответствует или превосходит Меньше кода, выше надежность
CUAD Извлечение контрактов Соответствует или превосходит Редкое использование медного пути (LLM)
RAGTruth Проверка фактов RAG Соответствует или превосходит Выше точность при тех же ограничениях

Технические детали и установка

Solvi требует Python 3.11+. Установка модульная, что позволяет минимизировать зависимости:

  • pip install solvi — базовый функционал (numpy, scipy, pydantic).
  • pip install solvi[model] — добавляет ModernBERT и PyTorch для извлечения полей.
  • pip install solvi[onnx] — запуск декодера на CPU без PyTorch (через ONNX Runtime).
  • pip install solvi[serve] — запуск HTTP-сервера через FastAPI/Uvicorn.
  • pip install solvi[duckdb] — хранение решений в DuckDB.

Для macOS на Intel есть известная проблема с torch.compile на Python 3.12+. Решается установкой переменной окружения SOLVI_NO_COMPILE=1 перед загрузкой модели.

Пример кода: Система возмещений

Простой пример показывает, как правило 'возврат в течение 30 дней' переопределяет решение модели. Если покупка была 45 дней назад, система принудительно отклоняет запрос, игнорируя уверенность LLM.

from solvi import Answer, Catalog, Question, System

def within_window(days_since_purchase):
    return days_since_purchase <= 30

cat = Catalog()
cat.rule("refund", lambda amount: "approve" if amount <= 200 else "review")
cat.check("refund", within_window, hard=True)

system = System(cat, [Question("refund", "Refund?", Answer(choice=["approve", "review", "reject"]))])
res = system.ask({"days_since_purchase": 45, "amount": 50})
# res.answer == "reject", res.status == "forced" (hard check override)

Источник: Github ↗