Принцип работы: Код решает, ИИ предлагает
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 ↗
