Подробная история кейса: с чего начинали, что сделали, что экономится
Кратко. AI-студия Лютик сделала FARMA WEB — AI-агента для фармацевтической закупки. Заявку на десятки и сотни позиций кладут в одно окно фото, сканом, PDF или текстом; нейросеть разбирает строки, программа находит их в сводном прайсе дистрибьюторов, отсекает неподходящее по форме и дозировке и показывает по каждой позиции всех поставщиков с ценой, сроком годности и остатком.
Паспорт. Отрасль: оптовая закупка лекарств и медицинских изделий. Веб-приложение, поиск по прайсу на сотню тысяч предложений, нейросеть только для разбора строк заявки.
С чего начинали
Заявки на десятки и сотни позиций приходят фото, сканом или текстом с сокращениями. Каждую строку нужно найти в сводном прайсе дистрибьюторов на сотню тысяч предложений, сверить форму и дозировку и выбрать, у кого дешевле.
Что было
Каждую строку заявки искали в прайсе вручную, сверяли форму и дозировку и сравнивали поставщиков — на заявку уходили часы.
Что сделали: 7 задач
1. Лучшая цена по каждой строке заявки — среди всех поставщиков
Как было. Сводный прайс дистрибьюторов — это сто тысяч строк (в сохранённом прайсе от 20.05.2026 — 103 374 предложения). Найти один препарат у всех поставщиков и сравнить цены — ручная работа на каждую позицию, и на длинной заявке до сравнения просто не доходят руки. Сделали. Каждый подобранный товар программа разворачивает во все строки полного прайса Фармбазиса (WA35): поставщик, закупочная цена, срок годности, остаток, минимальный заказ. В шапке позиции — «лучшая цена», таблица сортируется по любой колонке, общая сортировка «Цена ↑» ставит самое дешёвое первым во всех позициях сразу. Что дало. По каждой строке заявки сразу видно, у кого дешевле. Если включить «скрыть, где остаток меньше запрошенного», лучшая цена пересчитывается только среди тех, кто может поставить нужное количество (на копии: 35,64 → 44,89, потому что у самого дешёвого на складе 25 флаконов вместо 100).
2. Нейросеть не может выдумать препарат: цифры считает программа
Как было. Ошибка в дозировке, концентрации или фасовке — это не тот товар в поставке, возврат и потерянное доверие. Обычный чат с нейросетью может уверенно «найти» позицию, которой нет в прайсе. Сделали. До нейросети программа сама отсекает строки, где не совпадают цифры: дозировка, концентрация, объём, размер, число в упаковке, стерильность, форма (ампулы против таблеток). Сама пересчитывает мкг в мг и «мг/г» в проценты для мазей и гелей. Нейросеть выбирает только из оставшихся строк — всё, чего нет в списке, код выбрасывает. Цену, остаток и срок подставляет программа из прайса, нейросеть их не видит. Что дало. В таблицу попадают строки с нужной дозировкой и формой: на копии из заявки «Кеторолак 30 мг/мл амп.» таблетки отсеяны, «Натрия хлорид 250 мл» — без флаконов 500 мл. К каждой позиции — объяснение, что принято и что отклонено.
3. Нейросеть читает несколько строк, а не весь прайс
Как было. Самый простой путь — отдать нейросети заявку и весь прайс целиком. В проекте лежит скрипт, который считал этот вариант (scripts/test-ai-price-match.ts: «полный прайс и полный заказ одним запросом»): на прайсе в десятки тысяч строк это огромный и дорогой запрос на каждую заявку. Сделали. Сначала быстрый поиск Typesense прощает опечатки, ищет по части слова и по штрихкоду и берёт до 500–1000 кандидатов на позицию. Потом жёсткие фильтры по цифрам сужают их до нескольких строк, и только они идут в нейросеть — по одному короткому запросу на позицию, по 4 позиции одновременно. Используется недорогая модель gemini-3-1-flash-lite. Оборудование и общие запросы вроде «бинты» или «шприцы» без уточнений в нейросеть не идут совсем. Что дало. На копии в нейросеть уходило по 2–4 строки-кандидата на позицию вместо всего прайса. Если человек закрыл вкладку, запросы к нейросети прерываются — за брошенный поиск не платят.
4. Фото, скан, PDF, DOCX или текст — без перепечатки
Как было. Заявки приходят как придётся — фото бланка, скан, файл Word, текст письма с сокращениями «амп», «р-р», «таб». Каждую строку менеджер перепечатывал в программу. Сделали. До 10 файлов за раз: фото до 10 МБ, PDF и DOCX до 20 МБ; DOCX сам переводится в PDF. Нейросеть сначала распознаёт текст со всех вложений, потом раскладывает каждую строку на название, форму, дозировку, концентрацию, объём, фасовку и количество. Понимает строку-заголовок «по 10 упаковок» — количество для всех строк ниже. Длинные заявки режутся на куски по 40 строк и разбираются параллельно. Что дало. Заявку не перепечатывают. На копии фото бумажной заявки на 14 позиций превратилось в 14 строк с количеством. Экран обещает 20–60 секунд на поиск; в журнале запуска 20.10.2026 два поиска заняли 50 и 53 секунды (размер заявок неизвестен).
5. Сомнительная позиция — не молча, а с пометкой «проверка»
Как было. В заявке бывают ошибки — «90×90 см» вместо «9×9 см», не та единица. Человек либо не находит позицию, либо сам догадывается, что имелось в виду. Сделали. Если по точным цифрам в прайсе пусто, программа ищет шире и просит нейросеть указать вероятную правку и уверенность. Такие строки получают метку «⚠️ проверка» и текст «Возможная правка заявки…». Ненайденная позиция получает статус «не найдено» и остаётся в списке. Что дало. Спорные места видны сразу, решение — за менеджером. Исправлений «втихую» нет.
6. Срок годности и остаток — до того, как пообещать клиенту
Как было. Товар с коротким сроком годности или нехватка на складе поставщика выясняются, когда предложение уже отправлено. Сделали. Строки со сроком годности меньше 12 месяцев подсвечены красным. Колонки «Запрошено» и «Доступно (да/нет)» сравнивают количество из заявки с остатком поставщика; галочка прячет тех, у кого не хватает. По умолчанию строки с коротким сроком стоят сверху. Что дало. Сразу видно, что можно предложить клиенту, а что — нет. Оговорка: «Доступно» сравнивает числа без учёта единиц и кратности (см. risks).
7. Оборудование в аптечной заявке — в сторону, без поиска
Как было. В заявки попадают аппарат ИВЛ, мешок Амбу, ларингоскоп, бумага для ЭКГ — то, чего в аптечном прайсе не бывает. На поиск таких строк уходит время. Сделали. Нейросеть помечает неаптечные позиции, и программа сама узнаёт по словам 13 видов больничных позиций. Такие строки показываются отдельной карточкой с причиной и не ищутся. Кислородные баллоны — исключение, их ищут. Что дало. Неаптечное видно сразу, на него не тратятся поиск и запросы к нейросети.
Что экономит и приносит деньги
- Закупка по самой выгодной цене. По каждой позиции видны все поставщики и лучшая цена; сортировка по цене — в один щелчок, с учётом того, хватит ли остатка. Оценка: экономия = (цена, по которой взяли бы без сравнения − лучшая цена) × объём. Разброс цен между поставщиками в реальном прайсе мы не считали (данные заказчика не открывали).
- Меньше поставок не того товара. Дозировка, концентрация, объём, размер и форма сверяются программой по цифрам; нейросеть не может предложить строку, которой нет в прайсе. Оценка: каждая пойманная ошибка — минус возврат, пересорт и повторная доставка; сколько ошибок было до системы, неизвестно.
- Дешёвые запросы к нейросети. В нейросеть уходят несколько строк-кандидатов на позицию, а не весь прайс; модель — из недорогих (gemini-3-1-flash-lite); оборудование и общие товары в неё не идут; брошенный поиск прерывается. Оценка: текста в запросе в сотни раз меньше, чем при подходе «весь прайс в нейросеть», который команда проверяла скриптом. Счёт за нейросеть мы не видели.
- Не нужна отдельная программа-коробка. Система — надстройка над Фармбазисом, через который заказчик и так получает прайс поставщиков: прайс берётся по его же API. Оценка: абонплата за новую учётную систему — ноль; остаются сервер и оплата нейросети.
- Больше заявок теми же людьми. Перепечатка и поиск по прайсу уходят к программе, у менеджера остаются проверка и выбор. Оценка: если заявка обрабатывалась часами, а теперь — минутами с проверкой, тот же менеджер успевает в разы больше заявок; число заявок и менеджеров неизвестно.
Что экономит время
- Перенести заявку в работу. Фото, скан, PDF или DOCX разбираются сами, до 10 файлов за раз. Оценка: 10–20 минут перепечатки на заявку в 15–20 строк → 0.
- Найти позиции в прайсе. Поиск с опечатками и сокращениями по всем позициям сразу. Оценка: 1–3 минуты на строку вручную → вся заявка за 20–60 секунд по обещанию экрана; в журнале 20.10.2026 — около 50 секунд на поиск.
- Сравнить поставщиков. Все предложения по позиции в одной таблице, сортировка по цене. Оценка: 1–2 минуты на позицию → секунды.
- Проверить срок и остаток. Красная подсветка срока меньше года, колонка «Доступно», галочка «скрыть, где не хватает». Оценка: минута на позицию → взгляд на таблицу.
- Отсеять оборудование. Неаптечные позиции откладываются карточкой с причиной до поиска. Оценка: несколько минут на каждую такую строку → 0.
Где проходит наша граница
Мы отвечаем за то, что агент находит позиции по прайсу, отсекает неподходящие по цифрам и правильно показывает цену, срок и остаток. Сомнительные позиции помечены «проверка» — решение за менеджером. Ролик снят на копии с вымышленным прайсом и заявкой.
Частые вопросы
Что делает FARMA WEB?
Разбирает заявку на лекарства из фото, скана, PDF или текста и по каждой строке показывает всех поставщиков из прайса с ценой, сроком годности и остатком.
Может ли нейросеть ошибиться в цене?
Нет: нейросеть только выбирает подходящие строки прайса, а цену, остаток и срок подставляет программа.
Что с позициями, которых нет в прайсе?
Они отмечены отдельно, а сомнительные совпадения — пометкой «проверка», чтобы решил менеджер.