Kev — компактные модели принятия решений на базе Qwen3.5

· 2 мин чтения
llm decision-models fine-tuning open-source python
📂 Исходный код на GitHub

Семейство компактных моделей принятия решений, построенных на Qwen3.5, с возможностью самостоятельного обучения и запуска

Kev — компактные модели принятия решений на базе Qwen3.5

Kev — это семейство компактных моделей принятия решений, построенных на базе Qwen3.5. Автор проекта — Jared Palmer (создатель React Query и TanStack). Модели решают задачи классификации тикетов, маршрутизации обращений, оценки тональности и других сценариев, где нужна вероятностная оценка вместо однозначного ответа. Веса опубликованы, код обучения открыт, API совместим с TypeSafe System One.

Типы задач

Kev поддерживает три типа вопросов в одном запросе:

  • noul — бинарный ответ да/нет с вероятностью (подходит для триггеров типа «нужна ли эскалация?»)
  • choice — множественный выбор из 1–255 вариантов с вероятностями по каждому
  • score — рейтинговая оценка по шкале от 2 до 255 уровней

Ключевая особенность — вопросам передаётся общий текст (state), но они не видят результатов друг друга. Это гарантирует изоляцию: классификация отдела не влияет на оценку тональности.

Модели

Модель База Точность (train) Точность (new sources) Brier (new)
Kev-0.8B Qwen3.5-0.8B-Base 0.829 0.643 0.513
Kev-4B Qwen3.5-4B-Base 0.877 0.794 0.316
Kev-9B Qwen3.5-9B-Base 0.876 0.812 0.291

Для сравнения: hosted-модель Jev показывает 0.857 на new sources. Kev-9B отстаёт на ~4.5 п.п., но это open-weight модель с полным контролем над данными и обучением.

Старое поколение на Qwen3 (0.6B, 4B, 8B) всё ещё доступно и работает быстрее на Apple Silicon — на Mac модели Qwen3.5 из-за отсутствия быстрых ядер для DeltaNet-слоёв отрабатывают в разы дольше.

Запуск и API

Минимальный стек: Python 3.12+, uv, CUDA или Apple Silicon. Сервер поднимается одной командой:

uv sync --extra serve
KEV_DTYPE=bf16 uv run --extra serve python -m kev.serve --run jaredpalmer/kev-4b --port 8009

Пример запроса — маршрутизация тикета поддержки:

{
  "state": "Shoes arrived two weeks late and in the wrong size. Also I see two charges on my card.",
  "model": "kev-latest",
  "questions": {
    "department": {"type": "choice", "instructions": "Which team should handle this?",
                   "criteria": {"returns": "Exchanges, refunds", "shipping": "Delivery delays", "billing": "Charges, invoices"}},
    "escalate":   {"type": "noul",  "instructions": "Does this need urgent human attention?"},
    "frustration":{"type": "score", "instructions": "How frustrated is the customer?",
                   "criteria": ["Calm", "Frustrated", "Very angry"]}
  }
}

Ответ содержит вероятности по каждому варианту, confidence и latency. Для Python-интеграции есть SDK TypeSafe, совместимый с тем же сервером.

Обучение и fine-tuning

Базовое обучение с нуля:

uv run python -m kev.train --suite evals/v7/decision-v7 --base Qwen/Qwen3.5-4B-Base \
    --epochs 2 --lr 5e-5 --batch 4 --accum 2 --dtype bf16 --device cuda --out runs/kev-4b

Для адаптации под свой домен (свои категории маршрутизации, свои правила эскалации) доступен fine-tuning через --init_from:

uv run python -m kev.train --data train.jsonl --base Qwen/Qwen3.5-4B-Base --init_from jaredpalmer/kev-4b \
    --epochs 2 --lr 2e-5 --batch 1 --accum 8 --dtype bf16 --device cuda --out runs/mine

Формат данных — JSONL, тот же что и API-запросы, но с полем label на каждом вопросе. Файнтюнинг с --init_from сохраняет базовые знания модели и добавляет доменную специфику: в тесте на 836 решениях поддержки fine-tune с init_from набрал 0.88 на новом домене против 0.33 при обучении с нуля.

Для масштабных экспериментов есть интеграция с Modal — каждый триал получает выделенный H100, результаты сохраняются при отключении.

Оценка

Эталонные данные заморожены в evals/. Бенчмарк отвечает за accuracy, Brier score, калибровку, долю автоматизируемых решений при 5% бюджете ошибок и влияние порядка вариантов. Внешние тесты включают 144 решения из SemIf и 900 тикетов поддержки из scienthoon — Kev-9B показывает 0.952 на маршрутизации и 0.911 на тональности.

Ограничения

  • Вероятности плохо калиброваны на новых данных: Kev-4B называет >= 0.9 вероятности для неверного ответа в 8.2% случаев
  • Fine-tuning может ухудшить отдельные навыки базовой модели (арифметика дат — яркий пример)
  • На Apple Silicon модели заметно медленнее (Kev-4B: 779 мс vs 174 мс для Qwen3-версии)
  • Порядок вариантов в choice может влиять на ответ
  • Сервер обрабатывает один запрос за раз

Источник: https://github.com/jaredpalmer/kev