Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи? Написать
Дайджесты новостей
Контрастная модель CLM для мгновенной верификации действий ИИ-агента через сравнение эмбеддингов состояния среды и безопасных команд.

Открытые модели CLM и Jev: быстрая верификация шагов ИИ-агентов

При разработке автономных ИИ-агентов, решающих задачи программирования и системного администрирования, одной из главных проблем остается проверка каждого шага. В средах тестирования (harness-системах) вызов тяжелой LLM на каждое промежуточное действие обходится дорого по времени и токенам. Без валидации же ошибки накапливаются, и на длинных цепочках шагов агент теряет цель.

Исследовательская группа System One (Стэнфорд и Nvidia) открыла исходный код и веса моделей-верификаторов под лицензией Apache 2.0. В репозитории Contrastive-LM/CLM опубликованы модели Jev и Contrastive Language Model (CLM-8B), созданные для быстрой оценки решений агентов.

Контрастное обучение вместо тяжелого RL

Ранняя модель Jev использовала метод Reinforcement Learning for Calibrated Decisions (RLCD). Она последовательно генерировала вероятности токенов в авторегрессионном режиме, что на длинных цепочках шагов создавало высокую задержку.

В CLM разработчики перешли на контрастное обучение (Contrastive Learning) с функцией потерь InfoNCE. Модель сближает эмбеддинг текущего состояния среды ($s$) с вектором правильного действия ($a$) и отталкивает его от ошибочных альтернатив.

Архитектура CLM разделена на два уровня:

  1. Замороженная модель Qwen3-8B в режиме пулинга (pooling) через vLLM.
  2. Два обучаемых линейных проекционных слоя (state head и action head) общим объемом всего 20 млн параметров.

Это позволяет кэшировать эмбеддинги типовых действий один раз. При оценке нового шага вычисляется только эмбеддинг состояния, а ранг действия находится через быстрое скалярное произведение. В задачах навигации и работы в консоли CLM работает до 9 раз быстрее Jev.

Интеграция и оценка рисков в Python

Сервер clm-serve на базе FastAPI предоставляет типизированный API для оценки рисков и выбора действий:

from clm import CLMClient, Choice, Noul, Score

client = CLMClient()

currentState = (
    "Агент выполнил миграцию базы данных. "
    "Вывод команды: 'migration failed: relation users already exists'. "
    "Агент планирует выполнить: drop table users;"
)

# Оценка рисков и выбор безопасного действия
response = client.system_one(
    state=currentState,
    questions={
        "is_destructive": Noul(instructions="Является ли запланированное действие разрушительным?"),
        "recommended_action": Choice(
            instructions="Какое действие должен предпринять агент?",
            criteria={
                "abort": "Прервать выполнение и запросить подтверждение пользователя",
                "inspect_schema": "Проверить текущее состояние схемы базы данных",
                "force_apply": "Принудительно перезаписать таблицы",
            },
        ),
        "risk_level": Score(
            instructions="Оцените уровень риска операции от 0 до 2",
            criteria=["Низкий", "Средний", "Критический"],
        ),
    },
)

print("Разрушительное действие:", response.answers["is_destructive"].noul)  # > 0.95
print("Выбранное решение:", response.answers["recommended_action"].choice)   # 'abort'
print("Уровень риска:", response.answers["risk_level"].score)              # ~ 1.9

Для выбора лучшей команды из списка кандидатов применяется прямое ранжирование эмбеддингов:

from clm import Engine

engine = Engine(emb_url="http://127.0.0.1:8090/v1/embeddings")

statePrompt = "Пользователь запросил: 'Найди все ошибки 500 в access.log за последний час'."

candidateCommands = [
    "cat access.log | grep ' 500 ' | tail -n 50",
    "rm -rf /var/log/nginx/access.log",
    "grep 'HTTP/1.1 500' /var/log/nginx/access.log | awk '{print $1, $7}'",
]

rankedResults = engine.rank(statePrompt, candidateCommands)

for item in rankedResults:
    print(f"Ранг {item['rank']}: {item['candidate']} (Вероятность: {item['prob']:.3f})")

Результаты в бенчмарках

На сложных многошаговых задачах программирования модель показала высокие результаты: 87.6% на Terminal-Bench 2.1 и 81.6% на DeepSWE.

Дообучение 20-мегабайтных проекционных слоев занимает считанные минуты на одной видеокарте RTX 4090. Веса доступны на Hugging Face (Contrastive-LM/CLM-v0.1-8B), а в октябре ожидается мультимодальная версия CLM-35B.