Подбор LLM для клиентского ИИ-агента: журнал экспериментов
Подбор LLM для клиентского ИИ-агента: полный журнал экспериментов
Период: 20 июня – 21 июля 2026 Объект: продовый RAG ИИ-агент крупного клиента (lk.boostbot, ~150–250 ответов клиентам в день)
1. Контекст и задача
Бот работает на архитектуре RAG: вопрос клиента → поиск по базе знаний (FAISS, эмбеддинги OpenAI) → топ-7 фрагментов + промт → LLM → ответ. Исходная модель — gpt-4o через прокси routerai.ru.
Стартовая точка: расход ~1000 руб/день только на один бот. Задача: снизить стоимость минимум в 2 раза без потери качества ответов клиентам.
Важное ограничение: бот отвечает живым клиентам про деньги (тарифы), возраст детей, график работы. Цена фактической ошибки высокая: клиент приезжает зря, приходит с ребенком, которого не пустят, закладывает неверный бюджет.
2. Методика
Эволюционировала по ходу — фиксируем честно:
- Первый тест — синтетический (8 придуманных вопросов). Быстро поняли, что этого мало.
- Дальше — только реальные вопросы клиентов из базы диалогов, батчами по 10–40, в конце — марафон на 200 вопросах за 3 дня.
- Одинаковые условия: каждой модели скармливался тот же самый контекст (промт + те же RAG-фрагменты + история диалога), что получала продовая модель в реальном диалоге. Сравнение — с реальным продовым ответом gpt-4o из базы.
- Судья — gpt-4o-mini: оценивал каждый ответ по верности (0–10), полноте (0–10), выносил вердикт «лучше/хуже/равно» и флаг «критичная просадка». Дешево (~$0.0003 за сравнение), масштабируемо.
- Ручная перепроверка топ-кейсов — обязательна: судья сам ошибается (см. раздел 9).
Цены моделей: где routerai возвращал фактическую стоимость — брали ее; где нет — считали по прайсам вендоров (помечено как оценка). Курс в пересчетах — 76–90 руб/$.
3. Хронология экспериментов с моделями
3.1. Синтетический тест: 8 вопросов × 4 модели (20.06)
| Модель | Стоимость 8 ответов | × дешевле gpt-4o | Латентность | Наблюдения |
|---|---|---|---|---|
| gpt-4o (baseline) | $0.2524 | 1× | 3.2 с | эталон |
| gpt-4o-mini | $0.0150 | 16.8× | 2.8 с | качество близко, местами короче |
| claude-haiku-4.5 | $0.1134 | 2.2× | 6.6 с | самый «умный» (сам добавил «с 1 июля новый прайс», нашел обе услуги-тезки), но эмодзи вопреки промту |
| deepseek-v3.2 | $0.0156 | 16.2× | 5.1 с | хорош, но иногда слишком краток |
Все 4 модели прошли edge-case («какая погода в Москве» → корректный отказ). Вывод на тот момент: mini и deepseek — кандидаты. Вывод оказался преждевременным — синтетика льстит.
3.2. Реальные вопросы, батч 1 (10 вопросов, 20.06)
gpt-4o-mini ($0.0167, 16.7×) vs deepseek-v3.2 ($0.0176, 15.8×) vs prod.
- deepseek дважды ответил ЛУЧШЕ прода: на «А для детей?» нашел больше услуг + бассейн, на вопрос про соц. тариф добавил будущую цену с 1 июля.
- gpt-4o-mini: паразитная фраза «Уточните пожалуйста, о чем именно идет речь?» в 3 ответах из 10 (артефакт правила из промта, который слабые модели применяют слишком агрессивно).
- Обнаружен side-баг нашего пайплайна: rephrase-шаг иногда превращает вопрос в готовый ответ («Спасибо» → «Пожалуйста! Если у вас возникнут еще вопросы...»).
3.3. Реальные вопросы, батч 2 (вопросы 11–20, 20.06)
- deepseek-v3.2, вопрос «Спасибо»: сгенерировал полную «визитку» — адрес, телефон, подпись команды клиента — которых не было в контексте. Первая серьезная галлюцинация.
- gpt-4o-mini, «Сколько услуг в нем?»: ответил «6 услуг для взрослых» — неверный счет (по базе на тот момент 3 в крытой части).
- deepseek обрезался лимитом токенов в 5 ответах из 10 (многословный), лепил эмодзи и заголовки вопреки промту.
3.4. Реальные вопросы, батч 3 (вопросы 21–30, + claude-haiku, 20.06)
| Модель | Стоимость 10 | Латентность | Ключевой провал |
|---|---|---|---|
| gpt-4o-mini | $0.0064 (~16×) | 1.7 с | сказал «зимний период» 20 июня — сезонная ошибка |
| deepseek-v3.2 | $0.0067 (~15×) | 7.2 с | на «Как добраться» сгенерировал фиктивные автобусы №155–260, затем римские цифры I–CC, пока не кончились 1200 токенов (21.6 секунды) |
| claude-haiku-4.5 | $0.053 (~2×) | 5.7 с | эмодзи в каждом ответе, переспросы, вопрос про боулинг — единственный, кто нашел цены |
На нюансированной паре вопросов про боулинг (входит/не входит в билет) все три модели дали три разных ответа. deepseek-v3.2 исключен из кандидатов за галлюцинации.
3.5. V2: лечим формат промтом (30 вопросов: haiku + gpt-4.1-mini + gpt-4.1-nano, 20.06)
Добавили в промт жесткий блок «СТРОГИЕ ОГРАНИЧЕНИЯ ФОРМАТА: НЕ используй emoji... НЕ используй заголовки #...».
Результат: эмодзи 0/30 у всех трех моделей (у haiku до этого было почти 30/30). Формат-дисциплина промтом лечится полностью.
| Модель | Стоимость 30 | × дешевле | Латентность | «Уточните»-паразит | Проблемы |
|---|---|---|---|---|---|
| claude-haiku-4.5 (no-emoji) | $0.0886 | 5.1× | 3.5 с | 18/30 | переспросы вместо ответов |
| gpt-4.1-mini | $0.0274 | 16.4× | 1.2 с | 11/30 | путал социальный/детский тариф, тянул устаревшую дату прайса |
| gpt-4.1-nano | $0.0069 | 65× | 1.2 с | 11/30 | 37% вопросов игнорирует; на одном — сезонная ошибка |
Рейтинг на тот момент: gpt-4.1-mini — кандидат №1.
3.6. V3: gpt-4.1-mini с чищеным промтом (20 вопросов, 20.06)
Убрали из промта правило «односложный вопрос → уточни» (источник паразита).
- «Уточните»: 0/20 (было 23%) — правило-паразит побеждено.
- Кэширование OpenAI: 94–99% попадание в кэш статичной части промта (см. раздел 7).
- Стоимость: $0.0073 за 20 ответов.
- НО: 5 фактических ошибок из 20 — выдал 800 руб. вместо актуального прайса, трижды «в базе нет информации» там, где она была, назвал дату «до 31.12.2026» вместо «до 30.06» (в базе два прайса на разные периоды — модель выбрала не тот), посчитал «10 услуг», перечислив 9.
- Вывод: 25% фактических ошибок — в прод нельзя.
3.7. MiniMax: ценовой сюрприз прокси (3 модели, 20 вопросов)
Ожидали дешевую альтернативу. Получили обратное — через routerai MiniMax оказался ДОРОЖЕ gpt-4o:
| Модель | Стоимость 20 ответов | vs gpt-4o ($0.42) |
|---|---|---|
| minimax-01 | $2.53 | в 6 раз дороже |
| minimax-m2 | $3.63 | в 8.6 раза дороже |
| minimax-m2-her | $5.09 | в 12 раз дороже |
Качество m2 при этом приличное (1 критичная просадка из 20). Урок: тарифы прокси-агрегатора на конкретную модель надо проверять ДО тестирования — они могут радикально отличаться от цен вендора.
3.8. GPT-5.2 и GPT-5-mini, попытка 1: без reasoning_effort (22 вопроса)
- Латентность 11.6–11.9 секунды — обе модели «думают» по умолчанию (внутренний reasoning).
- gpt-5-mini: 5–8 ПУСТЫХ ответов из 22 (весь лимит токенов уходил на размышления, на ответ не оставалось).
- При этом gpt-5.2 показал класс: на обрывки «Ау???» и «Ск» дал полные полезные ответы там, где прод переспрашивал.
3.9. GPT-5.2 и GPT-5-mini, попытка 2: reasoning_effort=low (40 вопросов)
| Модель | Пустых ответов | Латентность avg / p95 | Стоимость 40 | × дешевле |
|---|---|---|---|---|
| gpt-5.2 | 0 | 5.8 с / 13 с | $0.324 | 2.5× |
| gpt-5-mini | 0 | 5.8 с / 13 с | $0.086 | 9.4× |
Параметр reasoning_effort=low полностью убрал пустые ответы. Но:
- gpt-5-mini «галлюцинировал» две услуги, которых не было в базе (см. поправку в разделе 9 — история с двойным дном), и путал текущий прайс с будущим.
- gpt-5.2 умнее всех обращался с датами (замечал, что летний прайс еще не вступил в силу), но на расчетном вопросе («номер на 2 взрослых + ребенок») ушел в «уточните».
- 5.8 секунды против 1.6 у прода — заметно для клиента.
4. Финальный марафон: 200 реальных вопросов подряд (5 июля)
Каждая модель получила одни и те же 200 последних реальных вопросов клиентов с тем же контекстом. Судья тот же. Это главная таблица всей серии:
| Модель | Критичные просадки | Галлюцинации | Отказы/пустые | Верность (prod 9.2–9.7) | Полнота (prod 7.8–8.7) | Латентность | Стоимость 200 | × дешевле |
|---|---|---|---|---|---|---|---|---|
| gpt-4o (prod, эталон) | 0 | 0 | 0 | — | — | 1.6 с | ~$4.05 (оценка) | 1× |
| gpt-4o-mini | 77 (38.5%) | 9 | 15 | 8.00 | 6.61 | ~2.5 с | ~$0.16 | ~25× |
| gpt-5.4-mini | 60 (30%) | 4 | 7 | 8.42 | 7.21 | 8.8 с | $0.395 | ~10× |
| deepseek-v4-pro | 49 (24%) | 3 | 24 (пустые!) | 7.96 | 7.57 | 12.9 с | $0.907 | ~4.5× |
| Grok 4.3 (x-ai) | 55 (28%) | 3 | 7 | 8.71 | 7.25 | 5.2 с | ~$1.8 (факт. тариф)* | ~2.2×* |
| Gemini 3 Flash Preview | 128 (64%) | 2 | 108 (!) | 4.08 | 3.61 | 6.0 с | $0.247 | ~16× |
| qwen3.7-plus | снята с теста | — | — | — | — | 46 с/ответ | — | — |
* Строка Grok исправлена задним числом: в первой редакции стояло «$0.496 и ~8×» — расчет по заниженной оценочной цене. После переключения в прод сверили фактический биллинг routerai (поле usage.cost в ответе API): реальная стоимость тех же 200 ответов ≈ $1.8, экономия ~2.2× (подробности — раздел 9, поправка 6). Стоимость остальных моделей в таблице — расчетная по прайс-листам вендоров; фактические тарифы прокси могут отличаться (проверено замером только для Grok и MiniMax).
Комментарии по каждой:
gpt-4o-mini — худший набор галлюцинаций из «рабочих» моделей: на «Спасибо большое» выдал адрес клиента; заявил «сейчас зимний период» 5 июля; «у клиента 20 услуг» (выдумал число); «Дневной+ не включает шведский стол» (включает); назвал цену номера 4500 руб. вместо 6500; в одном ответе жил в «27 октября» с прайсом «до 31.10.2023» (данные из обучения вместо контекста).
gpt-5.4-mini — лучше 4o-mini по всем осям, но унаследовал «адрес на Спасибо» и «в Семейный не входит питание». Латентность 8.8 с.
deepseek-v4-pro — лучшее качество содержимого среди дешевых (24% просадок, в 88 случаях из 200 судья счел его ответ ЛУЧШЕ прода), НО: 24 пустых ответа на простейшие вопросы («Адрес можете прислать?» → пустая строка) и 12.9 секунды на ответ. Не готов для чата.
Grok 4.3 — лучший баланс: мало галлюцинаций (3), мало отказов (7), самая высокая верность среди дешевых (8.71), терпимая латентность (5.2 с), экономия ~2× по фактическому тарифу (см. поправку 6 в разделе 9). Его галлюцинации: «терминалы есть на входе» (нет), «питание в Семейный не включено» (включено — см. раздел 9 про причину), спорная трактовка сезона услуг.
Gemini 3 Flash Preview — антирекорд: 108 из 200 ответов ПУСТЫЕ, включая «Сколько стоит?», «Есть ли кафе?». Предположительно safety-фильтры или несовместимость с длинным русскоязычным промтом через прокси. Для нашего кейса непригодна полностью.
qwen3.7-plus — 46 секунд на один ответ при реальном размере контекста (5000 токенов на входе, 1445 токенов внутренних размышлений). Снята после первого же замера.
Решение: бот переключен на Grok 4.3. На момент решения экономия оценивалась в ~12 000 руб/мес; фактическая после сверки биллинга — ~3–6 тыс руб/мес, расход ~250–350 руб/день вместо ~450 (разбор расхождения — раздел 9, поправка 6). Плата: +3.6 секунды к ответу и ~28% ответов чуть менее полные (но фактически верные).
5. Сводные наблюдения по классам моделей
- Флагман (gpt-4o): 0 критичных ошибок на 200 вопросах. Дорого, но это эталон надежности.
- Мини-модели OpenAI (4o-mini, 4.1-mini, 5-mini, 5.4-mini): дешевле в 10–25 раз, стабильный набор болезней — галлюцинации на «вежливых» репликах, путаница между несколькими прайсами, ложные отказы. Каждое поколение чуть лучше предыдущего (38.5% → 30% критичных просадок за ~год поколений).
- Reasoning-модели (gpt-5.x, deepseek-v4, qwen3.7): качество на уровне или выше, но латентность 6–46 секунд убивает чат-UX. Обязателен
reasoning_effort=low, иначе пустые ответы. - Китайские модели через прокси: deepseek v3.2 — галлюцинации списков; v4-pro — качество выросло радикально, но пустые ответы; MiniMax — ценовая ловушка прокси; qwen — латентность.
- Grok 4.3: темная лошадка, взявшая баланс. Но см. раздел 8 — «дешевая» модель потребовала обвязки.
6. Параллельные эксперименты: экономия без смены модели
До и параллельно с подбором модели крутили ручки RAG-пайплайна (все тесты — на тех же реальных вопросах с судьей):
| Эксперимент | Экономия | Качество | Вердикт |
|---|---|---|---|
| top_k 10 → 5 (меньше фрагментов в контекст) | −58% | 3/20 критичных (ложное «с 3 лет взрослый билет») | отклонено |
| top_k 10 → 7 | −27% | 1/20 критичных | принято |
| chunk_size 1500 → 1000 токенов | −36.5% | качество ВЫРОСЛО (верность 9.2 vs 8.7 — точнее единица поиска) | принято |
| chunk_size 1000 → 700 | еще −9% | 9/20 критичных (ответы-перечисления разваливаются) | отклонено |
| Rerank (top-10 → LLM-отбор → top-3) | −57% | 6/20 критичных; фундаментальный предел: если нужный чанк не попал в кандидаты — реранкер бессилен | отклонено |
| Rerank v2 (top-5 + улучшенный промт) | −7% | не лучше | отклонено |
| Router (классификатор → mini для простых → проверка → fallback на gpt-4o) | −18% (вместо ожидаемых −55%) | 73% «простых» вопросов провалили проверку и ушли в fallback; латентность до 16 с | отклонено |
| Pre-summary (сжатие чанков в 2.2 раза при индексации) | −57% input | 37% критичных просадок — сжатие съедает условия и оговорки | отклонено |
| Короткие сообщения (≤3 слов) через mini | ~−10% общего расхода | 38% критичных: «Скидки для СВО?» → mini соврал «нет скидок»; на «Спасибо большое» выдал требование справки об инвалидности | отклонено |
Ключевой промежуточный итог: только не-модельными ручками (top_k=7, chunk=1000, чистка промта с 7.5К до 3.4К знаков, точечные QA-дополнения) расход упал с ~1000 до ~450 руб/день (−55%) БЕЗ потери качества — еще до смены модели.
Отдельный вывод для статьи: «короткий вопрос ≠ простой вопрос». Гипотеза «сообщения из 2–3 слов пусть обрабатывает дешевая модель» разбилась о данные: короткие вопросы часто контекстно-зависимые и провоцируют худшие галлюцинации.
7. Инфраструктурные находки
- Кэширование промта OpenAI работает через прокси прозрачно: повторные запросы с одинаковой статичной частью промта дают 94–99% cache hit (вход дешевеет вдвое на закэшированной части). Проверка: два одинаковых вызова, у второго
cached_tokens: 1280из 1413. Важен порядок сборки промта: статичное — в начало, RAG-фрагменты — в конец. reasoning_effort=lowобязателен для GPT-5-семейства в чат-сценариях: без него — 12 секунд и пустые ответы, с ним — 0 пустых.- Цены прокси ≠ цены вендора, а расчет ≠ биллинг (кейс MiniMax: в 6–12 раз дороже gpt-4o вместо ожидаемой экономии; кейс Grok: фактический тариф в 3.5–4 раза выше нашей прикидки). routerai возвращает фактическую стоимость каждого вызова в поле
usage.costответа API — итоговую экономику сводить по нему, а не по прайс-листам. - Судья-LLM дешев (~$0.0003/сравнение) и в целом адекватен, но требует ручной перепроверки топ-кейсов и аккуратного промта (см. раздел 9, пункт про транслит).
- Смена эмбеддинг-модели (text-embedding-3-small → 3-large, в 6.5 раза дороже за токен) заметного прироста качества поиска на наших тестах не дала; расходы на эмбеддинги — копейки на фоне генерации (соотношение стоимости ~1:6000 на запрос).
8. Проверка боем: что случилось после переключения на Grok 4.3
Честная часть, без которой статья будет неполной. За первые ~2 недели на Grok случились два инцидента с ложными фактами:
- «Завтра у нас выходной» (18.07, суббота): клиент спросил «Вы завтра работаете?» — бот ответил, что выходной, хотя клиент работает ежедневно. Разбор показал: виновата не только модель — база знаний к тому моменту заросла мусорными QA-парами (владелец бота массово сохранял обрывки вопросов с ответами-заглушками), они вытеснили из поискового контекста фрагмент с графиком, а Grok доклеил бытовую ассоциацию «воскресенье = выходной». gpt-4o на этот же вопрос отвечал правильно 5 раз до этого — он устойчивее к замусоренному контексту.
- «С 12 лет — без родителей» (20.07): в контексте были ОБА правила («до 12 лет — под постоянным контролем» и «до 18 лет без сопровождения не допускаются») — Grok инвертировал первое и проигнорировал второе. Чистая ошибка рассуждения: дешевая модель делает логические инверсии там, где флагман удерживается.
Чем ответили (архитектурная обвязка вместо возврата на дорогую модель):
- Цифро-контроль (digit guard): детерминированная проверка — каждое число в ответе (цены, даты, возрасты) обязано присутствовать во входном контексте или быть арифметически выводимым. Без LLM, ноль затрат.
- Словесный guard: маркеры недоступности («выходной», «закрыт», «не работает») в ответе без подтверждения в контексте → флаг.
- Квота retrieval: максимум 3 QA-пары из 7 фрагментов контекста, документам гарантированы 4 места — мусорные пары физически не могут вытеснить прайс и график.
- Чистка «двойных стандартов» в базе знаний: аудит нашел 10 мест, где формулировки провоцируют ложные выводы (пары порогов 12/18 лет, услуги-тезки в двух зонах с разными возрастами, семейство тарифов «Плюс», которое нигде не расшифровано, условия без явного И/ИЛИ, конфликтующие цены парковки).
Тезис для статьи: дешевая модель — это не «замена в одну строку конфига». Это переезд, при котором слабые места данных и пайплайна, которые флагман молча компенсировал своим интеллектом, вылезают наружу. Экономия реальна, но она покупается инженерной обвязкой и чистотой базы знаний.
9. Поправки задним числом (важно для честности)
При финальной сверке нашли ошибки в собственных выводах — оставляем их в документе намеренно:
- «Галлюцинация» двух услуг — не галлюцинация. В июльских тестах мы записали gpt-5-mini в галлюцинаторы за упоминание двух услуг и даже вписали в промт судьи «таких услуг нет». Позже выяснилось: эти услуги реально существуют на территории клиента — их просто не было в той версии базы знаний. Модель, вероятно, знала о клиенте из обучения больше, чем наша база на тот момент.
- Клеймо «возможная галлюцинация» на claude-haiku за «вход для гостей отеля бесплатный» — тоже снято: этот факт был в базе знаний.
- Часть «галлюцинаций цен» кормили мы сами: в промте бота были захардкожены устаревшие цены (наследие ранних версий). Модели честно цитировали протухший промт, а мы считали это выдумкой. После выноса всех цен из промта в прайс-документ класс ошибок исчез.
- Судья на транслите — испорченные оценки: в одном из rerank-тестов промт судьи случайно написали транслитом — судья стал строже придираться к мелочам, и тест показал 14/20 «критичных» просадок при реальных ~3. Перепроверка вручную обязательна.
- Ошибки «в базе нет информации» у дешевых моделей часто были следствием нашего rephrase-шага, который сужал вопрос контекстом прошлых реплик («Можно ли докупить питание?» превращался в «...при социальном тарифе для многодетных семей»).
- Итоговая цифра экономии Grok была завышена расчетом по прикидочной цене. В таблице марафона стоимость Grok считалась по оценке $0.30/$1.50 за 1М токенов — фактический тариф routerai (замерен по полю
usage.cost) оказался в 3.5–4 раза выше (~$1.1 вход / ~$5.5 выход за 1М с наценкой прокси). Вдобавок Grok — reasoning-модель: даже на «скажи ок» тратит ~210 внутренних токенов размышлений, тарифицируемых как выход, а в проде на каждое сообщение добавляется rephrase-вызов той же моделью. Итог: реальный расход после переключения — ~250–350 руб/день вместо расчетных ~50–55; экономия на генерации ~2× к флагману, по дневному счету — минус 25–45% к оптимизированному gpt-4o (а не «в 8 раз»). Урок повторил MiniMax-кейс: сверяйте фактический биллинг, а не расчетные цены — мы наступили на эти грабли дважды за одну серию.
10. Главные выводы серии
- Тестировать только на своих реальных вопросах. Синтетический тест дал «все кандидаты хороши», реальные 200 вопросов — разброс от 24% до 64% критичных просадок.
- Латентность — самостоятельная метрика. Качественная модель с 13 секундами ответа (deepseek-v4-pro) проигрывает средней с 5 секундами: клиент чата не ждет.
- Флагман прощает грязные данные, дешевая модель — нет. Половина «ошибок моделей» при разборе оказалась двусмысленностями и мусором в базе знаний.
- Формат лечится промтом, факты — нет. Эмодзи и заголовки убрали одной инструкцией (30/30 → 0/30). Галлюцинации инструкциями не убираются — только данными и детерминированными проверками.
- Экономику дают и не-модельные ручки: −55% расхода получили до всякой смены модели (размер чанков, количество фрагментов, чистка промта, кэш).
- Прокси-агрегатор — проверяй цены и параметры: MiniMax дороже флагмана в 6–12 раз; фактический тариф Grok — в 3.5–4 раза выше прикидки; GPT-5 без
reasoning_effort=lowнеюзабелен. Экономику сводить по фактическому биллингу (usage.cost), не по прайс-листам. - LLM-судья работает, но не слепо: дешево масштабирует сравнение, однако сам вносит ошибки — топ-кейсы перепроверять руками.
- Итог в цифрах: расход ~1000 → ~450 руб/день оптимизацией пайплайна (−55%), далее переключение gpt-4o → Grok 4.3 — фактически ~250–350 руб/день (еще −25–45% по реальному биллингу) с компенсирующей обвязкой (guards, квоты retrieval, чистка базы). Суммарно ×3–4 к стартовой точке. Главную экономию дала оптимизация пайплайна, а не смена модели. Качество держим мониторингом инцидентов; порог возврата на флагман определен заранее.