Задача
Косметический рынок устроен так, что покупатель не может проверить обещание. На упаковке написано «сужает поры», внутри может быть актив в нерабочей концентрации или вообще ничего по этой задаче. Состав по INCI напечатан мелким шрифтом на латыни и для обычного человека нечитаем.
Отсюда требования, каждое из которых меняет архитектуру:
- состав нужно получить без ручного ввода — иначе сервисом не будут пользоваться в магазине у полки; значит штрихкод, фотография упаковки и распознавание текста;
- компонент оценивается с учётом позиции в списке — вещество в начале списка и в конце это разные концентрации и разный эффект;
- оценка должна быть персональной — один и тот же состав хорош для жирной кожи и плох для сухой чувствительной;
- нужны взаимодействия — и внутри одного средства, и между средствами, которыми человек пользуется одновременно;
- за каждым утверждением должен стоять источник — иначе сервис ничем не отличается от блогерского мнения;
- каталог должен обновляться автоматически — бренды выпускают и переформулируют средства постоянно, вручную это не поддерживается.
Решение
Справочник компонентов — ядро сервиса. Карточка компонента содержит название по INCI, синонимы, бытовое название и класс; рабочую концентрацию и оптимум, отдельно для чувствительной кожи; условия устойчивости — кислотность, свет, температуру; совместимость с типами кожи. Главное в ней — две сети связей. Первая, «компонент — проблема»: для каждой проблемы указаны механизм действия, уровень доказательности и список источников. Вторая — взаимодействия с другими компонентами: синергия, конфликт или нейтральность, с пояснением почему. Уровень подтверждения разведён на клинические исследования, лабораторные работы и обзоры, отдельные наблюдения и данные производителя. Поэтому тон ответа зависит от доказательств: сервис пишет «здесь эффект подтверждён» или «здесь данных недостаточно».
Формула оценки. Итог собирается из концентраций активов, оценённых по позиции в списке INCI, их синергии внутри состава, силы связи каждого актива с каждой проблемой, весов проблем из профиля пользователя и штрафов за нежелательные для него компоненты. Профиль строится из анкеты. В ней вопросы о коже (тип, чувствительность, беспокоящие проблемы, реакции в прошлом) и об обстоятельствах: возрастная группа, беременность и кормление, климат и сезон, назначения врача. Для беременных действует отдельный набор ограничений, который перекрывает обычную логику оценки.
Полка. Пользователь ведёт список того, чем пользуется сейчас, с разбивкой на утро и вечер. Полка нужна, чтобы ловить конфликты между средствами. Хорошее средство может давать раздражение в паре с другим, и увидеть это можно только по всему набору.
Сравнение всегда под задачу. У полки вопрос «что из этих двух» задают чаще, чем «что вообще есть». Одно и то же средство выигрывает по порам и проигрывает по увлажнению, поэтому пользователь выбирает проблему, и обе оценки пересчитываются под неё. В сравнении видны ключевые активы и их концентрации, риски, цена за миллилитр и текстовый вывод, который объясняет разницу словами, в том числе когда средства решают задачу по-разному.
Парсеры и их поломки. Каталог собирается по сайтам брендов и магазинов, для каждого бренда своё правило разбора. Источники разного качества: где-то состав опубликован текстом и забирается напрямую, где-то лежит картинкой и идёт в распознавание с заметно меньшей точностью, где-то его нет вовсе. Когда бренд меняет вёрстку, правило молча перестаёт находить состав, поэтому нужен мониторинг прогонов и явный статус «сломан» вместо тихой пустоты. Один и тот же артикул через год может иметь другой состав, и для каждого состава фиксируется дата получения. Один ингредиент пишут по-разному. Синонимы сводятся к канонической записи: без этого связи с проблемами не срабатывают и хороший состав получает заниженную оценку.
Замкнутый контур обучения. Всё, что разобрано неуверенно, попадает в кураторскую очередь к химику-технологу. Его правки и случаи, где модель разошлась с экспертом, идут обратно в обучающую выборку. Качество отслеживается отдельно: точность распознавания составов, совпадение оценки модели с экспертной, доля ошибок в концентрациях, объём ручных правок за период.
Стек. Ядро сервиса, каталог, профили и админка — Laravel и PHP, интерфейс сайта — Vue.js, в проекте также Magento. Разбор составов, распознавание текста с упаковки и модель оценки — Python и машинное обучение. Мобильное приложение под iOS и Android даёт три пути к разбору: штрихкод, фотографию состава и ручной ввод текстом.
Результат
Покупатель получает у полки проверяемый ответ, которого рынок ему не даёт. По составу: список по INCI в исходном порядке, оценка концентрации каждого компонента, функция простым языком, пометки «актив», «нейтральный», «спорный». Лично для него: общая оценка под профиль, отдельная шкала по каждой проблеме, предупреждения о конфликте с полкой и о нежелательных компонентах. За каждым ключевым утверждением указано количество работ.
Подбор начинается с проблемы: фильтры по проблеме, типу средства, цене и доказательности, автоматическое исключение нежелательных компонентов из профиля. Средства с такими компонентами остаются в выдаче: они опускаются ниже и получают пометку, а решение принимает человек.
Химик-технолог получил машиночитаемую форму для своей экспертизы: знание о механизмах, концентрациях и взаимодействиях ложится в справочник без потерь и сразу работает в оценке. Контент-оператору досталась админка сбора данных: состояние каждого парсера, качество разбора, очередь на человека и метрики модели.