Введение
Низамов Илья поделился опытом разработки небольшого, но важного компонента крупного проекта по анализу среднего чека. Если чек клиента ниже заданной суммы, его обрабатывает ИИ‑бот. Для этого нужно быстро и корректно группировать товары из прайса.
Проблема группировки товаров
Одинаковые по смыслу товары у разных поставщиков часто попадают в разные группы или вовсе не попадают в нужную. Прайс меняется часто, поставщиков много, а обработка 20 000 позиций через LLM может занять много времени. Локальная модель qwen3-4b справляется, но даже она медленнее, чем готовая модель spaCy.
Подход к решению
Для подготовки датасета использовалась схема Structured Output и модель qwen3-4b. Затем обучена модель spaCy, которая обрабатывает 20 000 позиций менее чем за минуту. В качестве примера показан формат разметки:
class LabelSpan(BaseModel):
"""Представление одной размеченной сущности в тексте."""
label: Literal["PRODUCT_TYPE"] = Field(description="Категория характеристики")
text: str = Field(
description="Фрагмент исходного текста, соответствующий этой характеристике"
)
start: int = Field(description="Начальный индекс фрагмента в тексте (включительно)")
end: int = Field(description="Конечный индекс фрагмента в тексте (не включительно)")
class ProductDataExtraction(BaseModel):
"""Схема для извлечения характеристик товара из строки."""
text: str = Field(
description="Исходный текст, из которого извлекаются характеристики"
)
labels: List[LabelSpan] = Field(
description="Список извлечённых характеристик с позициями и категориями"
)
Пример разметки товара
{
"type": "пресс гидравлический",
"model": "ПГРс-300",
"brand": "КВТ",
"article": "49627"
}
Обучение и дообучение модели
Для обучения использовались Razen 3600X + NVidia 3080Ti, процесс занял один день. После первичного обучения модель можно быстро дообучать на новых данных благодаря автоматическому разметке и подготовке датасета. Это позволяет легко адаптировать сервис под изменяющийся прайс.
Аугментация данных
Важно проводить аугментацию и перемешивание датасета, иначе нейронная сеть быстро переобучается и теряет способность обрабатывать реальные данные.
Развертывание и интеграция
Сервис построен на FastAPI и упакован в Docker, что позволяет развернуть его на любой системе одной командой. В 1С можно импортировать полученные характеристики после нормализации.
Гибкость и масштабируемость
Изначально сервис разрабатывался для локальных моделей, но легко переключается на облачные LLM. Это делает его пригодным для различных сценариев использования.
Вывод
Таким образом, сочетание LLM для подготовки датасета, spaCy для быстрой разметки и FastAPI/Docker для развертывания позволяет быстро и эффективно группировать товары по прайсу, даже при частых изменениях цен и большом количестве поставщиков.
