Коротко
Автор создал открытый прототип чат-помощника для магазина подарков: Qwen 3.5 9B понимает запросы и ранжирует товары, а обычный код фильтрует каталог, применяет скидки и считает корзину. В шести тестовых разговорах такая схема не ошиблась с суммами и бюджетом, тогда как вариант, где модель сама выполняла операции, показал заметные сбои.
Контекст
Автор репозитория nmrcs/cart-agent собрал демонстрационный магазин и помощника, чтобы показать, как безопаснее разделять языковые задачи модели и точные операции. Проблема исходного подхода — риск, что модель выдумает товары, неверно посчитает цены или заявит об изменении корзины, которого не было. Проект открыт под лицензией MIT; каталог и магазин моковые.
Главное
- Использована Qwen 3.5 9B в 4-битной версии через LM Studio; модель занимает около 6 ГБ и тестировалась на MacBook M3 Max.
- Монорепозиторий nmrcs/cart-agent включает NestJS 11, Prisma 7, PostgreSQL, React 19, Vite, HeroUI и общие схемы Zod; лицензия — MIT.
- Восемь стадий обработки, но только три используют модель: разбор запроса, ранжирование и текст ответа; фильтрация, цены, корзина и проверки выполняются кодом.
- Каталог содержит 64 товара, включая позиции с ограничениями по возрасту, наличию и доставке; расходники исключены из подбора подарков.
- Модель получает только допустимые id товаров, а схема ответа ограничивает выбор пятью вариантами; код затем соблюдает бюджет и пропускает слишком дорогие позиции.
- Дату из фразы вроде «Monday» извлекает модель, но календарное число и число рабочих дней определяет код.
- Скидка магазина — 20%, если день рождения в ближайшие 5 рабочих дней; решение о скидке принимает бэкенд, а не модель.
- Суммы в тексте сверяются с данными бэкенда; при неподтверждённой сумме вместо ответа модели отправляется шаблон.
- Harness затратил медианно 9 850 токенов и 40 секунд на разговор; вариант с самостоятельными действиями модели — 22 620 токенов и 26 секунд.
- Во время тестов исправлялись ошибки шаблона сообщений, ложные предположения об интересах, путаница с «second one» и разбором цены с десятичной точкой.
Как сделано
Приложение состоит из NestJS 11/Prisma 7/PostgreSQL-бэкенда, harness-помощника, React 19/Vite/HeroUI-фронтенда и общих Zod-контрактов. Модель — Qwen 3.5 9B в 4-битной квантизации через LM Studio, около 6 ГБ; запускали на MacBook M3 Max. Настройки позволяют заменить LM Studio любым OpenAI-совместимым API.
Обработка сообщения разбита на восемь стадий: модель извлекает параметры в JSON; код задаёт недостающие вопросы из конфига; SQL фильтрует товары по наличию, возрасту, бюджету и сроку доставки; модель ранжирует максимум пять товаров из разрешённого списка, причём schema ограничивает slug перечнем допустимых id; код укладывает выбор в бюджет; бэкенд берёт цены и считает итог; модель формулирует ответ; код проверяет суммы и запрещённые формулировки. Даты и рабочие дни рассчитывает код, а не модель.
Бэкенд авторитетен для цен, скидок и корзины. Для скидки на день рождения он сам проверяет правило «20% при дне рождения в ближайшие 5 рабочих дней». Изменения предложения сначала не меняют корзину: фактические операции подтверждаются отдельно. Запросы к магазину сведены к поиску с фильтрами и расчёту суммы; вопросы и пороги задаются настройками.
Результаты
Каталог содержит 64 товара; в тестовых запросах SQL-выборка составляла от 1 до 36 подходящих позиций из 58 рассматривавшихся товаров. В шести разговорах harness не допустил неверных сумм или превышения бюджета; правки выполнены верно в 13 случаях из 13, до корзины дошли 6 разговоров из 6. В сравнении «модель сама» было 3 разговора с ошибками суммы/бюджета, 1 случай товара вне каталога, 4 незапрошенных добавления и 3 ложных заявления об изменении корзины; корректно выполнены 9 из 11 правок, до корзины дошли 4 из 6.
Медиана токенов на разговор: 9 850 у harness против 22 620 у самостоятельной модели; медианное время — 40 против 26 секунд. По отдельным стадиям медианы модельных вызовов составляли около 3,3 с на разбор, 4,3 с на выбор и 2 с на ответ; кодовые операции занимали примерно 30 мс.
Ограничения
Проверка охватывает только шесть сценариев и использует скрипт с заранее подготовленными ответами вместо реальных покупателей; результаты не доказывают надёжность в производстве. Время и качество измерены на конкретной модели и конфигурации, а автор отмечает дополнительные задержки от трёх последовательных вызовов модели. Контекст диалога хранится только в памяти и теряется при перезапуске, хотя корзина остаётся в базе. Модель всё ещё ошибается в неоднозначных запросах и формулировках, поэтому нужны проверки и шаблонные ответы; скидочное правило и моковый каталог демонстрационные.
Что взять себе
- Поручайте модели понимание естественного языка и объяснения, но расчёты, фильтрацию каталога и изменение состояния системы оставляйте обычному коду.
- Ограничивайте ответы структурированными схемами и списками разрешённых идентификаторов; проверяйте итоговые цены по источнику данных.
- Разделяйте предложение товаров и фактическое изменение корзины: подтверждение и действие должны быть явными.
- Тестируйте не только правильные суммы, но и ложные заявления модели, неоднозначные команды, промокоды и пограничные даты.
- Учитывайте компромисс: несколько коротких вызовов могут снизить расход токенов и ошибки, но увеличить задержку.
Читать оригинал, если…
Откройте оригинал, если нужны исходники nmrcs/cart-agent, таблица замеров, схемы запросов или подробности реализации проверок и обработки ошибок.