Крупная модель выдумала мне клиента. Как я выбирал ИИ для агента заявок по эталону, а не по рейтингам
В заявке был только вопрос: ни названия компании, ни контакта, ни суммы. Модель на 30 миллиардов параметров всё равно заполнила поле «контрагент». Модель в два с лишним раза легче оставила его пустым. Так я и выбрал, какая модель будет работать в моём агенте приёма заявок.
Что делает агент
Агент разбирает входящие заявки: письмо и вложения — Word, Excel, сканы — превращаются в одну карточку с полями. Контрагент, бюджет и валюта, срок, количество, контактное лицо, ИНН, почта. Дальше правила оценки, которые менеджер меняет сам, ставят вердикт «браться / не браться / нужна проверка». В CRM ничего не уходит, пока человек не одобрит заявку. Каждый шаг пишется в журнал.
Самое дорогое место — извлечение. Если модель ошиблась в бюджете, правила честно посчитают вердикт по неверной цифре, и менеджер будет решать по ней же. Поэтому модель я выбирал не по рейтингам, а по тому, как она справляется именно с этой работой.
Всё работает локально на одном ноутбуке: модель, распознавание текста, база. Заявки синтетические.
Сначала ответы, потом модели
Я написал эталон: 10 заявок и 67 фактов, которые из них должны быть извлечены. Ответы записал руками до первого прогона — иначе легко подогнать ожидания под то, что выдала модель.
В эталон специально положил ловушки, потому что ошибки живут в них:
- заявка-вопрос без данных — все поля должны остаться пустыми;
- переписка, где в старом письме указана прошлогодняя цена;
- самопоправка в тексте: «3 млн — нет, 3,5 млн»;
- два контрагента в одной заявке — генподрядчик и конечный заказчик;
- смета из Excel в виде таблицы;
- английская заявка в евро со сроком, написанным словами;
- ИП без бюджета и срока, только с почтой.
Результат считает скрипт: сравнивает каждое поле с ответом. Каждую модель прогонял дважды и считал второй, тёплый проход. Перед следующей моделью предыдущая выгружалась из памяти.
Первая находка: схема важнее модели
Модель заполняет поля по JSON-схеме. В первой версии схемы поля были необязательными — и модель просто пропускала часть из них: контрагента, предмет заявки, позиции. Не ошибалась, а молча не заполняла.
Когда я сделал все поля обязательными, на той же заявке все поля стали верными, а ИНН и почта, которых в тексте не было, остались пустыми, а не выдуманными.
Вывод простой: если поле необязательное, модель имеет право его не заполнить — и пользуется этим правом.
Пять моделей на пяти заявках
Перед замером проверил, что нового вышло в библиотеке локальных моделей: за месяц список обновляется заметно, и вчерашний лидер может оказаться не лучшим. Отобрал модели, которые помещаются в 24 ГБ памяти вместе с распознаванием текста и базой.
Первый прогон — на пяти заявках, 37 фактов:
- gemma4:12b (7,6 ГБ): 37 из 37, 20,5 с на заявку.
- qwen3:30b (18 ГБ): 35 из 37, 12,8 с. Ошиблась в почте у ИП и взяла бюджет из ловушки.
- qwen3.5:9b (6,6 ГБ): 34 из 37, 18,3 с. Ошиблась в дате срока, бюджете и валюте в ловушке.
- qwen3.8:27b (17 ГБ): 37 из 37, 86,2 с.
- granite4.2:8b (5 ГБ): 29 из 37, 11,0 с. Ошибки в датах, бюджетах и количестве в английской заявке.
qwen3.8 шла параллельно со сборкой фронтенда и браузером, часть замедления — от этого. Но и без поправки плотная модель на 17 ГБ не быстрее 12-миллиардной и не точнее её на этом наборе.
Ловушка с бюджетом — это та самая прошлогодняя цена из старого письма. Две модели взяли её вместо актуальной.
Десять заявок: где крупная модель выдумала клиента
Во второй прогон оставил двух финалистов и расширил эталон до 10 заявок и 67 фактов:
- gemma4:12b: 67 из 67, 22,7 с на заявку.
- qwen3:30b: 64 из 67, 17,8 с. Потеряла почту у ИП, взяла прошлогоднюю цену и выдумала контрагента.
Третья ошибка и стала решающей. В заявке-вопросе нет ни названия, ни контакта, а qwen3:30b заполнила поле «контрагент». Это ровно то, чего агент делать не должен: пустое поле человек заметит и уточнит, а правдоподобное выдуманное название пройдёт дальше.
qwen3:30b при этом быстрее: у неё 30 миллиардов параметров, но в каждом ответе работают около 3 миллиардов. Только скорость в этой задаче — не главное. 18 секунд вместо 23 на заявку ничего не меняют, когда заявок десятки в день. А выдуманный клиент в CRM стоит дороже.
Где я обжёгся
Память. Пока qwen3:30b держала в памяти 18 ГБ из 24, распознавание документов на видеокарте упало с нехваткой памяти. Перевёл его на процессор — это стоит примерно секунду на документ, зато больше не зависит от того, сколько памяти занимает модель.
Кириллица в сканах. Без явно заданного языка распознавание прочитало «Счёт № 2026-0912 Итого 48 500 руб.» как «Cuët Ne 2026-0912 Nτoro 48 500 py.». Одна настройка языка — и тот же скан читается верно. Если бы я не смотрел на сырой текст, списал бы такие ошибки на модель.
Первый выбор оказался неверным. После первой проверки на одной заявке по умолчанию стояла qwen3:30b — на той заявке она была точнее и быстрее меньшей qwen3.5:9b. Решение отменил только эталон на нескольких заявках. Одна заявка — не статистика.
Что получилось
По умолчанию в агенте gemma4:12b: 67 из 67 фактов, 7,6 ГБ памяти, около 23 секунд на заявку на ноутбуке с Apple M4 Pro и 24 ГБ.
Эталон пригодился и дальше. Когда я менял промпт, чтобы защитить агента от инструкций, спрятанных в документах, прогнал его снова: 67 из 67, качество не упало. На отдельном наборе из пяти английских заявок — 43 из 43 фактов, и 5 из 5 вердиктов совпали с посчитанными вручную.
Модель в агенте можно заменить на облачную или другую локальную. Но менять её я буду так же: сначала прогон эталона, потом решение.
Шесть выводов для тех, кто выбирает модель под свою задачу
- Сначала ответы, потом модели. Эталон с ответами, записанными до прогонов, — единственное, что отличает замер от впечатления.
- Кладите в эталон ловушки: пустую заявку, старую цену, самопоправку, два контрагента. Самые показательные ошибки — выдуманный клиент и прошлогодняя цена — пришлись именно на ловушки.
- Считайте «выдумала» отдельно от «ошиблась». Пустое поле лучше правдоподобного.
- Делайте поля схемы обязательными. Иначе модель будет молча их пропускать.
- Больше — не значит точнее, быстрее — не значит лучше. На этой задаче модель на 7,6 ГБ обошла модель на 18 ГБ.
- Перед выбором проверьте, что вышло нового. Список моделей меняется каждый месяц.
Оговорки
Заявки синтетические и написаны одним автором, «сканы» — сгенерированные изображения. Модели локальные, облачные не проверялись. Замеры на пяти заявках — один прогон на модель, разброс не оценивался; температура 0. Прогон qwen3.8 шёл параллельно с другими задачами на машине. Время на длинных вложениях не мерилось. Агент — мой демо-проект, все цифры — из файлов замеров.
А вы по чему выбирали модель для своей задачи — по рейтингам, по цене или по своему набору примеров?