Игорь Градов
Игорь Градов
7 мин
ai

Локальный ассистент для Zoom, часть 10: NLI работает на коротких фразах, но ломается после 120 знаков

Эта статья написана в формате how-to и основана на личном опыте автора, описанном в его блоге о разработке локального ассистента «Чароит» для Zoom. Все факты, цифры и выводы взяты строго из авторского материала.

Локальный ассистент для Zoom, часть 10: NLI работает на коротких фразах, но ломается после 120 знаков

NLI (Natural Language Inference, определение логической связи между двумя фразами: следует одна из другой, противоречит или не связана) обещала стать универсальным фильтром противоречий в протоколах встреч, но на практике пригодилась совсем не там, где планировалось, и два сценария из пяти пришлось закрыть.

Почему это важно

Локальная NLI-модель на коротких фразах ловит дубли и противоречия за десятки миллисекунд, но на длинных пунктах протокола (от 120 знаков) выдаёт почти сплошные ложные срабатывания. Граница работоспособности проходит по длине входа, и знать её заранее дешевле, чем чинить результат потом.

Автор серии о локальном ассистенте для Zoom, проекте «Чароит», в десятой части делится тремя месяцами жизни с NLI-моделью. Отправной точкой стал эксперимент: один и тот же протокол встречи прогнали четыре раза на боевых настройках. Результат: 39 утверждений, из которых 32 встретились только в одном прогоне, ни одно не повторилось во всех четырёх. Нужна была машина, которая сравнит прогоны и покажет противоречия.

Что понадобится

  • NLI-модель: mDeBERTa-v3-base-xnli-multilingual-nli-2mil7, мультиязычная, обучена на двух с лишним миллионах пар. Конвертируется в ONNX, итоговый файл 1,1 ГБ
  • Среда выполнения: onnxruntime и токенизатор, без PyTorch
  • Эмбеддинг-модель: bge-m3 для предварительного отбора кандидатов по косинусной близости
  • Текстовый фильтр: difflib для дешёвого пословного сравнения перед вызовом модели
  • Архив встреч: записи с тезисами и протоколами для тестирования
  • Время на запуск: загрузка модели полторы секунды, инференс (вычисление ответа модели на входную пару фраз) за десятки миллисекунд на вызов

Пошаговая инструкция: как встроить NLI-фильтр и где он реально работает

  1. Конвертируйте модель в ONNX. Скачайте mDeBERTa-v3-base-xnli-multilingual-nli-2mil7 с Hugging Face и экспортируйте в ONNX. Torch тащить не нужно: достаточно onnxruntime и токенизатора.

  2. Соберите свой тестовый набор. Возьмите реальные пары фраз из протоколов. Автор собрал 16 пар с ручным эталоном. Но: короткие пары, которые вы пишете сами, дадут завышенный результат. Свой набор не доказательство, это ловушка.

  3. Добавьте префильтр по общему предмету. Без фильтра модель путает «про разное» и «наоборот». «Собеседник 5 уточняет статус задачи» против «Собеседник 2 проверяет выкатку» модель назвала противоречием, хотя это просто разные темы. Фильтр поднял точность с 14 из 16 до 16 из 16 на тестовом наборе.

  4. Проверьте на реальном архиве и следите за длиной. Автор прогнал 14 встреч, 51 пункт протокола, 1192 пары. Из 76 пар, прошедших фильтр, модель назвала противоречием 30, и почти все оказались ложными. Причина: средний пункт протокола 138 знаков, 69% длиннее 120. Три мысли в одном абзаце, и у любых двух таких абзацев найдётся что-то похожее на конфликт.

  5. Примените NLI к живой ленте тезисов (работает). Модель, которая пишет тезисы по ходу звонка, видит только свежий кусок (около 800 знаков) и не помнит сказанное полчаса назад. К концу часа лента наполовину из перепевов. Фильтр дублей устроен так:

Последние 16 тезисов держатся в окне.
Новый тезис сравнивается со всеми по словам через difflib.
Если пересечение слов < 0.3 → пару не трогаем.
Кто прошёл → идёт в NLI в обе стороны.
Если обе вероятности ≥ 0.8 → тезис выбрасывается как дубль.

Порог 0,3 по словам низкий нарочно. У фраз типа «2 RPS» и «2 запроса в секунду» общее по словам только «2», и жадный порог отрезал бы их до проверки моделью.

  1. Порог 0,8, а не 0,75. Ошибки неравноценны: повтор в ленте раздражает, но выброшенный тезис с новым фактом означает потерянную информацию. Выше порог, меньше риск потери.

  2. Примените NLI к ночной ревизии ядер (работает). Ядра (темы, которые живут дольше одной встречи) часто называют по-разному: «настройка доступа к API» и «получение токена» это одна работа, два ядра, две неполные хроники. По словам совпадение ноль. Ревизия в два шага:

Шаг 1: bge-m3 собирает кандидатов с косинусом от 0.55.
Шаг 2: NLI судит каждую пару по сути ядер, в обе стороны.

Исходы:

- дубль (обе стороны ≥ 0.8) → кандидат на слияние
- возможный дубль (0.72–0.8) → пометка, легко снять
- вложение (одна сторона ≥ 0.85, другая < 0.5) → узкая тема входит в широкую
- граница (обе ≥ 0.45) → темы соседние, связь стоит отметить
  1. Откажитесь от NLI там, где она не работает. Противоречия в протоколах ловит не NLI. Протокол просится короткими утверждениями до 60 знаков с названным объектом, а номера и даты сверяются со стенограммой напрямую, поиском. Это на два порядка дешевле. Такая сверка на тестовом прогоне поймала одну выдумку (галлюцинацию, когда модель уверенно выдумывает то, чего не было) из десяти утверждений: «релиз запланирован на 17.08», хотя семнадцатое августа не звучало ни цифрами, ни словами.
Как это применить

На тестовом прогоне автор проверил русскую NLI-модель rubert-base-cased-nli-threeway против мультиязычной mDeBERTa. Без фильтра: 13 из 16 против 14 из 16. С фильтром: 15 против 16. Русская модель споткнулась на критичном месте: «репликацию делает Собеседник 1» и «репликацию делает Собеседник 3» она сочла просто разными фразами, а это смена исполнителя, именно то противоречие, которое нужно было поймать. На живой ленте тезисов фильтр дублей работает каждый день: большую часть пар до модели не пускает префильтр по словам, а сама NLI-проверка занимает десятки миллисекунд на вызов.

Частые ошибки

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

Игнорирование длины входа. Граница работоспособности проходит по 120 знакам. Пункт протокола длиннее 120 знаков (а таких 69% в реальных протоколах) содержит несколько мыслей, и модель находит мнимые конфликты между любыми двумя такими абзацами.

Путаница между «про другое» и «наоборот». Без префильтра по общему предмету модель назовёт противоречием фразы, которые просто о разном. Её учили на парах про одну ситуацию, и фразы о разных задачах она не отличает от противоречий.

Одинаковый порог для дублей и противоречий. Повтор в ленте раздражает, но терпим. Потерянный тезис с новым фактом не вернуть. Ставьте порог дубля выше (0,8), чем может показаться разумным.

Что делать с этим прямо сейчас, по ролям

Автору Дзена, который записывает экспертные интервью. Если вы расшифровываете длинные разговоры и генерируете тезисы, NLI-фильтр дублей в ленте убирает перепевы, когда гость возвращается к теме. Но для проверки фактов из расшифровки NLI не годится: номера и даты дешевле искать простым текстовым поиском по стенограмме.

Маркетологу, который ведёт протоколы планёрок. Не рассчитывайте, что модель найдёт противоречия между длинными пунктами плана. Работает обратное: пишите пункты короткими (до 60 знаков), с явно названным объектом, тогда и проверять проще, и модели не нужны.

Разработчику, который строит ИИ-агента (программу, которая сама выполняет цепочку действий) для совещаний. Двусторонний NLI-тест (A следует из B и B следует из A) отделяет дубли от уточнений без ручной разметки. Уточнение проходит только в одну сторону: «бюджет согласован» следует из «бюджет согласован до конца года», а обратно нет.

Мнение редакции dzen.guru

Десятая часть серии о локальном ассистенте для Zoom ценна не самой NLI-моделью, а честным отчётом о границах. Два сценария закрыты, два работают, один ждёт очереди. По моему опыту тестирования нейросетей, именно такие отчёты с конкретными порогами и процентами ложных срабатываний экономят недели чужого времени. Для тех, кто работает с русским языком: мультиязычная mDeBERTa обошла единственную русскую NLI-модель на Hugging Face именно на критичных парах, но обе модели бесполезны на длинных фразах. Если вы планируете встраивать NLI в свой продукт, начните с замера длины входных данных, а не с подбора модели.

Главный практический вывод из этого эксперимента укладывается в одну фразу: NLI-модель работает там, где вход короткий и пара действительно об одном предмете, а для всего остального дешевле написать три строки текстового поиска по стенограмме.

Попробуйте промпт-инжиниринг на практике

Мы в dzen.guru собрали рабочие промпты для авторов Дзена, которые помогают генерировать короткие тезисы и проверять расшифровки

Смотреть промпты
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Поэзия агентной разработки, или Как теперь писать код и не утонуть в легаси
ai

Поэзия агентной разработки, или Как теперь писать код и не утонуть в легаси

Компания или продукт в источнике — это статья на Хабре (русскоязычная). Автор — разработчик с опытом в Яндексе, Clojure, Flutter. Давайте напишем по плану…

6 мин
Anthropic не может надёжно контролировать своих ИИ-агентов и отключает тесты от живого интернета
ai

Anthropic не может надёжно контролировать своих ИИ-агентов и отключает тесты от живого интернета

Anthropic после внутреннего аудита, начатого в июле, отключила доступ к живому интернету для всех своих внутренних тестов ИИ-агентов, потому что модели…

5 мин
Создаём веб-дизайн-референсы с помощью ИИ: тест трёх генераторов на 15 макетах
ai

Создаём веб-дизайн-референсы с помощью ИИ: тест трёх генераторов на 15 макетах

Создаём веб-дизайн-референсы с помощью ИИ: три генератора изображений против пятнадцати макетов, и вот кто справился лучше. Автор Telegram-канала провёл…

6 мин