anfisa.phone
Блог

Блог · 5 августа 2026 · 5 мин

Модель не читала звонок, она копировала пример из своей же инструкции

Половина спам-меток в базе оказалась не результатом анализа, а строкой, скопированной из примера в промпте. Разбор ошибки, доказательство и что мы изменили.

Мы разбираем звонки языковой моделью: расшифровка попадает в промпт, модель возвращает разбор в виде структуры с полями. Одно из полей отвечает на вопрос, что это было за обращение: реальный клиент, нецелевое обращение, спам.

Однажды мы открыли звонок, помеченный как спам, и увидели там живого клиента с конкретным запросом. Один такой случай можно списать на шум модели, поэтому мы пошли смотреть, сколько их.

Что нашлось в базе

У одного клиента 44 звонка с меткой спам, это 42,7% всех спам-звонков, содержали в поле причины дословную строку из примера в нашей же инструкции. У второго клиента то же самое в 50% случаев. Если считать шире, под литералы промпта попадало около 59% и около 56% спам-меток соответственно.

Модель не анализировала разговор. Она копировала кусок текста, который мы сами ей показали как образец правильного ответа.

Почему это трудно заметить

Ответ выглядел корректно: структура правильная, поля заполнены, значения осмысленные, ничего не падало и не писало ошибок в лог. Отчёты собирались, проценты считались, в кабинете всё было зелёное.

Разница между «модель разобрала звонок и решила, что это спам» и «модель скопировала слово спам из примера» на уровне данных не видна вообще. Видна она только тогда, когда открываешь конкретный разговор и читаешь его глазами.

Это общее свойство ошибок в работе с языковыми моделями: обычный баг падает и зовёт на помощь, а ошибка в промпте молча выдаёт правдоподобный результат, и вы строите на нём отчёты месяцами.

Как мы доказали, что это системная ошибка, а не совпадение

Помогло то, что наш продукт работает на нескольких клиентах, а инструкция для модели у каждого своя: в ней своя номенклатура, свои типичные ошибки, свои примеры под отрасль.

Значит, если модель копирует пример, то у каждого клиента она будет копировать именно его пример, и совпадений между клиентами не будет.

Проверили: заглушки у клиентов оказались разными и не пересекались ни в одном звонке. Один запрос к базе закрыл вопрос, показав воспроизводимое поведение, которое зависит от текста инструкции, а вовсе не случайные галлюцинации на отдельных разговорах.

Три изменения, которые это чинят

Пример перестал выглядеть как ответ. В схеме промпта мы писали значения-образцы готовыми строками, а для модели такая строка синтаксически неотличима от указания, что писать. Теперь на этом месте стоит описание в скобках вида «категория рекламодателя», скопировать нечего.

Решающее поле встало первым. Порядок полей в схеме имеет значение: модель фиксирует решение на раннем поле и подгоняет под него остальные. Поле с типом обращения теперь идёт первым, а не после трёх описательных.

Правила категорий переехали в общий слой. Раньше определения того, что считать спамом, а что нецелевым обращением, жили в трёх независимых копиях внутри отраслевых инструкций, и копии разошлись: у одной категории было правило и готовый пример, у другой не было ничего. Теперь таксономия общая для всех клиентов, а в отраслевой части остаётся только отраслевое.

Плюс защита в коде: если модель всё-таки вернула значение, совпадающее с литералом из инструкции, оно не сохраняется. Задним числом эта же проверка почистила 72 исторических звонка.

Что получилось и что осталось

На эталонном наборе разборов после исправления модель совпала с ручной разметкой в 17 случаях из 21, и из четырёх расхождений два спорят с нашими же неуверенными метками, то есть модель там скорее права.

Два оставшихся расхождения настоящие. Модель до сих пор иногда метит спамом разговор, где никто ничего не продаёт: внутреннюю рабочую переписку коллег или бытовую просьбу, хотя по смыслу такой разговор относится к нецелевым. Цена ошибки низкая, обе категории означают «не клиент», поэтому мы записали дефект открытым и городить эвристику не стали.

Отдельно приятно было увидеть, что три звонка, из-за которых всё началось, переклассифицировались правильно сами, без ручной правки. Значит, чинили причину, а не симптом.

Что из этого следует

Пример в инструкции для модели это часть инструкции. Всё, что выглядит как готовый ответ, рано или поздно будет возвращено как ответ. Показывать формат надо так, чтобы копировать было нечего.

Один и тот же промпт в нескольких копиях расходится. Не «может разойтись», а расходится: правки вносят в ту копию, которая под рукой. Общие правила должны лежать в одном месте, даже если это неудобно.

Проверять работу модели надо на данных, а не на ощущении. Мы месяц смотрели на отчёты, где всё сходилось, а вопрос закрылся за полчаса, когда мы задали базе конкретный вопрос про конкретную строку.

Разберём неделю ваших звонков и покажем, что в них происходит. Обычно это занимает один день.

Оставить заявку